JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装

这篇具有很好参考价值的文章主要介绍了JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用JDBC批量添加

​ 知识点复习:

​1、JDBC的六大步骤 (导入jar包, 加载驱动类,获取连接对象, 获取sql执行器、执行sql与并返回结果, 关闭数据库连接)
2、​封装了一个DBUtil 类, 通过读取属性文件的方式获取 基础连接信息。
3、​批量添加: 一次性可执行多个添加记录 ,将多个sql语句在当前这次连接中执行完毕。

    // 设置部门集合
        List<Dept> list = new ArrayList<>();
        list.add(new Dept(60,"市场部","武汉市"));
        list.add(new Dept(70,"研发部","武汉市"));
        list.add(new Dept(80,"教学部","武汉市"));

          //通过DBUtil获取数据库连接
        Connection conn = DBUtil.getConn();
        String sql="insert into dept(deptno,dname,loc) values (?,?,?)";
          //获取预编译sql执行器
        PreparedStatement ps = conn.prepareStatement(sql);
        //批量设置该条sql语句的 参数
        for(Dept dept : list){
            //设置参数
            ps.setInt(1,dept.getDeptno());
            ps.setString(2,dept.getDname());
            ps.setString(3,dept.getLoc());
            // 将设置好的参数 先放入批量添加的容器中
            ps.addBatch();
            //  对于完整的sql语句 可以用有参的
           // ps.addBatch(sql);
        }
        // 执行sql语句  返回每一行sql语句影响的行数  ,
        int [] counts = ps.executeBatch();
        System.out.println("结果长度:"+ counts.length);
        System.out.println("结果:"+ Arrays.toString(counts));
        //关闭sql语句
        DBUtil.closeAll(conn,ps,null);


二、结果集的元数据:

columnCount 结果集的列数
columnName 列的名称 // select columnName as columnLabel…
columnLabel 列的别名(label)
columnClassName 列在Java中对应的类型(可配合Class.forName(String className)获取Class类型的返回值)
columnType 列在数据库中的类型(数值编号)
columnTypeName 列在数据库中的类型名称
columnDisplaySize 列大小

结果集(ResultSet)和结果集元数据(ResultSetMetaData)同为JDBC标准中的接口|标准。
java.sql.ResultSet
java.sql.ResultSetMetaData

三、Class反射

1、为什么需要使用反射
​由于之前创建对象的过程 ,是已知这个类,然后对类进行编译,编译通过之后才可以创建对象, 现在可能出现 “未知的类” 只有“包名+类名” ,在运行期间才知道 该类是否存在,并动态创建该类的对象。 这时 创建对象的过程 可以通过反射的方式 完成。

​反射机制的定义: 对于任意一个类,都可以在运行期间,动态的创建该类的对象,能知晓该对象的属性和方法,并动态调用属性 和方法 ,这个过程就是Java的反射机制

​对于任意类 都存在一个该类的Class类型 ,如何获取类的Classs类型

方式一: Class cls = Class.forName("类的全类名")

方式二: Class cls = 类名.class;

方式三: Class cls = 类的对象名.getClass()

常用API

Construct:

​cls.getConstructor(int.class , String.class); 根据参数类型和个数 获取cls 对应的 构造器对象

Field : 属性对应的类型

​getDeclareFields () : 获取所有声明的属性 (包括 任何修饰符,不包括private修饰)

​getFields(): 获取所有声明的public修饰的属性

getDeclareFiled(String name): 根据属性名获取属性对象

getField(String name):根据属性名获取属性对象 (必须是共有的 )

Method : 方法对应的类型

​getDeclaredMethods() : 返回当前类的自己声明的方法

​getMethods() :返回所有的方法(包括父类的)

​invoke(obj,参数值) :调用该方法

​getMethod(“方法名” ,参数值):根据方法名返回Method

四、反射封装(增删改查)

preparedStatement的作用:

1、提前传入sql,执行的时候,不传入sql
2、支持传入sql中的参数
3、解决sql注入逻辑漏洞
4、提高执行效率

Object ...params(可变形参数组) 作用:在调用函数时,可以传入任意个任意类型的参数

标题查询多行的封装

