尚硅谷之JDBC

117 篇文章 0 订阅
116 篇文章 0 订阅

2、编写通用的增删改查方法

2.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.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 对象中列的类型和属性信息的对象:

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

2.4 特殊的SQL

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

2.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;

         }

 

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值