数据库连接池原理
数据库连接池实现
- 标准接口:DataSource
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取链接
- 德鲁伊配置文件 druid.propertie
- driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///sell?useSSL=false&&useServerPrepStmts=true
username=root
password=1234
# 初始化链接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象,使用DruidDataSourceFactory工厂模式获取配置文件
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
TIps:// 查找当前文件路径(E:\IdeaProjects\jdbcdemo)
System.out.println(System.getProperty(“user.dir”));
idea快捷键 左键+alt可以单边选择右边内容。将整体选中行数可以直接方向键挪动位置
自动格式化代码:ctrl+alt+L
商品品牌数据的增删改查操作
- 查询:查询所有数据
- 添加:添加品牌
- 修改:根据id修改
- 删除:根据id删除
操作步骤
- 创建数据库表
drop table if exists _tb_brand;
_create table _tb_brand(
id _int primary key auto_increment,
brandname _varchar(20),
companyname _varchar(20),
ordered int,
description varchar(100),
status int
);
insert into _tb_brand(brand_name,company_name,ordered,_description,status)
values (‘三只松鼠’,’三只松鼠股份有限公司’,5,’好吃不上火’,0),(‘华为’,’华为有限公司’,500,’牛逼的华为’,1),(‘三星’,’三星爆炸有限公司’,600,’炸你全家’,1);
- 创建java实体类
// 在实体类中基础数据类型,应该使用包装类型,int有默认值为0
private Integer status;
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;
-
查询所有数据的步骤
- 获取Connecction DataSourcce
- 定义SQL语句: select * from tb_brand
- 获取PreparedStatement 预编译SQL对象
- 设置预编译sql参数:(因为查询所有数据所以不需要参数)
- 执行sql
- 处理结果:List
- 释放资源_public void query() throws Exception{
// 导入Druid 包
// 定义配置文件
// 加载配置文件
Properties prop = new Properties();
// 使用IO流加载配置文件写入
prop.load(new FileInputStream(“src/druid.properties”));
// 使用druid工厂链接加载的配置文件
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库链接
final Connection connection = dataSource.getConnection();
// 注入预编译sql语句
String sql = “select from tb_brand”;
final PreparedStatement ps = connection.prepareStatement(sql);
// 执行sql
final ResultSet resultSet = ps.executeQuery();
Brand brand = null;
List<Brand> list = new ArrayList<>();
while (resultSet.next()) {
// 获取数据
final int id = resultSet.getInt(“id”);
final String brandName = resultSet.getString(“brand_name”);
final String companyName = resultSet.getString(“company_name”);
final String description = resultSet.getString(“description”);
final int ordered = resultSet.getInt(“ordered”);
final int status = resultSet.getInt(“status”);
// 封装对象,将数据库数据给dao层
brand = new Brand();
brand.setId(id);
brand.setBrandName(brandName);
brand.setDescription(description);
brand.setOrdered(ordered);
brand.setCompanyName(companyName);
brand.setStatus(status);
// 装载到集合中
list.add(brand); }
System.out.println(list);
resultSet.close();
ps.close();
connection.close(); *}
查询结果三要素:
- 查询语句SQL
- 参数: 需要/不需要
-
添加:添加数据
添加SQL语句
- insert into tb_brand(x,xx,xxx.)values(?,?,?)
- 是否需要参数?,需要除了id以外都要填入
- 如何封装?boolean 返回添加成功或者失败
_@Test
_public void update() throws Exception{
// 接收页面提交的参数
String brandName = “信息中心”;
String companyName = “中国石化”;
String description = “牛逼”;
int order = 4;
int status = 1;
// 导入Druid 包
// 定义配置文件
// 加载配置文件
Properties prop = new Properties();
// 使用IO流加载配置文件写入
prop.load(new FileInputStream(“src/druid.properties”));
// 使用druid工厂链接加载的配置文件
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库链接
final Connection connection = dataSource.getConnection();
// 注入预编译添加sql语句
String sql = “insert into tb_brand(brand_name,company_name,ordered,description,status)values(?,?,?,?,?)”;
// 执行预编译sql语句
PreparedStatement ps = connection.prepareStatement(sql);
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setString(1,brandName);
ps.setString(2, companyName);
ps.setString(4,description);
ps.setInt(5,status);
ps.setInt(3,order);
// 执行预编译sql语句不需要参数,PreparedStatement的增删改方法是executeUpdate()
final int update = ps.executeUpdate();
// 封装语句返回boolean类型,判断该语句影响的数据库行数
System.out.println(update>0);
// 关闭资源
ps.close();
connection.close(); }
修改:修改数据
- 修改SQL语句
- update tb_brand set(x,xx,xxx.) where id = ?
- 是否需要参数?,需要所有参数包括对应的id
- 如何封装?boolean 返回添加成功或者失败
_@Test
_public void add() throws Exception {
int id = 4;
String brandName = “通信中心”;
String companyName = “中国石油”;
String description = “垃圾”;
int order = 4;
int status = 1;
// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection conn = dataSource.getConnection();
// 执行sql语句
String sql = “update tb_brand set brand_name = ?,company_name = ?,ordered = ?,description = ?,status = ? where id = ?”;
// 执行预编译sql语句
PreparedStatement ps = conn.prepareStatement(sql);
// 设置修改的参数在预编译语句中
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setString(1,brandName);
ps.setString(2, companyName);
ps.setString(4,description);
ps.setInt(5,status);
ps.setInt(3,order);
ps.setInt(6,id);
final int update = ps.executeUpdate();
if (update > 0) {
System.out.println(“ok”);
}else {
System.out.println(“error”);
}
conn.close();
ps.close(); }
删除:删除数据
- 修改SQL语句
- delete from tb_brand where id = ?
- 是否需要参数?,需要参数id
- 如何封装?boolean 返回添加成功或者失败
_@Test
_public void delete() throws Exception {
int id = 4;
// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection conn = dataSource.getConnection();
// 执行sql语句
String sql = “delete from tb_brand where id = ?”;
// 执行预编译sql语句
PreparedStatement ps = conn.prepareStatement(sql);
// 设置修改的参数在预编译语句中
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setInt(1,id);
final int update = ps.executeUpdate();
if (update > 0) {
System.out.println(“ok”);
}else {
System.out.println(“error”);
}
conn.close();
ps.close(); }