//查询多行多列
    public static <T> List<T> list(String sql,Class<T> c,Object...params){
        //创建一个集合,存放所有的对象
        List<T> tList=new ArrayList<>();
        try {
            //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

            //3、定义sql

            //4、需要创建statement
            var st = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                st.setObject(i+1,params[i]);
            }
            //5、statement 执行sql,返回 结果集
            var rs = st.executeQuery();
            //结果集rs得到结果集元数据
            ResultSetMetaData md=rs.getMetaData();
            //获取结果集总列数
            var columnCount = md.getColumnCount();
            //6、解析rs
            while (rs.next()) {//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
                //根据每一行数据,封装成一个实体对象
                T t = c.newInstance();
                // 1、取出某一行的每个数据,封装到对象t的属性中
                for (int i = 1; i <= columnCount; i++) {
                    //通过列的序号,获取每一列的值
                    var value = rs.getObject(i);
                    if (value!=null){
                        //通过列的序号,获取每一列的列名
                        var columnName = md.getColumnName(i);
                        //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
                        var f = c.getDeclaredField(columnName);
                        //赋予私有属性的赋值权限
                        f.setAccessible(true);
                        //使用反射,把value给到对象t的属性中
                        f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
                    }
                }
                //把对象存入集合中
                tList.add(t);
            }
            //7、关闭资源
            st.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return tList;
    }

查询一行的封装

 //查询一行
    public static <T> T selectRow(String sql,Class<T> c,Object...params){
        //创建一个集合,存放所有的对象
        List<T> tList=new ArrayList<>();
        try {
            //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

            //3、定义sql

            //4、需要创建statement
            var st = conn.prepareStatement(sql);
            //执行前给sql传递参数
            for (int i = 0; i < params.length; i++) {
                st.setObject(i+1,params[i]);
            }
            //5、statement 执行sql,返回 结果集
            var rs = st.executeQuery();
            //结果集rs得到结果集元数据
            ResultSetMetaData md=rs.getMetaData();
            //获取结果集总列数
            var columnCount = md.getColumnCount();
            //根据每一行数据,封装成一个实体对象
            //6、解析rs
            T t=null;
            if (rs.next()) {//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
                t = c.newInstance();
                // 1、取出某一行的每个数据,封装到对象t的属性中
                for (int i = 1; i <= columnCount; i++) {
                    //通过列的序号,获取每一列的值
                    var value = rs.getObject(i);
                    if (value!=null){
                        //通过列的序号,获取每一列的列名
                        var columnName = md.getColumnName(i);
                        //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
                        var f = c.getDeclaredField(columnName);
                        //赋予私有属性的赋值权限
                        f.setAccessible(true);
                        //使用反射,把value给到对象t的属性中
                        f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
                    }
                }
            }
            //7、关闭资源
            st.close();
            conn.close();
            return t;
        } 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 {
            //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

            //3、定义sql

            //4、需要创建statement
            var st = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                st.setObject(i+1,params[i]);
            }
            //5、statement 执行sql,返回 结果集
            var rs = st.executeQuery();
            //结果集rs得到结果集元数据
            ResultSetMetaData md=rs.getMetaData();
            //获取结果集总列数
            var columnCount = md.getColumnCount();
            //6、解析rs
            while (rs.next()) {//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行




                //通过列的序号,获取每一列的值
                T t = (T) rs.getObject(1);

                //把对象存入集合中
                tList.add(t);
            }
            //7、关闭资源
            st.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return tList;
    }

