简单了解JDBC相关操作

JDBC

1、概念

JDBC就是使用java语言操作关系型数据库的一套API,全称java数据库连接。

2、具体步骤

  1. 创建工程,导入驱动jar包
  2. 注册驱动
  3. 获取连接
  4. 定义SQL语句
  5. 获取执行SQL语句的对象
  6. 执行SQL
  7. 处理返回结果
  8. 释放资源
@Testpublic void jdbcTest() throws ClassNotFoundException, SQLException {//获取驱动Class.forName("com.mysql.cj.jdbc.Driver");//建立连接String url = "jdbc:mysql://localhost:3306/test";Connection connection = DriverManager.getConnection(url, "root", "root");//编写SQL语句String sql = "select * from student";//获取执行SQL的对象Statement statement = connection.createStatement();//执行SQLResultSet resultSet = statement.executeQuery(sql);//处理返回结果while(resultSet.next()){System.out.print(resultSet.getInt("id") + "\t");System.out.print(resultSet.getString("name") + "\t");System.out.println(resultSet.getString("num"));System.out.println("-------------------------");}//释放资源resultSet.close();statement.close();connection.close();}

3、API详解

3.1、DriverManager

3.1.1、注册驱动

在上面我们发现,我们注册驱动的时候用的是这行代码

Class.forName("com.mysql.cj.jdbc.Driver");//加载Driver类

我们来看一下Driver的源码,在源码中用一个静态代码块

static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}

那么我们是不是可以这样来注册驱动

DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

我们可以参考 简单了解java代码块,发现静态代码块随着类的加载而加载,上面的写法程序可以运行成功,但是没有必要,因为执行以上代码后,相当于new了两次Driver。我们只需要加载一次Driver类静态代码块就会自动执行,成功注册驱动。

补充:MySQL 5之后的驱动包,可以省略注册驱动的步骤

3.1.2、创建连接
方法
static ConnectiongetConnection(String url, String name, String password)

参数说明:

  1. url:连接路径

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…

示例:jdbc:mysql://127.0.0.1:3306/test

细节:

  • 如果连接的是本机的mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名?参数键值对1/参数键值对2…
  • 如果数据出现乱码需要加上参数:?useUnicode=true&characterEncoding=utf8,表示数据库中的数据以UTF8编码处理数据。
  1. name:用户名
  2. password:账户密码

3.2、Connection

3.2.1、作用
  • 获取执行SQL的对象

普通执行SQL

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PrepareStatement prepareStatement(sql)
补充:SQL注入
1、什么是SQL注入

由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。简单来说就是用户在界面提交数据时,人为的添加一些特殊字符,使得sql语句结构发生了变化,最终在没有用户或者密码的情况下进行登录。

2、PreparedStatement解决SQL注入方案

PreparedStatement是Statement的子接口,可以防止SQL注入问题。可以根据Connection接口中的prepareStatement(sql)方法获得PreparedStatement对象。

注意:sql提前创建好的,sql语句中需要参数。使用?进行占位,比如:

select * from user where username = ? and password = ?;
3、操作步骤

步骤一:

PreparedStatement pstmt = conn.prepareStatement(sql);

步骤二:设置参数(执行sql之前):pstmt.setXxx(int index, 要放入的值),根据不同类型的数据进行方法选择。

参数说明:

第一个参数:int index表示的是问号出现的位置,问号是从1开始计数的

第二个参数:给问号的位置传入值

/*** PreparedStatement*/
public class JDBCDemo1 {@Testpublic void jdbcTest() throws ClassNotFoundException, SQLException {//获取驱动//Class.forName("com.mysql.cj.jdbc.Driver");DriverManager.registerDriver(new Driver());//建立连接String url = "jdbc:mysql://localhost:3306/test";Connection connection = DriverManager.getConnection(url, "root", "root");//编写SQL语句String sql = "select * from student where id = ? or name = ?";//获取执行SQL的对象PreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setInt(1, 1);pstmt.setString(2, "糖魅");//执行SQLResultSet rs = pstmt.executeQuery();//处理返回结果while(rs.next()){System.out.print(rs.getInt("id") + "\t");System.out.print(rs.getString("name") + "\t");System.out.println(rs.getString("num"));System.out.println("-------------------------");}//释放资源rs.close();pstmt.close();connection.close();}
}
  • 事务管理

MySQL事务管理

开启事务:BEGIN; START TRANSACTION

提交事务:COMMIT;

回滚事务:ROLLBACK

MySQL默认自动提交事务

JDBC事务管理:Connection接口定义了三个对应的方法

开启事务:SetAutoCommit(boolean autoCommit):true为自动提交事务、false为手动提交事务,即开启事务

提交事务:commit()

回滚事务:rollback()

3.3、Statement

3.3.1、作用

执行SQL语句,具体为一下两种:

