注:此章仅为上篇博客内工具类增删查改内容补充
查询多行多列
public static <T> List<T> list(String sql,Class<T> c,Object...params) { //创建一个集合,包含所有对象 List<T> tList = new ArrayList<>(); try { //1.注册驱动-反射去加载jar包中com.hp.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver()) Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象jdbc协议:mysql子协议 :域名(ip) localhost:3306(端口号)/数据库名称 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?serverTimezone=GMT%2B8", "root", "root"); System.out.println(con); //3.定义sql //4.需要创建statement PreparedStatement preState = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preState.setObject(i+1,params[i]); } //5.statement执行sql语句,返回结果集 ResultSet rs = preState.executeQuery(); //通过结果集rs得到结果集元数据 ResultSetMetaData md = rs.getMetaData(); //获取结果集的总列数 int columnCount = md.getColumnCount(); //6.解析结果集rs while (rs.next()) { //根据每一行数据,封装成一个实体对象 T t=c.newInstance(); //1.取出某一行的每个数据,封装到对象t的属性中 for (int i = 1; i <=columnCount ; i++) { //通过列的序号获取每一列的值 Object value = rs.getObject(i); if(value!=null){ //通过列的序号获取每一列的列名 String columnName = md.getColumnName(i); //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法 Field f = c.getDeclaredField(columnName); //赋予私有属性的赋值权限 f.setAccessible(true); //使用反射,把value给到对象t的属性中 f.set(t,value);//理解为:把value赋值给对象t的columnName属性,相当于set方法 } } //把对象存入集合中 tList.add(t); } //7.关闭资源 preState.close(); con.close(); }catch (Exception e){ e.printStackTrace(); } return tList; }
查询一行
public static <T> T selectRow(String sql,Class<T> c,Object...params) { try { //1.注册驱动-反射去加载jar包中com.hp.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver()) Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象jdbc协议:mysql子协议 :域名(ip) localhost:3306(端口号)/数据库名称 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?serverTimezone=GMT%2B8", "root", "root"); //3.定义sql //4.需要创建statement PreparedStatement preState = con.prepareStatement(sql); //在执行前,给sql传递参数 for (int i = 0; i <params.length ; i++) { preState.setObject(i+1,params[i]); } //5.statement执行sql语句,返回结果集 ResultSet rs = preState.executeQuery(); //通过结果集rs得到结果集元数据 ResultSetMetaData md = rs.getMetaData(); //获取结果集的总列数 int columnCount = md.getColumnCount(); //6.解析结果集rs // 根据每一行数据,封装成一个实体对象 T t=null; if (rs.next()) { t=c.newInstance(); //1.取出某一行的每个数据,封装到对象t的属性中 for (int i = 1; i <=columnCount ; i++) { //通过列的序号获取每一列的值 Object value = rs.getObject(i); if(value!=null){ //通过列的序号获取每一列的列名 String columnName = md.getColumnName(i); //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法 Field f = c.getDeclaredField(columnName); //赋予私有属性的赋值权限 f.setAccessible(true); //使用反射,把value给到对象t的属性中 f.set(t,value);//理解为:把value赋值给对象t的columnName属性,相当于set方法 } } return t; } //7.关闭资源 preState.close(); con.close(); }catch (Exception e){ e.printStackTrace(); } return null; }
可进行如下操作进行测试:
查询一列
public static <T> List<T> selectColumn(String sql,Class<T> c,Object...params) { //创建一个集合,包含所有对象 List<T> tList = new ArrayList<>(); try { Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象jdbc协议:mysql子协议 :域名(ip) localhost:3306(端口号)/数据库名称 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?serverTimezone=GMT%2B8", "root", "root"); //3.定义sql //4.需要创建statement PreparedStatement preState = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preState.setObject(i+1,params[i]); } //5.statement执行sql语句,返回结果集 ResultSet rs = preState.executeQuery(); //通过结果集rs得到结果集元数据 ResultSetMetaData md = rs.getMetaData(); //获取结果集的总列数 int columnCount = md.getColumnCount(); //6.解析结果集rs while (rs.next()) { //通过列的序号获取每一列的值 T t = (T) rs.getObject(1); //把对象存入集合中 tList.add(t); } //7.关闭资源 preState.close(); con.close(); }catch (Exception e){ e.printStackTrace(); } return tList; }
测试方法:
查询单个
public static <T> T selectOne(String sql,Class<T> c,Object...params) { try { //1.注册驱动-反射去加载jar包中com.hp.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver()) Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象jdbc协议:mysql子协议 :域名(ip) localhost:3306(端口号)/数据库名称 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?serverTimezone=GMT%2B8", "root", "root"); //3.定义sql //4.需要创建statement PreparedStatement preState = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preState.setObject(i+1,params[i]); } //5.statement执行sql语句,返回结果集 ResultSet rs = preState.executeQuery(sql); //通过结果集rs得到结果集元数据 ResultSetMetaData md = rs.getMetaData(); //获取结果集的总列数 int columnCount = md.getColumnCount(); //6.解析结果集rs T t = null; if (rs.next()) { t = (T) rs.getObject(1); } //7.关闭资源 preState.close(); con.close(); return t;//返回t }catch (Exception e){ e.printStackTrace(); } return null; }
测试方法:
修改
public static int update(String sql,Object...params) { try { //1.注册驱动-反射去加载jar包中com.hp.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver()) Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象jdbc协议:mysql子协议 :域名(ip) localhost:3306(端口号)/数据库名称 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?serverTimezone=GMT%2B8", "root", "root"); //3.定义sql //4.需要创建statement PreparedStatement preState = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preState.setObject(i+1,params[i]); } //5.statement执行sql语句,返回结果集 int i = preState.executeUpdate(sql); //7.关闭资源 preState.close(); con.close(); return i;//返回t }catch (Exception e){ e.printStackTrace(); } return 0; } }
测试方法: