1.抽象一个dao的父类。
根据我们之前操作数据库表时,封装了很多的dao类,这些dao类他们具有很多相同的代码。
如果我们反复写这些重复的代码 相对比较麻烦。 我们学过继承,是否可以把这些dao类的
公共代码抽取到父类中,然后子类继承该父类。
public class BaseDao {
protected PreparedStatement ps = null;
protected Connection conn = null;
protected ResultSet rs = null;
//2. 获取连接对象
private String url = "jdbc:mysql://localhost:3306/qy174";
private String user = "root";
private String password = "root";
//加载驱动---静态代码块--随着类的加载而被加载到内存中,而且只会加载一次。
static{
//1. 加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
//获取连接对象
public void getConn() throws Exception{
conn = DriverManager.getConnection(url, user, password);
}
//通用增删改方法
public int edit(String sql,Object... params){//Object表示可以接受任意类型的参数 ...:表示可以接受任意个参数
try {
getConn();
//3. 获取执行sql语句的对象。PreparedStatement
ps = conn.prepareStatement(sql);
//4. 为占位符赋值
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1,params[i]);
}
//5.执行sql.
int i = ps.executeUpdate();
return i;
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
closeAll();
}
}
//关闭资源
public void closeAll(){
try {
if(rs!=null){
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
抽取到BaseDao父类中,让子类继承。
2.引入数据库连接池
连接池: 它就是一个池子,存放的是连接对象。
为什么使用连接池?
我们在获取连接对象时,发现时间有点长。而且用完后需要关闭连接对象。 连接池中预先存放若干个连接对象,当需要连接对象时,直接从连接池中拿去即可。而且使用完毕后,归还到连接池中就行。
连接池的种类:
如何使用连接池
[1] 引入连接池的依赖jar
[2]创建数据源的属性配置文件。db.properties
# 写上数据库配置信息 key=value 这里的key必须固定
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/qy174
username=root
password=root
initialSize=5
maxActive=10
[3]编写代码