jdbc三层架构增删查改代码(jdbc入门--JdbcUtil工具类完善)

该文章展示了如何使用Java的JDBC进行数据库操作,包括查询多行多列、查询一行、查询一列、查询单个值以及更新数据。代码示例详细解释了从注册驱动、建立连接、预编译SQL到处理结果集和关闭资源的完整过程。
摘要由CSDN通过智能技术生成

注:此章仅为上篇博客内工具类增删查改内容补充

查询多行多列

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;
    }
}

测试方法:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值