javaee论坛

普通会员

225648

帖子

334

回复

348

积分

楼主
发表于 2019-10-30 09:48:56 | 查看: 362 | 回复: 0

表t_account:

表t_user:

功能实现类

/***实现类*@author郑清*/publicclassUserDaoImplimplementsIUserDao{@Overridepublicvoidadd(Useruser){//TODOAuto-generatedmethodstubConnectionconnection=null;PreparedStatementps=null;try{//1.加载驱动//2.获取连接:与数据库建立连接connection=JDBCUtil.instance.getConnection();//3.使用预编译对象PreparedStatement实现添加,特点:创建PreparedStatement对象时,就指定了sql语句发送到dbms进行编译//4.执行sql语句(注意:当3.中编译语句执行的时候不需要传sqldbms会直接运行编译后的sql语句)Stringsql="insertintot_user(username,password)values(?,?);";//?==>占位符ps=connection.prepareStatement(sql);ps.setString(1,user.getUsername());//占位符?从1开始ps.setString(2,user.getPassword());ps.executeUpdate();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//5.释放资源(注意:关闭资源顺序先打开后关闭)JDBCUtil.instance.close(connection,ps,null);}}@Overridepublicvoiddelete(intid){//TODOAuto-generatedmethodstubConnectionconnection=null;PreparedStatementps=null;try{//1.加载驱动//2.获取连接:与数据库建立连接connection=JDBCUtil.instance.getConnection();//3.使用预编译对象PreparedStatement实现删除,特点:创建PreparedStatement对象时,就指定了sql语句发送到dbms进行编译//4.执行sql语句(注意:当3.中编译语句执行的时候不需要传sqldbms会直接运行编译后的sql语句)Stringsql="deletefromt_userwhereid=?;";//?==>占位符ps=connection.prepareStatement(sql);ps.setInt(1,id);//占位符?从1开始ps.executeUpdate();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//5.释放资源(注意:关闭资源顺序先打开后关闭)JDBCUtil.instance.close(connection,ps,null);}}@Overridepublicvoidupdate(Useruser){//TODOAuto-generatedmethodstubConnectionconnection=null;PreparedStatementps=null;Stringsql="updatet_usersetusername=?,password=?whereid=?;";//?==>占位符try{//1.加载驱动//2.获取连接:与数据库建立连接connection=JDBCUtil.instance.getConnection();//3.使用预编译对象PreparedStatement实现更新,特点:创建PreparedStatement对象时,就指定了sql语句发送到dbms进行编译//4.执行sql语句(注意:当3.中编译语句执行的时候不需要传sqldbms会直接运行编译后的sql语句)ps=connection.prepareStatement(sql);ps.setString(1,user.getUsername());//占位符?从1开始ps.setString(2,user.getPassword());ps.setInt(3,user.getId());ps.executeUpdate();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//5.释放资源(注意:关闭资源顺序先打开后关闭)JDBCUtil.instance.close(connection,ps,null);}}@OverridepublicUserqueryOne(intid){//TODOAuto-generatedmethodstubConnectionconnection=null;PreparedStatementps=null;Stringsql="select*fromt_userwhereid=?;";ResultSetrs=null;Useruser=null;try{//1.加载驱动//2.获取连接:与数据库建立连接connection=JDBCUtil.instance.getConnection();//3.使用预编译对象PreparedStatement实现查找,特点:创建PreparedStatement对象时,就指定了sql语句发送到dbms进行编译//4.执行sql语句(注意:当3.中编译语句执行的时候不需要传sqldbms会直接运行编译后的sql语句)ps=connection.prepareStatement(sql);ps.setInt(1,id);//占位符?从1开始rs=ps.executeQuery();while(rs.next()){user=newUser();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//5.释放资源(注意:关闭资源顺序先打开后关闭)JDBCUtil.instance.close(connection,ps,rs);}returnuser;}@OverridepublicList<User>queryAll(){//TODOAuto-generatedmethodstub//1.加载驱动//2.获取连接:与数据库建立连接Connectionconnection=JDBCUtil.instance.getConnection();PreparedStatementps=null;Stringsql="select*fromt_user;";ResultSetrs=null;List<User>userList=newArrayList<>();try{//3.使用预编译对象PreparedStatement实现查找,特点:创建PreparedStatement对象时,就指定了sql语句发送到dbms进行编译//4.执行sql语句(注意:当3.中编译语句执行的时候不需要传sqldbms会直接运行编译后的sql语句)ps=connection.prepareStatement(sql);rs=ps.executeQuery();while(rs.next()){Useruser=newUser();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));userList.add(user);}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//5.释放资源(注意:关闭资源顺序先打开后关闭)JDBCUtil.instance.close(connection,ps,rs);}returnuserList;}//Statement方式username+passwordpublicUserlogin1(Stringusername,Stringpassword){Connectionconnection=JDBCUtil.instance.getConnection();Statementstatement=null;ResultSetrs=null;Useruser=null;try{Stringsql="select*fromt_userwhereusername='"+username+"'andpassword='"+password+"'";System.out.println(sql);statement=connection.createStatement();rs=statement.executeQuery(sql);while(rs.next()){user=newUser();user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtil.instance.close(connection,statement,rs);}returnuser;}//Statement方式usernamepublicUserlogin2(Stringname){Connectionconnection=JDBCUtil.instance.getConnection();Statementstatement=null;ResultSetrs=null;Useruser=null;try{Stringsql="select*fromt_userwhereusername='"+name+"';";System.out.println(sql);statement=connection.createStatement();rs=statement.executeQuery(sql);while(rs.next()){user=newUser();user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtil.instance.close(connection,statement,rs);}returnuser;}//Statement方式username+password==>验证sql注入问题【用户传入的数据,决定了sql拼接的结果】publicUserlogin3(Stringusername,Stringpassword){Connectionconn=JDBCUtil.instance.getConnection();Statementstatement=null;ResultSetrs=null;Useruser=null;try{Stringsql="select*fromt_userwhereusername='"+username+"'andpassword='"+password+";";System.out.println(sql);statement=conn.createStatement();rs=statement.executeQuery(sql);while(rs.next()){//rs拿出了表中的所有数据user=newUser();user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtil.instance.close(conn,statement,rs);}returnuser;}//PreparedStatement方式username+password==>解决sql注入问题【用户传入的数据,决定了sql拼接的结果】publicUserlogin4(Stringusername,Stringpassword){Connectionconn=JDBCUtil.instance.getConnection();PreparedStatementps=null;ResultSetrs=null;Useruser=null;try{Stringsql="select*fromt_userwhereusername=?andpassword=?;";System.out.println(sql);ps=conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);//'154562'or1=1orrs=ps.executeQuery();while(rs.next()){//rs拿出了表中的所有数据user=newUser();user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtil.instance.close(conn,ps,rs);}returnuser;}//事务问题,同生共死(即一组操作同时生同时死)/**1.InnoDB:自动提交事物:都可以正常的提交事务,该减减该加加*2.InnoDB:自动提交事物:*添加了异常代码:发现,减的减了,但是因为异常,加的没有执行*3.InnoDB:设置手动提交事物:*1.不添加异常:都正常执行了*2.添加异常:没减也没加*4.InnoDB:设置手动提交事物:解释了什么叫做一组操作,引出了必须要回滚事务*5.数据库的存储引擎,InnoDB支持事务【如果支持事务控制数据库必须是InnoDB】MyISAM不支持事务*MyISAM验证不支持事务:*1.把conn.setAutoCommit(false);//手动提交*2.执行过程中设计了异常*3.事务都是手动提交的,发现出现异常:肯定没有提交,*发现,数据库中的数据已经变化了,而且回滚也没有效果*/publicvoidtransaction(){Connectionconnection=JDBCUtil.instance.getConnection();PreparedStatementps=null;try{connection.setAutoCommit(false);//设置手动提交Stringsql="updatet_accountsetmoney=money-100whereusername='大熊';";ps=connection.prepareStatement(sql);ps.executeUpdate(sql);System.out.println(1/0);//此处会出现异常作用:测试手动提交时遇到异常无法执行下一步的操作时进行事务的数据回滚sql="updatet_accountsetmoney=money+100whereusername='包租公';";ps.executeUpdate(sql);connection.commit();//提交事务}catch(Exceptione){try{connection.rollback();//如果操作失败比如遇到异常则进行事务的数据回滚}catch(SQLExceptione1){e1.printStackTrace();}e.printStackTrace();}finally{JDBCUtil.instance.close(connection,ps,null);}}//方式一:Statement向用户表t_user中添加一个用户【拿到这个用户的主键】把这个主键添加到t_account表publicvoidgetPrimaryKeyByStatement(){Connectionconn=JDBCUtil.instance.getConnection();Statementstatement=null;ResultSetrs=null;try{Stringsql="insertintot_user(username,password)values('哆啦A梦','123456');";statement=conn.createStatement();//返回操作了多少条数据intrownum=statement.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);//RETURN_GENERATED_KEYS:该常量指示生成的键应该可用于获取。System.out.println(rownum);//修改的行数//Statement拿到主键的方式:rs=statement.getGeneratedKeys();//getGeneratedKeys():获取由于执行此Statement对象而创建的所有自动生成的键。while(rs.next()){longkey=rs.getInt(1);System.out.println(key);sql="insertintot_account(id,username)values("+key+",'t_user中拿到的id');";}statement.executeUpdate(sql);}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{JDBCUtil.instance.close(conn,statement,rs);}}//方式二:PreparedStatement向用户表t_user中添加一个用户【拿到这个用户的主键】把这个主键添加到t_account表publicvoidgetPrimaryKeyByPreparedStatement(){Connectionconn=JDBCUtil.instance.getConnection();PreparedStatementps=null;ResultSetrs=null;try{Stringsql="insertintot_user(username,password)values(?,?);";ps=conn.prepareStatement(sql,ps.RETURN_GENERATED_KEYS);//RETURN_GENERATED_KEYS:该常量指示生成的键应该可用于获取ps.setString(1,"奥特曼");ps.setString(2,"123456");intrownum=ps.executeUpdate();System.out.println(rownum);//修改的行数//拿到主键rs=ps.getGeneratedKeys();//getGeneratedKeys():获取由于执行此Statement对象而创建的所有自动生成的键while(rs.next()){longkey=rs.getInt(1);System.out.println(key);sql="insertintot_account(id,username)values("+key+",'t_user中拿到的id');";}ps.executeUpdate(sql);}catch(SQLExceptione){e.printStackTrace();}finally{JDBCUtil.instance.close(conn,ps,rs);}}}

接口类:

/***接口类*@author郑清*/publicinterfaceIUserDao{voidadd(Useruser);voiddelete(intid);voidupdate(Useruser);UserqueryOne(intid);List<User>queryAll();}

测试类:

/***使用Junit4测试数据库的增删改查*测试PreparedStatement的安全性*测试事务*获取主键*@author郑清*/publicclassUserDaoTest{UserDaoImpluserDao=newUserDaoImpl();@TestpublicvoidtestAdd(){Useruser=newUser();user.setUsername("小猪佩奇");user.setPassword("123456");userDao.add(user);}@TestpublicvoidtestUpdate(){Useruser=newUser();user.setId(13);user.setUsername("大熊");user.setPassword("488646");userDao.update(user);}@TestpublicvoidtestDelete(){userDao.delete(16);}@TestpublicvoidtestQueryOne(){Useruser=userDao.queryOne(3);System.out.println(user);}@TestpublicvoidtestQueryAll(){List<User>users=userDao.queryAll();for(Useruser:users){System.out.println(user);}}//===============testLogin3和testLogin4测试PreparedStatement的安全性=============================@TestpublicvoidtestLogin1(){Stringusername="李四";Stringpassword="123456";Useruser=userDao.login1(username,password);if(user==null){System.out.println("登陆失败:用户名或者密码错误!!!");}else{System.out.println("登陆成功!!!");}}@Test//注意:如果只通过账户名查询对象,除了验证对象必须验证密码是否正确publicvoidtestLogin2(){Stringusername="李四2";Stringpassword="123456";//从数据库里面根据账户查询数据,返回一个对象Useruser=userDao.login2(username);//必须堆账户及密码验证,否则仅验证查询的,如果密码错了也是可以登陆的if(user==null||!user.getPassword().equals(password)){System.out.println("登陆失败:用户名或者密码错误!!!");}else{System.out.println("登陆成功!!!");}}@Test//Statement:存在sql注入的问题publicvoidtestLogin3(){Stringusername="李四";Stringpassword="645456'or1=1or''";Useruser=userDao.login3(username,password);if(user==null){System.out.println("登陆失败:用户名或者密码错误!!!");}else{System.out.println("登陆成功!!!");}}@Test//使用preparedStatement解决sql注入的问题publicvoidtestLogin4(){Stringusername="李四";Stringpassword="645456'or1=1or''";Useruser=userDao.login4(username,password);if(user==null){System.out.println("登陆失败:用户名或者密码错误!!!");}else{System.out.println("登陆成功!!!");}}@Test//测试事务问题,同生共死(即一组操作同时生同时死)publicvoidtestTransaction(){userDao.transaction();}@Test//方式一:StatementpublicvoidtestGetPrimaryKeyByStatement(){userDao.getPrimaryKeyByStatement();}@Test//方式二:PreparedStatementpublicvoidtestGetPrimaryKeyByPreparedStatement(){userDao.getPrimaryKeyByPreparedStatement();}}

工具类:

/***工具类:*抽取公共部分,做单例模式*DBCP方式实现连接池、配置连接池==>获得连接对象*@author郑清*/publicenumJDBCUtil{instance;privatestaticPropertiesp=newProperties();//privatestaticBasicDataSourceds=newBasicDataSource();//获得连接池对象方式1privatestaticDataSourceds=null;//获取连接池对象方式2//加载驱动static{//当用到该工具类的时候,会自动加载驱动try{//读取配置文件db.propertiesp.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));//加载驱动/*//获得连接池对象方式1ds.setDriverClassName(p.getProperty("driverClassName"));ds.setUsername(p.getProperty("username"));ds.setPassword(p.getProperty("password"));ds.setUrl(p.getProperty("url"));*///连接池可以配置,初始化的连接数量,最大连接数量,最小连接数量等等//获取连接池对象方式2[注意:配置文件(db.properties)里驱动,url数据库用户名、密码必须规范!!]ds=BasicDataSourceFactory.createDataSource(p);}catch(Exceptione){e.printStackTrace();}}//获取连接:与数据库建立连接publicConnectiongetConnection(){//没有static:应该通过对象(枚举对象instance)调用该方法try{returnds.getConnection();//通过连接池对象ds获取连接}catch(Exceptione){e.printStackTrace();}returnnull;}//释放资源(注意:关闭资源顺序先打开后关闭)publicvoidclose(Connectionconnection,Statementstatement,ResultSetrs){try{if(rs!=null)rs.close();}catch(SQLExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}finally{try{if(statement!=null)statement.close();}catch(SQLExceptione){e.printStackTrace();}finally{try{if(connection!=null)connection.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}}

实体类:

/***用户账号实体类*@author郑清*/publicclassUser{privateintid;privateStringusername;privateStringpassword;publicUser(){}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}@OverridepublicStringtoString(){return"User[id="+id+",username="+username+",password="+password+"]";}}

 


您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017