JDBC
- 资源共享
- 一、概念
- 为什么要用JDBC连接池?
- 二、快速入门
- 2.1 实例
- 2.2 详解各个对象
- 1.DriverManager :驱动管理对象
- 2.connection :数据库连接对象
- 3.statement :执行sql的对象
- 4.Resultset :结果集对象
- 查询练习:
- Emp类
- 查询方法
- 5.Preparedstatement :执行sql的对象
- 1. SQL注入问题
- 解决方案
- 三、JDBC工具类
- 目的
- 分析
- 抽取一个方法释放资源
- 使用工具类
- 登陆练习
- 数据库
- 代码
- 四、JDBC控制事务
- 转账实例
- 五、数据库连接池
- 概念
- 好处
- 实现
- 一、C3P0:数据库连接池技术
- 1.导入jar包
- 2.定义配置文件
- 3.创建核心对象
- 4.获取连接
- 二、Druid:数据库连接池实现技术
- 1.写入jar包
- 2.定义配置文件
- 3.获取数据库连接池对象:通过工厂类来获取
- 4.获取连接
- 5.实例
- 三、Druid工具类
- 实例
- 测试
- 查看数据库
- 四、Spring JDBC
- 概念
- 什么是jar包?
- 步骤
- 1.导入jar包
- 2.创建JdbcTemplate对象。
- 3.调用JdbcTemplate的方法来完成CRUD的操作
- 实例
- 查看数据库数据
- DML练习
- 代码
- DQL练习
- RowMapper的使用实例
- 1.RowMapper的基本使用
- 1.1 BeanPropertyRowMapper
- 代码如下
- 代码
- 输出结果
资源共享
最新c3p0所有jar包(完整版)
百度网盘下载链接:https://pan.baidu.com/s/1o9cBkMVb_kZmAksZjjoZYg 密码:c7pr
阿里druid数据连接池jar包(完整版)
百度网盘地址:https://pan.baidu.com/s/1U9v5c_DindqXva92JeRVJQ 密码:nquq
一、概念
JDBC全程:
Java Database Connectivity java数据库连接
JDBC本质:其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
为什么要用JDBC连接池?
对数据库进行频繁连接、开启和关闭操作,会造成数据库资源的浪费,十分影像数据库的性能。
二、快速入门
步骤:
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
- 右键 --> Add As Library
- 注册驱动
- 获取数据库连接对象
- 定义sql
5.获取执行sql语句的对象statement
6.执行sql,接收返回的结果
7.处理结果
8.释放资源
jar包资源
https://cdn.mysql.com/archives/mysql-connector-java-5.1/mysql-connector-java-5.1.37.zip)
2.1 实例
2.2 详解各个对象
1.DriverManager :驱动管理对象
功能:
1.注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager写代码使用:class.forName( “com.mysql.jdbc.Driver” );
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
注意: mysq15之后的驱动jar包可以省略注册驱动的步骤。2.获取数据库连接
Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/db2”, “root”, “root”);
url:指定连接的路径
细节∶如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql///数据库名
user:用户名
password:密码
2.connection :数据库连接对象
功能:
1.获取执行sql 的对象
statement createstatement()
Preparedstatement preparestatement(string sql)2.管理事务∶
开启事务: setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务: commit()
回滚事务:rollback()
3.statement :执行sql的对象
1.执行sql
- boolean execute(String sql) : 可以执行任意的sql,了解即可
- int executeUpdate(String sql) : 执行DML (insert、 update、 delete) 语句、DDL(create, alter、 drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功返回值>0的则执行成功,反之,则失败。- ResultSet executeQuery(String sql) : 执行DQL (select)语句
2.练习
1.添加一条记录
2.修改记录
3.删除记录
为了代码健壮性,进行捕获异常
String sql = "update account set balance = 40 where id = 1"; String sql = "insert into account values(3,'ws',1002)"; String sql = "delete from account where id = 3";
修改后的代码
4.Resultset :结果集对象
结果集对象,封装查询结果
1.next();游标向下移动一行,判断当前行是否是最后一行末尾
它的返回值是布尔值
2.getXXX:获取数据,XXX代表数据类型int getInt() String getString()
使用步骤:
- 游标向下移动一行
- 判断是否有数据
- 获取数据
正确用法
查询练习:
查询表的数据封装为对象,返回一个列表打印处理
思路:
定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
1.根据表的结构定义一个emp类
2.查询的结果封装为emp类的对象
3.定义方法public list findAll(){}查询表中数据并封装为集合
Emp类
查询方法
5.Preparedstatement :执行sql的对象
1. SQL注入问题
用户随便输入密码:a’ or ‘a’ = 'a
拼接后的sql:select * from user where username = ‘dafsdfda’ and password = ‘a’ or ‘a’ = 'a’
请输入username:
fassag
请输入password
a’ or ‘a’ = 'a
Success!!!
解决方案
通过Preparedstatement :执行sql
它是预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)
参数使用?作为占位符
全部的流程为:
步骠:
1.导入驱动jar包mysql-connector-java-5.1.37-bin.jar2.注册驱动
3.获取数据库连接对象connection
4.定义sql
注意:sql的参数使用?作为占位符。如: select * from user where username ? and password ?;5.获取执行sql语句的对象preparedstatement Connection.preparestatement(string sql)
6.给?赋值:
*方法: setXXX(参数1,参数2)
参数1:?的位置编号 从1开始参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8.处理结果
9.释放资源
三、JDBC工具类
目的
简化书写
分析
1.注册驱动也抽取
2.抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还带保证工具类的通用新
解决:properties配置文件
抽取一个方法释放资源
使用工具类
登陆练习
需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
select * from user where username = “” and password = “”;
如果这个sql有查询结果,则成功反之失败
数据库
更改配置文件即可
代码
四、JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
1.开后事务
2.提交事务
3.回滚事务
3.使用connection对象来管理事务
开启事务: setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开后事务
在执行sql之前开启事务
提交事务: commit()
当所有sql都执行完提交事务
回滚事务: rollback()
在catch中回滚事务
转账实例
金额没有发生变化
五、数据库连接池
概念
其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被初始化,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象返回给容器
好处
节约资源
高效
实现
标准的接口:DataSource javax.sql包下的
方法:
获取连接:getConnection()
归还连接:Connection.close().如果连接对象Connection是从连接池中获取的,那么调用Connection.close()不在是关闭连接,而是归还连接
2.这个接口,一般不由人为实现,而是有数据库厂商来实现
C3P0:数据库连接池技术
Druid:数据库连接池实现技术,由阿里提供
一、C3P0:数据库连接池技术
步骤:
1.导入jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.12.jar
还有驱动jar包
2.定义配置文件
名称:c3p0.properties或者c3p0-config.xml
路径:直接将文件放在src目录下即可
3.创建核心对象
数据库连接池对象 ComboPoolDataSource
4.获取连接
getConnection
了解即可
二、Druid:数据库连接池实现技术
1.写入jar包
druid-1.e.9.jar
2.定义配置文件
是properties形式的(properties 性能)
可以叫任意名称,可以放在任意目录下
3.获取数据库连接池对象:通过工厂类来获取
DruidDataSourceFactory
4.获取连接
getConnection
5.实例
三、Druid工具类
1.定义一个类JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
1.获取连接方法:通过数据库连接池获取
2.释放资源
3.获取连接池的方法
实例
详细的注释都写在代码中了!
测试
查看数据库
人直接傻掉,太强了,太tmd的好用了啊!!!!
四、Spring JDBC
概念
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
什么是jar包?
学了这么久要是不知道什么是jar包那就尴尬了啊
jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。 so ga!!!
没错我现在才知道!!![🤦]
步骤
1.导入jar包
2.创建JdbcTemplate对象。
它依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
3.调用JdbcTemplate的方法来完成CRUD的操作
- update():执行DML语句
- queryforMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合
- 注意:这个方法查询的结果集长度只能是1**
- queryforList():查询结果将结果集封装为list集合
- 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
- query():查询结果,将结果封装为JavaBean对象
- query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 - new BeanPropertyRowiMapper<类型>(类型.class)
- queryForObject:查询结果,将结果封装为对象
- 一般用于聚合函数的查询
实例
注意这个方法的使用,第一个参数是sql语句,第二个是经过preparedstatement封装后的sql语句中的?的值
查看数据库数据
DML练习
需求:
- 修改1号数据的salary 为1000
- 添加一条记录
- 删除刚才添加的记录
- 查询id为1的记录,将其封装为Map集合
- 查询所有记录,将其封装为List
- 查询所有记录,将其封装为Emp对象的List集合
- 查询总记录数
代码
分别对三个单元进行测试
结果如下:
DQL练习
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。 特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性
RowMapper的使用实例
1.RowMapper的基本使用
从数据库查询出来的记录全都被保存在ResultSet结果集中,我们需要将结果集中的数据一条条地获取并设置到具体的实体类上,如此,该实体类才能在接下来的程序中使用。然而问题是,每次都要这么操作实在是太麻烦了,Spring就不应该提供什么功能来替我们做这些事情吗?RowMapper就是实现这个功能的
1.1 BeanPropertyRowMapper
当查询数据库返回的是多列数据,且你需要将这些多列数据映射到某个具体的实体类上
代码如下
代码
输出结果