共用的配置文件:database.properties
# 数据库配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
username=root
password=123456
# 初始化连接数
initialSize=10
# 最大连接数
maxActive=30
# 最小空闲连接数
minIdle=5
# 超时等待时间,单位:毫秒ms
maxWait=5000
1. JDBC 数据库连接池工具类
1.1 自定义连接池
```java
/**
* 数据库连接池
*/
public class MyDBPool implements DataSource {
// 存储连接对象的集合
private static List<Connection> connections = new ArrayList<>();
// 类加载时就往集合中存放指定数量的连接对象
static {
InputStream is = MyDBPool.class.getResourceAsStream("/db.properties");
Properties properties = new Properties();
try {
properties.load(is);
Class.forName(properties.getProperty("driver"));
// 通过循环,创建 initialSize 个数据库连接对象,放进集合
for (int i = 0; i < Integer.parseInt(properties.getProperty("initialSize")); i++) {
Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"));
connections.add(connection);
}
} catch (IOException | ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
// 在池中获得连接
System.out.println("池中有 " + connections.size() + " 个连接对象。");
Connection connection = null;
if (connections.size() > 0) {
connection = connections.remove(0);
}
return connection;
}
/**
* 将连接放回池中
*/
public void release(Connection connection) {
connections.add(connection);
System.out.println("放回1个connection");
}
// 其他需要覆盖的方法...
}
1.2 Druid 德鲁伊连接池(alibaba)
Druid
(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池
。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。
特点:
Druid 是目前比较流行高性能的,分布式列存储。
- 亚秒级查询
- 实时数据注入
- 可扩展的PB级存储
- 多环境部署
- 丰富的社区
依赖其独立的驱动 jar 包:druid-1.1.5.jar
源码下载地址:https://github.com/alibaba/druid
jar包下载地址:
- 链接:https://pan.baidu.com/s/1f0pl7CnEJ5vNkWGFS3kdrg
- 提取码:05wc
使用示例:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBPoolUtils {
// 连接池对象:DataSource 的实现类
private static DruidDataSource ds;
static {
Properties properties = new Properties();
InputStream is = DBPoolUtils.class.getResourceAsStream("/database.properties");
try {
properties.load(is);
// 使用德鲁伊工厂创建连接池
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
// 在连接池中获得 connection
// connection 中存放的是 DruidPooledConnection 实现类
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void classAll(Connection c, Statement s, ResultSet r) {
try {
if (r != null) {
r.close();
}
if (s != null) {
s.close();
}
if (c != null) {
// 调用的 close 不是 connection 关闭的,而是将连接资源放回到池中
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. Service 业务封装思想
代码示例:
/**
* Userinfo 的业务逻辑层对象
*/
public class UserinfoServiceImpl {
/**
* 注册业务:用户的注册功能
*/
public String register(UserInfo userinfo) { // 1.接收参数
UserInfoDaoImpl userInfoDao = new UserInfoDaoImpl();
// 2.调用数据访问层对象的查询方法
UserInfo check = userInfoDao.select(userinfo.getUser_id());
if (check != null) {
return "用户名已存在";
}
// 3.调用数据访问层对象的新增方法
int result = userInfoDao.insert(userinfo);
// 4.将操作结果返回给调用者
if (result > 0) {
return "注册成功!";
} else {
return "注册失败!";
}
}
/**
* 登陆业务:用户登陆功能
*/
public UserInfo login(String user_name, String user_pwd) { // 1.接收参数
UserInfoDaoImpl userInfoDao = new UserInfoDaoImpl();
// 2.调用数据访问层对象
UserInfo userInfo = userInfoDao.select(user_name);
// 3.接收结果,处理结果
if (userInfo != null) {
// 检查用户密码和输入密码是否一致
if (userInfo.getUser_pwd().equals(user_pwd)) {
return userInfo;
}
}
// 4.响应调用者结果
return null;
}
}