  • int executeUpdate(sql):执行DMLDDL语句

    返回值:

    1、DML语句影响的行数

    2、DDL语句执行后,执行成功返回0

  • ResultSet executeQuery(sql):执行DQL语句

    返回值:ResultSet结果集对象

3.4、ResultSet

3.4.1、原理
  • ResultSet内部有一个指针,刚开始记录开始位置
  • 调用next方法,ResultSet内部指针会移动到下一行数据
  • 我们可以通过ResultSet得到一行数据getXxxx得到某列数据(例如getInt、getString等)
3.4.2、使用步骤
  1. 游标向下移动一行,并判断该行是否有数据:next()
  2. 获取数据:getXxx(参数)
while(rs.next){rs.getXxx(参数);
}

4、JDBC工具类的编写和使用

抽取其他jdbc代码中的重复代码

示例:

工具类:

public class JDBCUtil {//注册驱动所需参数private static final String DRIVER = "com.mysql.cj.jdbc.Driver";//建立连接所需参数private static final String URL = "jdbc:mysql://localhost:3306/test";private static final String NAME = "root";private static final String PASSWORD = "root";//注册驱动static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//建立连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, NAME, PASSWORD);}//释放资源public static void close(Statement stmt, Connection conn) {try {if (stmt != null) {stmt.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (conn != null) {conn.close();}} catch (SQLException e) {throw new RuntimeException(e);}}public static void close(ResultSet rs, Statement stmt, Connection conn) {try {if (rs != null) {rs.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (stmt != null) {stmt.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (conn != null) {conn.close();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

运用工具类:

public class JDBCDemo1 {@Testpublic void jdbcTest() throws ClassNotFoundException, SQLException {//注册驱动并获取连接Connection connection = JDBCUtil.getConnection();//编写SQL语句String sql = "select * from student where id = ? or name = ?";//获取执行SQL的对象PreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setInt(1, 1);pstmt.setString(2, "糖魅");//执行SQLResultSet rs = pstmt.executeQuery();//处理返回结果while (rs.next()) {System.out.print(rs.getInt("id") + "\t");System.out.print(rs.getString("name") + "\t");System.out.println(rs.getString("num"));System.out.println("-------------------------");}//释放资源JDBCUtil.close(rs, pstmt, connection);}
}

5、三层架构模型

5.1、开发中常用的三层架构模型

web层
  1. 接收客户发送的信息
  2. 把接收的数据封装成对象
  3. 调用Service层方法并传递数据对象
  4. 接收Service层方法对数据处理的结果,向客户进行反馈
Service层

处理业务逻辑并调用Dao层的方法

Dao层

和数据库交互(基层利用jdbc技术)

5.2、分层的目的

解耦

就是降低代码之间的依赖关系

可维护性

那一层出问题,直接找那一层

可扩展性

那一层需要添加代码,直接添加即可

可重用性

一个方法可以被其他层重复利用

模拟示例:

模拟web层

public class FindStudent {@Testpublic void test(){//创建Student类Student student = new Student();String name = "糖解";String num = "2021110614";boolean judge = false;//将数据进行封装student.setName(name);student.setNum(num);//判断是否存在该学生judge = StudentService.findStudent(student);if(judge){System.out.println("该学生存在~");}else{System.out.println("不存在该学生");}}
}

模拟service层

public class StudentService {public static boolean findStudent(Student student){Student stu = StudentDao.res(student);if(stu != null){return true;}return false;}
}

模拟dao层

public class StudentDao {public static Student res(Student student){//System.out.println(student.getName() + "   " + student.getName());Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;Student stu = null;try {//创建数据库连接conn = JDBCUtil.getConnection();//编写sqlString sql = "select * from student where name = ? and num = ?";//执行sqlpstmt = conn.prepareStatement(sql);pstmt.setString(1,student.getName());pstmt.setString(2,student.getNum());//处理结果rs = pstmt.executeQuery();if(rs != null && rs.next()){int id = rs.getInt("id");String name = rs.getString("name");String num = rs.getString("num");stu = new Student(id, name, num);}} catch (SQLException e) {throw new RuntimeException(e);}finally {JDBCUtil.close(rs, pstmt, conn);}return stu;}
}

6、数据库连接池

6.1、概述