查询单个的封装

  //查询单个
    public static <T> T selectOne(String sql,Class<T> c,Object...params){
        try {
            //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

            //3、定义sql

            var st = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                st.setObject(i+1,params[i]);
            }
            //5、statement 执行sql,返回 结果集
            var rs = st.executeQuery();
            //结果集rs得到结果集元数据
            ResultSetMetaData md=rs.getMetaData();
            //获取结果集总列数
            var columnCount = md.getColumnCount();
            //6、解析rs
            T t=null;
            if (rs.next()) {

                t = (T) rs.getObject(1);
            }

            //7、关闭资源
            st.close();
            conn.close();
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

增删改封装方法

//增删改
    public static int  update(String sql,Object...params){
        try {
            //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

            //3、定义sql

            //4、需要创建statement
            var st = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                st.setObject(i+1,params[i]);
            }
            //5、statement 执行sql,返回 结果集
            var i = st.executeUpdate();

            //7、关闭资源
            st.close();
            conn.close();
            return i;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

总的来说,封装只是为了让代码变得更简洁,为后面的开发做铺垫!文章来源地址https://www.toymoban.com/news/detail-546022.html

到了这里,关于JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】—— 单链表的增删改查

    ❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢! 📕该篇文章收录专栏—数据结构 目录 方法重写 重写条件 重写好处 重写演示 单链表 介绍 单链表的增删改查

    2024年02月02日
    浏览(47)
  • 【数据库】MySQL表的增删改查

    注释:在SQL中可以使用“–空格+描述”来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写 语法: 案例: 2.1 单行数据 + 全列插入 2.2 多行数据 + 指定列插入 查询(Retrieve) 语法: 案例: 3.1 全列查询 3.2 指定列查询 3.3 查询字段为

    2024年03月23日
    浏览(50)
  • 【MySql】数据库的增删改查

    本篇的主要目的:对于数据库如何去增加删除查询修改 主要细节在于选项问题,编码选项 说明: 大写的表示 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 查看当前用户数据库的列表show databases; 创建数据库create database db_name; 当

    2024年02月12日
    浏览(47)
  • layui实现(学生)数据的增删改查

    查询 添加: 点击添加按钮: 添加成功! 修改: 点击编辑按钮: 修改信息数据,点击提交: 修改数据成功! 删除: 点击删除按钮: 点击确定,删除成功! 分页: 由于数据有限,选择5条/页,进行分页: 批量删除: 首先勾选想要删除的行,点击批量删除: 删除成功: 补

    2023年04月09日
    浏览(39)
  • MySQL数据库,表的增删改查详细讲解

    目录 1.CRUD 2.增加数据 2.1创建数据 2.2插入数据 2.2.1单行插入 2.2.2多行插入 3.查找数据 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.3.1表达式不包含字段 3.3.2表达式包含一个字段 3.3.3表达式包含多个字段  3.4起别名 3.5distinct(去重) 3.6order by(排序) 3.6.1某字段默认排序 3.6.2某字

    2023年04月14日
    浏览(43)
  • spring整合mybatis(实现数据的增删改查)

    一、专业术语解释 1、spring:是分层的Java SE/EE应用full - stack 轻量级开源框架 , 以IoC(控制反转)和AOP(面向切面编程)为内核 ,提供展现层spring MVC 和 spring JDBC等众多企业级应用技术。 2、mybatis:是一个持久层框架。原始连接数据库是通过JDBC的API来操作的,过程繁琐,而 mybati

    2024年02月08日
    浏览(44)
  • 【数据库】 | 数据库的增删改查CRUD(基础篇)

    🎗️ 主页:小夜时雨 🎗️ 专栏:MySQL数据库 🎗️ 乾坤未定,你我皆黑马 1.1 显示当前的数据库 SHOW DATABASES; //注意sql语句不区分大小写 1.2 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name (db_name 是创建数据库的名字) 1.3 使用数据库 use 数据库名; 1.4 删除数据库 DROP DATABASE [IF

    2023年04月24日
    浏览(44)
  • 7-数据结构-(带头节点)单链表的增删改查

    问题:          单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。 带头节点是为了使在空表时的操作更统一。如果不带头节点,空表插

    2024年02月14日
    浏览(52)
  • ​​Layui之用户管理实例(对数据的增删改查)

    目录 ​编辑一、R工具介绍() ​编辑二、数据表的增删改查 ​编辑2.1我们先得从查询数据库的语句入手 2.2优化dao类 2.4UserAction类 2.5前台的页面实现增删改查操作 2.6 userManage页面JS          2.7user新增、修改iframe层js 前言        上一篇我分享了使用layui菜单栏的动态添

    2024年02月16日
    浏览(38)
  • MySQL | 数据库的管理和操作【表的增删改查】

    第一章:MySQL | 数据库的管理和操作(基本介绍) 第二章:MySQL | 数据库的基本操作和表的基本操作 第三章: MySQL | 数据库的表的增删改查 第四章:MySQL | 数据库的表的增删改查【进阶】【万字详解】 CRUD : Create, Retrieve,Update,Delete 新增数据 查询数据 修改数据 删除数据 注释:

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包