编写通用的增删改查方法

编写通用的增删改查方法

1通用的增删改

         //通用的更新数据库的方法:insert,update,delete语句时

         public static int update(String sql)throws SQLException{

                  //1、获取连接

                  Connection conn = JDBCUtils.getConnection();

 

                  //2、获取Statement对象,这个对象是用来给服务器传sql并执行sql

                  Statement st = conn.createStatement();

 

                  //3、执行sql

                  int len = st.executeUpdate(sql);

 

                  //4、释放资源

                  JDBCUtils.closeQuietly(st, conn);

 

                  return len;

         }

 

         //      通用的更新数据库的方法:insert,update,delete语句,允许sql带?

         public static int update(String sql, Object… args)throws SQLException{

                  Connection conn = JDBCUtils.getConnection();

 

                  int len = update(conn,sql,args);

 

                  JDBCUtils.closeQuietly(conn);

 

                  return len;

         }

 

         //      通用的更新数据库的方法:insert,update,delete语句,允许sql带?

         public static int update(Connection conn, String sql, Object… args)throws SQLException{

                  //2、获取PreparedStatement对象,这个对象是用来sql进行预编译

                  PreparedStatement pst = conn.prepareStatement(sql);

 

                  //3、设置sql中的?

                  if(args!=null && args.length>0){

                          //数组的下标是从0开始,?的编号是1开始

                          for (int i = 0; i < args.length; i++) {

                                   pst.setObject(i+1, args[i]);

                          }

                  }

 

                  //4、执行sql

                  int len = pst.executeUpdate();

 

                  //5、释放资源

                  JDBCUtils.closeQuietly(pst);

 

                  return len;

         }

2尝试编写通用的查询方法

         /**

          * 执行查询操作的SQL语句,SQL可以带参数(?)

          * @param clazz Class 查询的结果需要封装的实体的Class类型,例如:学生Student,商品Goods,订单Order

          * @param sql String 执行查询操作的SQL语句

          * @param args Object… 对应的每个?设置的值,顺序要与?对应

          * @return T 封装了查询结果的实体

          * @throws Exception

          */

         public static <T> T get(Class<T> clazz,String sql,Object… args)throws Exception{

                  Connection conn = null;

                  PreparedStatement pst = null;

                  ResultSet rs = null;

                  T entity = null;

 

                  //1、获取连接

                  conn = JDBCUtils.getConnection();

                  //2、获取PreparedStatement对象,并预编译带参数?的SQL

                  pst = conn.prepareStatement(sql);

                  //3、设置参数?的值

                  if(args!=null && args.length>0){

                          for(int i=0;i<args.length;i++){

                                   pst.setObject(i+1, args[i]);

                          }

                  }

                  //4、执行SQL

                  rs = pst.executeQuery();

                  //5、获取结果,封装到对象中

                  if(rs.next()){

                          entity = clazz.newInstance();

 

                          /*

                           * 需要解决的问题?

                           * (1)查询了哪些列,即需要为哪些属性赋值,这些列对应的属性名是什么

                           * (2)获取这些列的值,用反射为属性赋值

                           *

                           * clazz:只能得到所有属性,不知道sql中查询了哪些列

                           * 只能依赖sql

                           */

                  }

 

                  JDBCUtils.free(rs, pst, conn);

 

                  return entity;

         }

2.3 ResultSetMetaData 类

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:

  • int getColumnCount()返回当前 ResultSet 对象中的列数。
  • String getColumnName(int column)获取指定列的名称。 数据库中的字段名
  • String getColumnLabel(int column)建议标题通常由 SQL AS 子句来指定。如果未指定 SQL AS,则返回列名
  • String getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
  • int getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
  • boolean isNullable(int column):指示指定列中的值是否可以为 null。
  • boolean isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。

4 特殊的SQL

通过给列取别名的方式,来告知数据库的列名与其对应实体的属性名

Java培训