  1. 数据库连接池是一个容器,负责分配、管理数据库连接
  2. 它允许程序重复使用一个现有的数据库连接,而不是在重新创建一个
  3. 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
  4. 好处:
  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

6.2、实现

6.2.1、标准接口:DataSource
Connection getConnection();
6.2.2、学习:Druid(德鲁伊)
1.基本使用

创建数据库连接池对象

DataSource ds = DruidDataSourceFactory.createDataSource(properties对象);

我们可以看到Druid连接池在创建的时候需要一个Properties对象来设置参数,所以我们使用properties文件来保存对应的参数。

Druid连接池的配置文件名字随意,放到src目录或者项目根目录下加载“druid.properties”文件内容(示例):

#配置数据库连接相关参数
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false
username=root
password=root#配置连接池相关参数
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200

如何加载配置文件呢?请看下方:

//InputStream in = DruidDemo.class.getClassLoader().getResourceAsStream("druid,properties");
//Properties prop = new Properties();
//prop.load(in);Properties prop = new Properties();
prop.load(new FileInputStream("druid.properties"));

从数据库连接池中,获取Connection对象

Connection conn = ds.getConnection();

接下来就是jdbc的常规操作了

public class DruidDemo {@Testpublic void druidTest() throws Exception {//导入jar包//加载properties文件Properties prop = new Properties();prop.load(new FileInputStream("druid.properties"));//利用Druid工厂类,获取数据库连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//从连接池中获取一个Connection对象Connection conn = dataSource.getConnection();//编写sql语句String sql = "select * from student";//获取执行sql的对象PreparedStatement pstm = conn.prepareStatement(sql);//执行sqlResultSet rs = pstm.executeQuery();//处理结果while(rs.next()){System.out.print(rs.getInt("id") + "   ");System.out.print(rs.getString("name") + "   ");System.out.println(rs.getString("num"));System.out.println("---------------------");}//释放资源rs.close();pstm.close();//将连接归还连接池conn.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中列表的常用操作

列表的基本使用 arr []# append arr.append(1) print(arr)arr.append("a") print(arr)列表的增删改查 arr []arr.append(1) arr.append(2) arr.append(3)print(arr)# pop arr.pop() print(arr)# update arr[0] 333 print(arr)# get print(arr[0])列表的复制 ar…

Qt Quick介绍

一.Qt Quick介绍 Qt Quick 是 QML 类型和功能的标准库,包括视觉类型、交互式类型、动画、模型和视图、粒子效果和着色效果 Qt Quick 使用 QML 作为声明语言,来设计以用户界面为中心的应用程序 QML 包含大量使用手机移动设备的功能模块,比如基…

python-邮票组合问题

[题目描述] 某人有四张3分的邮票和三张5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?输入格式: 此题无输入。输出格式: 输出可以得到不同邮资的数量。 样例输入 无样例输出 19数据范围: 对于100%的…

使用invokeMethod异步执行QT函数操作

在QT窗口初始化加载的时候如果执行比较耗时的操作,很容易阻塞主界面的显示,导致用户体验差。这时候一般我们可以通过定时器延时加载对应的操作。其实使用QMetaObject::invokeMethod方法也可以实现异步加载,操作更简单效果更好。两种方式如下: //异步执行loadData函数 //Qt:…

【抽代复习笔记】21-群(十五):循环群引理及定义

例4:证明,如果σ(i1 i2 … ik)是Sn中的一个k-循环,而r∈Sn,则rσr^(-1)也是一个k-循环,且rσr^(-1)(r(i1),r(i2),…,r(ik))。 证:①设σ(i1 i2 … ik)(i1 ik)(i1 ik-1)…(i1 i2), 则rσr^(-1)…

触想工业一体机在智慧医疗智能采血管理系统中的应用

一、行业发展前景 作为医院重点科室之一,传统的检验科采血环节存在诸多痛点,特别在备管阶段,大量患者信息的核对、试管条码打印、选管、贴标等繁琐步骤均依赖人工操作,工作强度大、效率低,易出错。 随着智慧医院建设的…

笔记-python里面的xlrd模块详解

那我就一下面积个问题对xlrd模块进行学习一下: 1.什么是xlrd模块? 2.为什么使用xlrd模块? 3.怎样使用xlrd模块? 1.什么是xlrd模块? ♦python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel&…

秋招突击——6/21——新作{两两交换链表中的节点,K个一组反转链表}

文章目录 引言新做删除有序数组中的重复项个人实现 K 个一组翻转链表个人实现参考代码 总结 引言 上午完全去听讲座了,听了三场,拿了三个讲座单,从九点一直到十二点。笔记本电脑插电才能用,就没带,所以没有进行复习。…

qt开发-08_layout 布局

Qt 提供了非常丰富的布局类,基本布局管理类包括:QBoxLayout、QGridLayout、QFormL ayout 和 QStackedLayout。这些类都从 QLayout 继承而来,它们都来源于 QObject(而不是 QWi dget)。创建更加复杂的布局,可…

设置PowerShell打开默认路径是桌面,方便在桌面运行py程序

1.打开 PowerShell 以管理员身份运行。右键点击 PowerShell 图标,然后选择“以管理员身份运行”。 查看当前执行策略: Get-ExecutionPolicy2.更改执行策略: 为了允许脚本运行,你可以将执行策略设置为 RemoteSigned 或 Unrestricted。下面的命令将执行策略更改为 RemoteS…

广东省建筑施工安管人员考核报名流程及照片处理方法

广东省建筑施工企业安管人员考核工作现已全面启动,这对于提升建筑行业的安全生产管理水平至关重要。为了确保广大考生能够顺利报名并参与考核,本文精心梳理了考核报名流程,并提供了证件照的规范处理方法。同时,针对证件照这一关键…

windows端口被占用问题,杀死进程

描述:端口被占用 在使用IntelliJ IDEA运行程序时,可能会遇到端口占用的情况,这通常由以下几个原因引起: 1、同一程序多次启动:如果你没有正确关闭之前运行的程序实例,再次尝试运行相同的程序时,…

mysql 库存表 累计 sql语句 第一方法

这是一个表,要求累计金额 。表名t ,字段lsh,shangpinbh,jine。 流水号商品编号金额累计金额1100125002500210013000550031004400095004100610001050051007200012500 select lsh,shangpinbh,jine,(select sum(jine) from t where …

使用 ProGuard 混淆你的 Java 代码

使用 ProGuard 混淆你的 Java 代码 一、简介二、配置pom三、使用混淆后的 JAR 文件四、总结 一、简介 ProGuard 是一款流行的 Java 代码混淆工具,可以混淆和优化你的代码,使其更难被反编译和分析。混淆通过重命名类、方法和变量名称来实现,从…

短剧app系统开发源码对接聚合广告

短剧APP是一种专门用于观看、创作和分享短剧的移动应用程序。它通常集成了视频播放、社交互动、内容创作等功能,为用户提供了一个便捷的短剧观赏和交流的平台。 短剧APP的特点如下: 时长短:短剧APP提供的短剧内容通常精简扼要,每…

QMetaEnum 使用详解

QMetaEnum 是 Qt 框架中的一个类,它提供了关于枚举类型的元数据信息。以下是 QMetaEnum 使用的详解: 1. 自定义枚举类型 在使用 QMetaEnum 之前,你需要先定义一个枚举类型,并且确保它是 QObject 的子类的一部分。你可以使用 Q_E…

兴顺物流管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,驾驶员管理,物流资讯管理,车辆管理,基础数据管理 员工账户功能包括:系统首页,个人中心,物流资讯管理&…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面,面的很凄惨,不过无所谓了,我已经尽力了。上午都在整理的面经,没有复习算法,而且这两天要弄一下论文,二十号就要提…

C#使用Scoket实现服务器和客户端互发信息

20240616 By wdhuag 目录 前言: 参考: 一、服务器端: 1、服务器端口绑定: 2、服务器关闭: 二、客户端: 1、客户端连接: 2、客户端断开: 三、通讯: 1、接收信…