目录
数据库连接池技术
1.自己手写连接池
2.使用三方库
DBCP 有Bug
C3P0 速度太慢
Druid 阿里巴巴的,很好用
BoneCP 开源组织的,速度也快
HikariCP 据说速度最快
Druid连接池
依赖三方库
商品数据库面向接口编程设计
*.properties属性文件
1.专门用于软件中编写配置参数的
2.格式是 属性名=属性值
druid 要求用户的属性名必须是username
建立一个Druid连接池工具类
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
//连接工具类
public class ConnectionUtil {
private static DataSource dataSource; //声明一个存储连接池的指针
static {
init(); //类加载时候自动执行静态代码块 调用init()方法
}
private static void init(){ //初始化连接池的静态方法
Properties properties = new Properties(); //用于读properties文件的对象
try {
// properties.load() 加载属性文件 参数是属性文件的输入流
properties.load(ConnectionUtil.class.getClassLoader().getResourceAsStream("database.properties"));
// DruidDataSourceFactory.createDataSource() 使用三方库创建连接池对象 参数是properties
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
连接池dataSource被private私有化,连接池初始化的过程对外不可见
暴露一个公有的方法给外部获取连接对象
外界 ConnectionUtil.getConnection()
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
建立个测试类测试连接
建立个BaseDao父类,封装对数据库的增删改操作
建立一个UserDao接口,暴露给上层工厂调用
建立一个UserDaoIml实现类,完成操作的实现
是UserDao的具体实现不暴露给上层,而是将UserDao接口暴露给上层调用。
测试
建立一个BaseEntity,包含阿里巴巴开发手册中建议的每个数据库都要有的四个字段,以后定义的实体类可以继承这个基础父类。
//阿里巴巴开发手册中建议有的4个字段
public class BaseEntity {
private Integer id;
private Integer isDelete;
private String createDate;
private String modifyDate;
@Override
public String toString() {
return "BaseEntity{" +
"id=" + id +
", isDelete=" + isDelete +
", createDate='" + createDate + '\'' +
", modifyDate='" + modifyDate + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getIsDelete() {
return isDelete;
}
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public String getModifyDate() {
return modifyDate;
}
public void setModifyDate(String modifyDate) {
this.modifyDate = modifyDate;
}
}
定义一个具体实体类,要与具体数据库一一映射
//实体类 -- 和数据库一一映射
public class User extends BaseEntity{
private String username;
private String password;
private String avatar;
private String sex;
private String mobile;
private String idCode;
@Override
public String toString() {
return super.toString() +
"User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", avatar='" + avatar + '\'' +
", sex='" + sex + '\'' +
", mobile='" + mobile + '\'' +
", idCode='" + idCode + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getIdCode() {
return idCode;
}
public void setIdCode(String idCode) {
this.idCode = idCode;
}
}
对应的具体数据库字段
下面可以插入一个用户测试一下
成功插入 !