5工具类通用的查询一个实体的方法

         //通用的查询方法之一:查询一行,即一个对象

         /**

          * 执行查询操作的SQL语句,SQL可以带参数(?)

          * @param clazz Class 查询的结果需要封装的实体的Class类型,例如:学生Student,商品Goods,订单Order

          * @param sql String 执行查询操作的SQL语句

          * @param args Object… 对应的每个?设置的值,顺序要与?对应

          * @return T 封装了查询结果的实体

          * @throws Exception

          */

         public static <T> T get(Class<T> clazz,String sql,Object… args)throws Exception{

                  //1、注册驱动

                  //2、获取连接

                  Connection conn = JDBCUtils.getConnection();

 

                  //3、对sql进行预编译

                  PreparedStatement pst = conn.prepareStatement(sql);

 

                  //4、设置?

                  if(args!=null && args.length>0){

                          //数组的下标是从0开始,?的编号是1开始

                          for (int i = 0; i < args.length; i++) {

                                   pst.setObject(i+1, args[i]);

                          }

                  }

 

                  //5、查询

                  ResultSet rs = pst.executeQuery();

 

                  //获取查询的结果集的元数据信息

                  ResultSetMetaData rsmd = rs.getMetaData();

                  //这是查询的结果集中,一共有几列

                  int count = rsmd.getColumnCount();

 

                  T t = clazz.newInstance();//要求这个Javabean类型必须有无参构造

 

                  while(rs.next()){

                          /*

                           * 问题?

                           * (1)sql语句中查询了几列,每一列是什么属性

                           * (2)怎么把这个值设置到Javabean的属性中

                           */

                          //循环每一行有几列

                          for (int i = 0; i < count; i++) {

                                   //第几列的名称

//                                 String columnName = rsmd.getColumnName(i+1);

                                   //如果sql中没有取别名,那么就是列名,如果有别名,返回的是别名

                                   String fieldName = rsmd.getColumnLabel(i+1);

 

                                   //该列的值

//                                 Object value = rs.getObject(columnName);

                                   Object value = rs.getObject(fieldName);

 

                                   //设置obj对象的某个属性中

                                   Field field = clazz.getDeclaredField(fieldName);//JavaBean的属性名

                                   field.setAccessible(true);

                                   field.set(t, value);

                          }

 

                  }

 

                  //5、释放资源

                  //5、释放资源

                  JDBCUtils.closeQuietly(rs,pst,conn);

 

                  return t;

         }

 

6工具类通用的查询多个实体的方法

         //通用的查询方法之二:查询多行,即多个对象

         //Class<T> clazz:用来创建实例对象,获取对象的属性,并设置属性值

         /**

          * 执行查询操作的SQL语句,SQL可以带参数(?)

          * @param clazz Class 查询的结果需要封装的实体的Class类型,例如:学生Student,商品Goods,订单Order

          * @param sql String 执行查询操作的SQL语句

          * @param args Object… 对应的每个?设置的值,顺序要与?对应

          * @return ArrayList<T> 封装了查询结果的集合

          * @throws Exception

          */

         public static <T> ArrayList<T> getList(Class<T> clazz,String sql,Object… args)throws Exception{

                  //1、注册驱动,不用了

                  //2、获取连接

                  Connection conn = JDBCUtils.getConnection();

 

                  //3、对sql进行预编译

                  PreparedStatement pst = conn.prepareStatement(sql);

 

                  //4、对?进行设置值

                  if(args!=null && args.length>0){

                          for (int i = 0; i < args.length; i++) {

                                   pst.setObject(i+1, args[i]);

                          }

                  }

 

                  //5、执行sql

                  ResultSet rs = pst.executeQuery();

                  //获取结果集的元数据

                  ResultSetMetaData metaData = rs.getMetaData();

                  //获取结果中总列数

                  int count = metaData.getColumnCount();

 

                  //创建集合对象

                  ArrayList<T> list = new ArrayList<T>();

 

                  while(rs.next()){//遍历的行

                          //1、每一行是一个对象

                          T obj = clazz.newInstance();

 

                          //2、每一行有很多列

                          //for的作用是为obj对象的每一个属性设置值

                          for (int i = 0; i < count; i++) {

                                   //(1)每一列的名称

                                   String fieldName = metaData.getColumnLabel(i+1);//获取第几列的名称,如果有别名获取别名,如果没有别名获取列名

                                   //(2)每一列的值

                                   Object value = rs.getObject(i+1);//获取第几列的值

                                   //(3)获取属性对象

                                   Field field = clazz.getDeclaredField(fieldName);

                                   //(4)设置可见性

                                   field.setAccessible(true);

                                   //(5)设置属性值

                                   field.set(obj, value);

                          }

 

                          //3、把obj对象放到集合中

                          list.add(obj);

                  }

 

                  //6、释放资源

                  JDBCUtils.closeQuietly(rs,pst,conn);

 

                  //7、返回结果

                  return list;

         }

 

