JDBC笔记4--CRUD(2)

1、对数据表的增删改操作

  • 增删改操作没有返回值,所以归为一类
1.1 增删改操作函数
//通用的增删改操作
public void update(String sql,Object ...args){//sql中占位符的个数与可变形参的长度相同!
    Connection conn = null;
    PreparedStatement ps = null;
    try {
        //1.获取数据库的连接
        conn = JDBCUtils.getConnection();
        //2.预编译sql语句,返回PreparedStatement的实例
        ps = conn.prepareStatement(sql);
        //3.填充占位符
        for(int i = 0;i < args.length;i++){
            ps.setObject(i + 1, args[i]);//小心参数声明错误!!
        }
        //4.执行
        ps.execute();
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        //5.资源的关闭
        JDBCUtils.closeResource(conn, ps);
    }
}
1.2 测试删除
@Test
public void testCommonUpdate(){
	String sql = "delete from customers where id = ?";
	update(sql,3);
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.3 测试更新
@Test
public void testCommonUpdate(){
	String sql = "update `order` set order_name = ? where order_id = ?";
    update(sql,"DD","2");
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 测试插入
@Test
public void testCommonUpdate(){
    String sql = "insert into `order`(order_name,order_date)A values(?,?)";
    update(sql,"KK",new Date(1223213443244L));
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、对数据表的查询操作

2.1 获取一条记录结果集 resultSet

使用反射获取不同的类,设置不同的类的属性

/**
     *
     * @Description 针对于不同的表的通用的查询操作,返回表中的一条记录
     * @param clazz
     * @param sql
     * @param args
     * @return
     */
 public <T> T getInstance(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
         ResultSetMetaData rsmd = rs.getMetaData();
         // 通过ResultSetMetaData获取结果集中的列数
         int columnCount = rsmd.getColumnCount();

         if (rs.next()) {
             T t = clazz.newInstance();
             // 处理结果集一行数据中的每一个列
             for (int i = 0; i < columnCount; i++) {
                 // 获取列值
                 Object columValue = rs.getObject(i + 1);

                 // 获取每个列的列名
                 // String columnName = rsmd.getColumnName(i + 1);
                 // 获取每个列的列名(别名)
                 String columnLabel = rsmd.getColumnLabel(i + 1);

                 // 给t对象指定的columnName属性,赋值为columValue:通过反射
                 Field field = clazz.getDeclaredField(columnLabel);
                 field.setAccessible(true);
                 field.set(t, columValue);
             }
             return t;
         }
     } catch (Exception e) {
         e.printStackTrace();
     } finally {
         JDBCUtils.closeResource(conn, ps, rs);
     }
     return null;
 }
2.2测试

以下语句需要注意,不适用别名会出错

//这里使用别名,为了与类的属性名相同
String sql1 = "select order_id orderId,order_name orderName from `order` where order_id = ?";
2.3 获取多条记录结果集 resultSet
@Test
public void testGetInstance(){
    String sql = "select id,name,email from customers where id = ?";
    Customer customer = getInstance(Customer.class,sql,12);
    System.out.println(customer);
    //这里使用别名,为了与类的属性名相同
    String sql1 = "select order_id orderId,order_name orderName from `order` where order_id = ?";
    Order order = getInstance(Order.class, sql1, 1);
    System.out.println(order);
}

在这里插入图片描述
注意:输出的内容,因为部分字段没有被查询,所以该字段返回null

 /*
查询多条记录
 */
public <T> List<T> getForList(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
        ResultSetMetaData rsmd = rs.getMetaData();
        // 通过ResultSetMetaData获取结果集中的列数
        int columnCount = rsmd.getColumnCount();
        //创建集合对象
        ArrayList<T> list = new ArrayList<T>();
        while (rs.next()) {
            T t = clazz.newInstance();
            // 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
            for (int i = 0; i < columnCount; i++) {
                // 获取列值
                Object columValue = rs.getObject(i + 1);

                // 获取每个列的列名
                // String columnName = rsmd.getColumnName(i + 1);
                String columnLabel = rsmd.getColumnLabel(i + 1);

                // 给t对象指定的columnName属性,赋值为columValue:通过反射
                Field field = clazz.getDeclaredField(columnLabel);
                field.setAccessible(true);
                field.set(t, columValue);
            }
            list.add(t);
        }
        return list;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JDBCUtils.closeResource(conn, ps, rs);
    }
    return null;
}
2.4 测试
@Test
public void testGetForList(){
    String sql = "select id,name,email from customers where id < ?";
    List<Customer> list = getForList(Customer.class,sql,12);
    list.forEach(System.out::println);
    //注意这里使用了别名
    String sql1 = "select order_id orderId,order_name orderName from `order`";
    List<Order> orderList = getForList(Order.class, sql1);
    orderList.forEach(System.out::println);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值