视频原地址:https://www.bilibili.com/video/av67955358?p=20
通用查询的操作
1.获取数据库连接
2.预编译sql语句
3.填充占位符
4.执行executeQuery查询
5.处理获取的结果集
@Test public void testquery1() { String sql = "select id,'name',email,birth from customers where id = ?";
针对于表的字段名与类的属性名不相同的情况
必须申明sql时,使用类的属性名来命名字段的别名
customers cs = queryforcustomer(sql, 1); System.out.println(cs); } public customers queryforcustomer(String sql,Object ...args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn = JDBCutils.getConnection(); ps = conn.prepareStatement(sql); for(int i=0; i < args.length;i++) { ps.setObject(i+1, args[i]); } rs = ps.executeQuery(); //获取结果集的原数据 ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); //获取列数 if(rs.next()) { customers cust = new customers();
/*ORM变成思想
一个数据表对应一个java类
表中的一条数据对应java类中的一个对象
表中的一个字段对应java类中的一个属性
*/ for(int i=0;i<columnCount;i++) { Object value = rs.getObject(i+1); //获取每个列的列名 String columnlabel = rsmd.getColumnLabel(i+1); //getColumName是获取表的列名 并没有获取别名 //getColumnLabel可以获取别名当没有别名时候就是表的列名 //给cust对象指定的columName属性,赋值为columvalue,通过反射 Field field = customers.class.getDeclaredField(columnlabel); field.setAccessible(true);//若成员变量有私有的 field.set(cust, value); } return cust; } } catch (Exception e) { e.printStackTrace(); }finally { JDBCutils.closeResource(conn, ps, rs); } return null; }
针对于不同表的查询一条查询、
利用泛型即可
@Test public void testforquery() { String sql = "select id,name,email from customers where id =?"; customers cust = queryforcustomer(customers.class, sql, 1); System.out.println(cust); } /* * 针对于不同表返回一条查询数据 * */ public <T> T queryforcustomer(Class<T>clazz,String sql,Object ...args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn = JDBCutils.getConnection(); ps = conn.prepareStatement(sql); for(int i=0; i < args.length;i++) { ps.setObject(i+1, args[i]); } rs = ps.executeQuery(); //获取结果集的原数据 ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); //获取列数 if(rs.next()) { T t = clazz.getDeclaredConstructor().newInstance(); for(int i=0;i<columnCount;i++) { Object value = rs.getObject(i+1); //获取每个列的列名 String columnlabel = rsmd.getColumnLabel(i+1); //getColumName是获取表的列名 并没有获取别名 //getColumnLabel可以获取别名当没有别名时候就是表的列名 //给t对象指定的columName属性,赋值为columvalue,通过反射 Field field = clazz.getDeclaredField(columnlabel); field.setAccessible(true); field.set(t, value); } return t; } } catch (Exception e) { e.printStackTrace(); }finally { JDBCutils.closeResource(conn, ps, rs); } return null; }
针对于不同表的多条查询
@Test public void testlist() { String sql = "select id,name,email from customers where id<?"; List<customers> cust = querylsitforcustomer(customers.class, sql, 4); cust.forEach(System.out::println); } public <T> List <T> querylsitforcustomer(Class<T>clazz,String sql,Object ...args){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn = JDBCutils.getConnection(); ps = conn.prepareStatement(sql); for(int i=0; i < args.length;i++) { ps.setObject(i+1, args[i]); } rs = ps.executeQuery(); //获取结果集的原数据 ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); //获取列数 ArrayList<T> list = new ArrayList<T>(); while(rs.next()) { T t = clazz.getDeclaredConstructor().newInstance(); for(int i=0;i<columnCount;i++) { Object value = rs.getObject(i+1); //获取每个列的列名 String columnlabel = rsmd.getColumnLabel(i+1); //getColumName是获取表的列名 并没有获取别名 //getColumnLabel可以获取别名当没有别名时候就是表的列名 //给t对象指定的columName属性,赋值为columvalue,通过反射 Field field = clazz.getDeclaredField(columnlabel); field.setAccessible(true); field.set(t, value); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); }finally { JDBCutils.closeResource(conn, ps, rs); } return null; }