7工具类通用的查询单值

         //通用的查询方法之三:查询单个值

         //单值:select max(salary) from employee;   一行一列

         //select count(*) from t_goods; 一共几件商品

         public static Object getValue(String sql,Object… args)throws Exception{

                  //2、获取连接

                  Connection conn = JDBCUtils.getConnection();

 

                  //3、对sql进行预编译

                  PreparedStatement pst = conn.prepareStatement(sql);

 

                  //4、对?进行设置值

                  if(args!=null && args.length>0){

                          for (int i = 0; i < args.length; i++) {

                                   pst.setObject(i+1, args[i]);

                          }

                  }

 

                  //5、执行sql

                  ResultSet rs = pst.executeQuery();

 

                  Object value = null;

                  if(rs.next()){//一行

                          value = rs.getObject(1);//一列

                  }

 

                  //6、释放资源

                  JDBCUtils.closeQuietly(rs,pst,conn);

 

                  return value;

         }

 

8工具类通用的查询一行多列,非实体

         //通用的查询方法之四:查询多行多列,但每一行又不是一个JavaBean

         /*

          * SELECT did,AVG(salary),MAX(Salary) FROM t_employee GROUP BY did;

          * did       avg(salary)       max(salary)

                  1       1990.90            8900

                  2       4889         6899

          */

         public static List<Map<String,Object>> getListMap(String sql,Object… args)throws Exception{

                  //2、获取连接

                  Connection conn = JDBCUtils.getConnection();

 

                  //3、对sql进行预编译

                  PreparedStatement pst = conn.prepareStatement(sql);

 

                  //4、对?进行设置值

                  if(args!=null && args.length>0){

                          for (int i = 0; i < args.length; i++) {

                                   pst.setObject(i+1, args[i]);

                          }

                  }

 

                  //5、执行sql

                  ResultSet rs = pst.executeQuery();

                  //获取结果集的元数据对象

                  ResultSetMetaData metaData = rs.getMetaData();

                  //一共有几列

                  int count = metaData.getColumnCount();

                  //创建List

                  ArrayList<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

 

                  while(rs.next()){

                          //每一行是一个Map的对象

                          HashMap<String,Object> map = new HashMap<String,Object>();

 

                          //map的key是列名

                          for (int i = 0; i < count; i++) {

                                   //(1)获取列名或别名

                                   String columnName = metaData.getColumnLabel(i+1);

                                   //(2)获取对应的值

                                   Object value = rs.getObject(i+1);

                                   //(3)把这对值放到map中

                                   map.put(columnName, value);

                          }

 

                          //把map放到List中

                          list.add(map);

                  }

 

                  //6、释放资源

                  JDBCUtils.closeQuietly(rs,pst,conn);

 

                  return list;

         }

 

2.9工具类通用的查询多行多列,非实体

         //通用的查询方法之四:查询一行多列,但一行又不是一个JavaBean

         public static Map<String,Object> getMap(String sql,Object… args)throws Exception{

                  List<Map<String, Object>> listMap = getListMap(sql,args);

                  if(listMap.size()>0){

                          return listMap.get(0);

                  }

                  return null;

         }

 


上一篇:
下一篇:
关于我们
名师团队
新闻动态
合作企业
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
电话:010-56253825
邮箱:info@atguigu.com
地址:北京市昌平区宏福科技园综合楼6层(北京校区)

 深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)