一、使用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;
}

总的来说,封装只是为了让代码变得更简洁,为后面的开发做铺垫!

JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装的更多相关文章

  1. JDBC基础学习(一)—JDBC的增删改查

    一.数据的持久化     持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各 ...

  2. 纯Java JDBC连接数据库,且用JDBC实现增删改查的功能

    Java JDBC连接数据库 package cn.cqvie.yjq; import java.sql.*; /** * 注册数据库的驱动程序,并得到数据库的连接对象 * @author yu * ...

  3. Oracle使用JDBC进行增删改查 表是否存在

    Oracle使用JDBC进行增删改查 数据库和表 table USERS (   USERNAME VARCHAR2(20) not null,   PASSWORD VARCHAR2(20) ) a ...

  4. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  5. MySQL的安装+可视化工具+JDBC的增删改查

    1.Mysql和可视化工具的安装 安装包网上有很多资源.这里推荐一个我一直在用的学习网站,上面有提供安装包和详细的说明. http://how2j.cn/k/mysql/mysql-install/3 ...

  6. MySQL之JDBC编程增删改查

    MySQL之JDBC 一.JDBC是什么 Java DatabaseConnectivity (java语言连接数据库) 二.JDBC的本质 JDBC是SUN公司制定的一套接口(interface). ...

  7. 【温故知新】Java web 开发(四)JSTL 与 JDBC 的增删改查

    本篇开始使用 jstl 这个 jsp 的标签库,在同一个 Servlet 中实现处理 CRUD 请求,以及使用 jdbc 数据库基本操作.然后你会发现 Servlet 和 jdbc 还是有很多不方便之 ...

  8. JDBC第三篇--【事务、元数据、改造JDBC工具类】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...

  9. 夺命雷公狗---Thinkphp----12之文章的增删改查(图片上传和关联查询)

    我们由于表分析的不够完善,所以我们来加多一个tid的字段,到时候主要目的是为了更好的遍历出文章是属于那个分类下的,表如下所示: 那么下一步我们就开始创建一个ArticleController.clas ...

  10. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

随机推荐

  1. FreeSWITCH添加iLBC编码及转码

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 一.安装ilbc库 从第三方库里下载指定版本: git clone https://freeswitch.org/s ...

  2. Java学习笔记14

    1.Arrays类 ​ Arrays类包含用于操作数组的各种方法(如排序和搜索).该类没有构造函数,直接使用类名.方法名()的方法调用需要的方法. 常用方法 方法 作用 public static S ...

  3. 借助 APISIX Ingress,实现与注册中心的无缝集成

    作者张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者. 原文链接 云原生场景下是否需要服务 ...

  4. MySQL-InnoDB磁盘结构

    主要阐述InnoDB存储引擎(MySQL5以后的默认引擎). 数据库中最基本的组成结构是数据表,视觉上的表和其对应的磁盘结构如下: 此图参考了厦门大学课堂:MySQL原理 .但是视频中一些更多细节没有 ...

  5. Locust 界面简介(非使用级)

    一.认识Locust 1.简介 Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在 ...

  6. 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC ...

  7. 搭建一个简易框架 3秒创建一个WebApi接口

    前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {"selectA1":[{"Name":"156 ...

  8. JVM面试和学习中需要注意的部分

    内存结构 1.方法区用来存储类加载的数据,例如类的名称,方法入口 2.JVM虚拟机栈用于存储线程,包括局部变量和方法参数 3.堆内存用来存储对象 4.方法区的规范实现:永久代和元空间 5.方法区 JV ...

  9. 2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案

    2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案, ...

  10. 如何从命令行启动 CST 软件?

    众所周知,CST 一贯以优良的界面友好性而著称,用户可以方便快捷的在其 windows 式的界面下进行建模.仿真及结果查看和处理等操作.然而,在某些特定情况下,也需要 CST 进行后台式的运行,比如需 ...