重新学习QueryRunner
虽然很菜,也要摇摇晃晃的上路。17:51:54 2017-04-11
其实QueryRunner主要还是在jdbc的基础上进行了一些封装,以前看的迷迷糊糊,今天重新学习理解了一下,记下来帮助学习。
使用的C3P0连接池,通过jdbcUtils工具类来获得连接池对象。
-
1 package cn.itcast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.SQLException; 5 6 import javax.sql.DataSource; 7 8 import com.mchange.v2.c3p0.ComboPooledDataSource; 9 10 public class JdbcUtils { 11 // 配置文件的默认配置!要求你必须给出c3p0-config.xml!!! 12 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 13 14 /** 15 * 使用连接池返回一个连接对象 16 * @return 17 * @throws SQLException 18 */ 19 public static Connection getConnection() throws SQLException { 20 return dataSource.getConnection(); 21 } 22 23 /** 24 * 返回连接池对象! 25 * @return 26 */ 27 public static DataSource getDataSource() { 28 return dataSource; 29 } 30 }
-
原始版本,这时还是用的jdbc得preparedStatement
1 package cn.itcast.dbutils; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.junit.Test; 9 10 import cn.itcast.jdbc.JdbcUtils; 11 12 public class Demo1 { 13 @Test 14 public void fun1(Stu stu){ 15 Connection con = null; 16 try{ 17 con = JdbcUtils.getConnection(); 18 System.out.println(con); 19 }catch(Exception e){ 20 21 }finally{ 22 23 } 24 } 25 //添加 26 @Test 27 public void addStu(Stu stu){ 28 Connection con = null; 29 PreparedStatement pstmt = null; 30 try { 31 con = JdbcUtils.getConnection(); 32 String sql = "insert into t_stu values (?,?,?,?)"; 33 pstmt = con.prepareStatement(sql); 34 pstmt.setInt(1, stu.getSid()); 35 pstmt.setString(2, stu.getSname()); 36 pstmt.setInt(3, stu.getAge()); 37 pstmt.setString(4, stu.getGender()); 38 // pstmt.setInt(1, 1); 39 // pstmt.setString(2, "张三"); 40 // pstmt.setInt(3, 16); 41 // pstmt.setString(4, "男"); 42 pstmt.executeUpdate(); 43 } catch (SQLException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 }finally{ //关闭 47 48 } 49 } 50 //更新操作 51 @Test 52 public void updateStu(Stu stu){ 53 Connection con = null; 54 PreparedStatement pstmt = null; 55 try { 56 con = JdbcUtils.getConnection(); 57 String sql = "update t_stu set sname=?,age=?,gender=? where sid=?"; 58 pstmt = con.prepareStatement(sql); 59 pstmt.setInt(4, stu.getSid()); 60 pstmt.setString(1, stu.getSname()); 61 pstmt.setInt(2, stu.getAge()); 62 pstmt.setString(3, stu.getGender()); 63 pstmt.executeUpdate(); 64 } catch (SQLException e) { 65 // TODO Auto-generated catch block 66 e.printStackTrace(); 67 }finally{ //关闭 68 69 } 70 } 71 //删除操作 72 @Test 73 public void deleteStu(int sid){ 74 Connection con = null; 75 PreparedStatement pstmt = null; 76 try { 77 con = JdbcUtils.getConnection(); 78 String sql = "delete from t_stu where sid=?"; 79 pstmt = con.prepareStatement(sql); 80 pstmt.setInt(1, sid); 81 pstmt.executeUpdate(); 82 } catch (SQLException e) { 83 // TODO Auto-generated catch block 84 e.printStackTrace(); 85 }finally{ //关闭 86 87 } 88 } 89 //从表中查找返回一个对象 90 public Stu load(int sid){ 91 Connection con = null; 92 PreparedStatement pstmt = null; 93 ResultSet rs = null; 94 try { 95 con = JdbcUtils.getConnection(); 96 97 String sql = "select * from t_stu where sid=?"; 98 99 pstmt = con.prepareStatement(sql); 100 pstmt.setInt(1, sid); 101 System.out.println("看看"); 102 rs = pstmt.executeQuery(); //返回结果集 103 System.out.println(rs); 104 if(!rs.next()) return null; //当结果集的内容为空则返回为空 105 System.out.println("hello"); 106 Stu stu = new Stu(); //否则,创建对象 107 stu.setSid(rs.getInt("sid")); 108 stu.setSname(rs.getString("sname")); 109 stu.setAge(rs.getInt("age")); 110 stu.setGender(rs.getString("gender")); 111 return stu; 112 } catch (SQLException e) { 113 // TODO Auto-generated catch block 114 throw new RuntimeException(); 115 } 116 } 117 public static void main(String[] args){ 118 Demo1 demo1 = new Demo1(); 119 Stu stu = new Stu(); 120 stu = demo1.load(1); 121 System.out.println(stu); 122 //添加 123 // Stu stu1 = new Stu(3,"李四",15,"男"); 124 // demo1.addStu(stu1); 125 //更新操作 126 // Stu stu2 = new Stu(3,"王昭君",15,"女"); 127 // demo1.updateStu(stu2); 128 //删除操作 129 demo1.deleteStu(3); 130 } 131 }
然后是自己写的类似QueryRunner的类,其实已经比较接近了,不过比较粗糙,一点点理解,学习
1 package cn.itcast.dbutils; 2 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 6 import org.junit.Test; 7 8 import cn.itcast.jdbc.JdbcUtils; 9 10 public class Demo2 { 11 //用来测试 qr 工具的类 12 Demo1 demo1 = new Demo1(); 13 @Test 14 public void fun1(){ 15 // Stu stu = new Stu(1001,"张三",20,"男"); 16 // addStu(stu); 17 Stu s = demo1.load(1001); 18 System.out.println(s); 19 } 20 public void addstu(Stu stu){ 21 QR qr = new QR(JdbcUtils.getDataSource()); //在创建对象时给出连接池 22 String sql = "insert into t_stu values(?,?,?,?)"; //sql的模板 23 //给出参数 24 Object[] params = {stu.getSid(),stu.getSname(),stu.getAge(),stu.getGender()}; 25 // 调用pstmt执行增删改 26 qr.update(sql, params); 27 } 28 public void updateStu(Stu stu){ 29 QR qr = new QR(JdbcUtils.getDataSource()); //创建对象时给出连接池 30 String sql = "update t_stu set sname=?,age=?,gender=? where sid=?"; //进行更新操作的SQL模板 31 //给出参数 注意参数的位置顺序需要和sql 中的插入位置进行匹配 32 Object[] params = {stu.getSname(),stu.getAge(),stu.getGender(),stu.getSid()}; 33 qr.update(sql, params); 34 } 35 public void deleteStu(int sid){ 36 QR qr = new QR(JdbcUtils.getDataSource()); //创建对象时给出连接池 37 String sql = "delete from t_stu where sid=?"; //进行删除的sql 38 //给出参数 39 Object[] params = {sid}; 40 qr.update(sql, params); 41 } 42 // 查询并返回一个对象 43 public Stu load(int sid){ 44 QR qr = new QR(JdbcUtils.getDataSource()); 45 String sql = "select * from t_stu where sid=?"; 46 //给出参数 47 Object[] params = {sid}; 48 RsHandler<Stu> rh = new RsHandler<Stu>(){ 49 50 @Override 51 public Stu handle(ResultSet rs) throws SQLException { 52 // TODO Auto-generated method stub 53 if(!rs.next()) return null; //如果rs的内容为空,则返回 null 54 //否则 55 Stu stu = new Stu(); //好像还是使用了最底层的东西,不过是使用工具进行了封装 56 stu.setSid(rs.getInt("sid")); 57 stu.setSname(rs.getString("sname")); 58 stu.setAge(rs.getInt("age")); 59 stu.setGender(rs.getString("gender")); 60 return stu; 61 } 62 }; 63 return (Stu)qr.query(sql, rh, params); 64 } 65 public void addStu1(Stu stu){ 66 QR2 qr2 = new QR2(JdbcUtils.getDataSource()); 67 String sql = "insert into t_stu values(?,?,?,?)"; //给出sql 68 //设置好参数 69 Object[] params = {stu.getSid(),stu.getSname(),stu.getAge(),stu.getGender()}; 70 qr2.updateStu(sql, params); 71 } 72 public void updateStu1(Stu stu){ 73 QR2 qr2 = new QR2(JdbcUtils.getDataSource()); 74 String sql = "update t_stu set sname=?,age=?,gender=? where sid=?"; 75 //设置参数胡 76 Object[] params = {stu.getSname(),stu.getAge(),stu.getGender(),stu.getSid()}; 77 qr2.updateStu(sql, params); 78 } 79 public void deleteStu1(int sid){ 80 QR2 qr2 = new QR2(JdbcUtils.getDataSource()); 81 String sql = "delete from t_stu where sid=?"; 82 //设置参数 83 Object[] params = {sid}; 84 qr2.updateStu(sql, params); 85 } 86 public Stu load2(int sid){ 87 QR2 qr2 = new QR2(JdbcUtils.getDataSource()); 88 String sql = "select * from t_stu where sid=?"; 89 //设置参数 90 Object[] params = {sid}; 91 RsHandler1<Stu> rh1 = new RsHandler1<Stu>(){ 92 93 @Override 94 public Stu handle(ResultSet rs) throws SQLException { 95 // TODO Auto-generated method stub 96 if(!rs.next()) return null; //如果rs的内容为空 ,则返回值为空 97 //否则 98 Stu stu = new Stu(); 99 stu.setSid(rs.getInt("sid")); 100 stu.setSname(rs.getString("sname")); 101 stu.setAge(rs.getInt("age")); 102 stu.setGender(rs.getString("gender")); 103 return stu; //设置好之后将stu 对象返回 104 105 } 106 107 }; 108 return (Stu) qr2.query(sql, rh1, params); 109 } 110 public static void main(String[] args){ 111 Demo2 demo2 = new Demo2(); 112 // 测试添加操作 113 // Stu stu = new Stu(3,"王昭君",15,"女"); 114 // demo2.addstu(stu); 115 // 测试更新操作 116 // Stu stu2 = new Stu(3,"杨玉环",20,"女"); 117 // demo2.updateStu(stu2); 118 // 测试删除操作 119 //demo2.deleteStu(3); 120 // 模仿测试添加操作 121 // Stu stu3 = new Stu(3,"安可",15,"女"); 122 // demo2.addStu1(stu3); 123 // 模仿测试更行操作 124 // Stu stu4 = new Stu(3,"安妮",16,"女"); 125 // demo2.updateStu1(stu4); 126 // 模仿测试查询操作 127 Stu stu = demo2.load2(3); 128 System.out.println(stu); 129 } 130 }
类似工具,QueryRunner
1 package cn.itcast.dbutils; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import javax.sql.DataSource; 9 //queryrunner 的学习使用 10 public class QR<T> { 11 private DataSource dataSource = null; 12 public QR(DataSource datasource) { //获得数据库连接池 13 this.dataSource = datasource; 14 } 15 //一个工具类 16 public QR() { 17 super(); 18 // TODO Auto-generated constructor stub 19 } 20 /* 21 * 做 delete update insert 操作 22 * */ 23 public int update(String sql,Object ... params){ 24 Connection con = null; 25 PreparedStatement pstmt = null; 26 try { 27 con = dataSource.getConnection();//通过连接池得到连接对象 28 pstmt = con.prepareStatement(sql);//使用sql创建pstmt 29 initParams(pstmt, params);//设置参数 30 return pstmt.executeUpdate();//执行 31 } catch(Exception e) { 32 throw new RuntimeException(e); 33 } finally { 34 try { 35 if(pstmt != null) pstmt.close(); 36 if(con != null) con.close(); 37 } catch(SQLException e1) {} 38 } 39 } 40 // 给参数赋值 这样就可以给多个位置设置参数 41 private void initParams(PreparedStatement pstmt, Object... params) 42 throws SQLException { 43 for(int i = 0; i < params.length; i++) { 44 pstmt.setObject(i+1, params[i]); 45 } 46 } 47 public T query(String sql,RsHandler<T> rh,Object...params){ 48 Connection con = null; 49 PreparedStatement pstmt = null; 50 ResultSet rs = null; 51 try { 52 con = dataSource.getConnection(); 53 pstmt = con.prepareStatement(sql); 54 initParams(pstmt, params); //设置参数 55 rs = pstmt.executeQuery(); 56 return rh.handle(rs); 57 } catch (SQLException e) { 58 // TODO Auto-generated catch block 59 throw new RuntimeException(); 60 } finally{ 61 try{ 62 if(pstmt!=null) pstmt.close(); 63 if(rs!=null) rs.close(); 64 }catch(Exception e2){ 65 66 } 67 } 68 } 69 } 70 //用来把结果集转换成需要的类型! 71 interface RsHandler<T> { 72 public T handle(ResultSet rs) throws SQLException; 73 }
使用QueryRunner测试
1 package cn.itcast.dbutils; 2 3 import java.sql.SQLException; 4 import java.util.List; 5 import java.util.Map; 6 7 import org.apache.commons.dbutils.QueryRunner; 8 import org.apache.commons.dbutils.handlers.BeanHandler; 9 import org.apache.commons.dbutils.handlers.BeanListHandler; 10 import org.apache.commons.dbutils.handlers.MapHandler; 11 import org.apache.commons.dbutils.handlers.MapListHandler; 12 import org.apache.commons.dbutils.handlers.ScalarHandler; 13 import org.junit.Test; 14 15 import cn.itcast.jdbc.JdbcUtils; 16 17 public class Demo3 { 18 // 在demo2的基础上引入了queryrunner 19 @Test 20 public void fun1() throws SQLException{ 21 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); //在创建对象的时候给出连接池 22 String sql = "insert into t_stu values(?,?,?,?)"; //给出sql模板 23 Object[] params = {1002,"王五",50,"男"}; 24 qr.update(sql, params); 25 } 26 @Test 27 public void fun2() throws SQLException{ 28 //接着是查询并返回一个对象 29 //创建QueryRunner对象,并提供数据库连接池对象 30 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 31 String sql = "select * from t_stu where sid=?"; 32 Object[] params = {1001}; //设置好参数 33 //这是 QueryRunner 提供的更简便的方法 34 Stu stu = qr.query(sql, new BeanHandler<Stu>(Stu.class), params); 35 System.out.println(stu); 36 } 37 /** 38 * BeanListHandler的应用,它是多行处理器 39 * 每行对象一个Stu对象! 40 * @throws SQLException 41 * @throws Exception 42 */ 43 @Test 44 public void fun3() throws SQLException{ 45 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 46 String sql = "select * from t_stu"; 47 Object[] params = {}; 48 List<Stu> stuList = qr.query(sql, new BeanListHandler<Stu>(Stu.class)); 49 System.out.println(stuList); 50 } 51 /** 52 * MapHandler的应用,它是单行处理器,把一行转换成一个Map对象 53 * @throws SQLException 54 */ 55 @Test 56 public void fun4() throws SQLException{ 57 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 58 String sql = "select * from t_stu where sid=?"; 59 Object[] params = {1}; 60 Map map = qr.query(sql, new MapHandler(),params); 61 System.out.println(map); 62 System.out.println(map.get("sname")); 63 } 64 /** 65 * MapListHandler,它是多行处理器,把每行都转换成一个Map,即List<Map> 66 * @throws SQLException 67 */ 68 @Test 69 public void fun5() throws SQLException{ 70 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 71 String sql = "select * from t_stu"; 72 List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler()); 73 System.out.println(mapList); 74 System.out.println(mapList.get(0)); 75 } 76 /** 77 * ScalarHandler,它是单行单列时使用,最为合适! 78 * @throws SQLException 79 */ 80 @Test 81 public void fun6() throws SQLException{ 82 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 83 String sql = "select sid from t_stu where sid=?"; 84 Object[] params = {1}; 85 int sname = (int) qr.query(sql, new ScalarHandler(), params); 86 System.out.println(sname); 87 } 88 }
测试的javabean类
1 package cn.itcast.dbutils; 2 3 public class Stu { 4 private int sid; 5 private String sname; 6 private int age; 7 private String gender; 8 public int getSid() { 9 return sid; 10 } 11 public void setSid(int sid) { 12 this.sid = sid; 13 } 14 public String getSname() { 15 return sname; 16 } 17 public void setSname(String sname) { 18 this.sname = sname; 19 } 20 public int getAge() { 21 return age; 22 } 23 public void setAge(int age) { 24 this.age = age; 25 } 26 public String getGender() { 27 return gender; 28 } 29 public void setGender(String gender) { 30 this.gender = gender; 31 } 32 public Stu() { 33 super(); 34 // TODO Auto-generated constructor stub 35 } 36 public Stu(int sid, String sname, int age, String gender) { 37 super(); 38 this.sid = sid; 39 this.sname = sname; 40 this.age = age; 41 this.gender = gender; 42 } 43 @Override 44 public String toString() { 45 return "Stu [sid=" + sid + ", sname=" + sname + ", age=" + age 46 + ", gender=" + gender + "]"; 47 } 48 49 }

浙公网安备 33010602011771号