文章目录
(一)环境搭建
我们首先创建数据库表单
create table account(
id int primary key auto_increment,
name varchar(40),
money float
)character set utf8 collate utf8_general_ci;
insert into account(name,money) values('aaa',1000);
insert into account(name,money) values('bbb',1000);
insert into account(name,money) values('ccc',1000);
然后创建一个普通的maven项目,并且导入相关坐标
接下来创建实体类
/**
* 账户的实体类
*/
public class Account implements Serializable {
private Integer id;
private String name;
private Float money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getMoney() {
return money;
}
public void setMoney(Float money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
接着创建持久层接口(这里我们不写业务层了)
/**
* 账户的持久层接口
*/
public interface IAccountDao {
void save(Account account);
void update(Account account);
void delete(Integer accountId);
Account findById(Integer accountId);
List<Account> findAll();
}
最后写持久层的实现类
/**
* 账户的持久层操作
*/
public class AccountDaoImpl implements IAccountDao {
public void save(Account account) {
}
public void update(Account account) {
}
public void delete(Integer accountId) {
}
public Account findById(Integer accountId) {
return null;
}
public List<Account> findAll() {
return null;
}
}
我们先不写具体的实现方法,先来思考一个问题:我们能不能用一套方法实现增删改
(二)分析源码
我们打开JDK1.8文档中的java.sql.PreparedStatement
我们可以总结以下几点规律:
execute()
是万能的,可以实现增删改查executeQuery()
只能实现查询executeUpdate()
可以实现增删改
我们暂且不看前面两点,我们利用第三点规律,能否实现对增删改的封装呢?
(三)封装增删改方法
我们基于可变长参数的思想,封装一个DBAssit工具类
/**
* 封装的工具类
*/
public class DBAssit {
private DataSource dataSource;
public DBAssit(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* 执行增删改的方法
*
* @param sql
* @param params
* @return
*/
public int update(String sql, Object... params) {
Connection conn = null;
PreparedStatement pstm = null;
try {
//1.得到链接
conn = dataSource.getConnection();
//2.使用链接和参数的sql语句创建预处理对象
pstm = conn.prepareStatement(sql);
//3.得到sql语句参数的源信息(有几个参数,都是什么类型等等)
ParameterMetaData pmd = pstm.getParameterMetaData();
//4.判断sql语句中参数的个数和方法参数params的个数是否一致,不一致肯定不能执行
int parameterCount = pmd.getParameterCount();//参数的个数(问号的个数)
if (params == null) {
throw new NullPointerException("没有sql语句执行必须的参数");
}
if (params.length != parameterCount) {
throw new RuntimeException("传入的参数个数和语句所需的参数个数不一致,语句无法执行");
}
//5.给sql语句的参数赋值
for (int i = 0; i < parameterCount; i++) {
pstm.setObject(i + 1, params[i]);
}
//6.执行语句
int res = pstm.executeUpdate();
//7.返回执行结果
return res;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
release(conn, pstm, null);
}
}
/**
* 释放资源
*
* @param conn
* @param pstm
* @param rs
*/
private void release(Connection conn, PreparedStatement pstm, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (pstm != null) {
try {
pstm.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
最后配置一下C3P0即可
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=true&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
C3P0Util.java
/**
* C3P0
*
*/
public class C3P0Util {
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
public static void main(String[] args) {
System.out.println(getDataSource());
}
}
转载:https://blog.csdn.net/qq_42528769/article/details/105801079
查看评论