Druid
为什么使用连接池呢?什么时连接池?
-
概念:就是一个容器(集合),存放数据库的连接的容器
当系统初始化化好了以后,容器就会被创建,容器中会被申请一些连接对象,当用户用来访问数据库后,会将连接对象归还给池子。 -
好处:
- 1,节约资源
- 2,用户访问高效。不用来回的申请资源,释放资源浪费时间。
-
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前国产的连接池中最好的。无论是在功能还是在性能,扩展性上都超过了其他的连接池,同时加入了日志监控,听着是不是很牛X。
-
Druid连接池的相关jar包:自行百度
然后导入到项目中: -
Druid的配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ab1
username=root
password=root
initialSize=5 //初始化的池中连接的个数
maxIdle = 8 //已经不在使用,不会生效
maxActive=10 //最大的连接池数量
maxWait=3000 //获取连接时最大的等待时间
minIdle=3
如果你运行后出现这样的提示:
好的,那你就把这行干掉
好了现在我们开始使用连接池吧
我们之前已经学习了JDBCUtils工具类的使用,接下来我们就用工具类实现吧。
package utils;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class JDBCUtils {
private static DataSource ds;
static{
try {
//1,加载配置文件
Properties ps = new Properties();ps.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2,获取datasource
ds = DruidDataSourceFactory.createDataSource(ps);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void release(Statement state,Connection conn) {
if (state!=null) {
try {
state.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//重载一下上面的方法
public static void release(ResultSet rs,Statement state,Connection conn) {
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
release(state, conn);
}
public static DataSource getDataSource() {
return ds;
}
}
注意上边的释放资源,不是真正的是释放,而是归还给池子。
标准的接口:DateSource javax.sql包下的
public interface DataSource
extends CommonDataSource, Wrapper
该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming andDirectory Interface (JNDI) API 的命名服务中注册。
DataSource 接口由驱动程序供应商实现。
JDBCTemplate连接池
spring框架对JDBC的简单封装,提供一个JDBCTemplate对象简化JDBC的开发。
使用步骤:
-
1,导入jar包(自行百度吧)
-
2,创建jdbctemplate对象。依赖于数据源Datasource
-
3,调用jdbctemplate的方法来完成CRUD操作
- update():执行DML语句,增删改操作
- queryFormap():将查询的结果封装为map集合
- queryforlist():将查询的结果封装为list集合
- query():将查询结果封装为javabean对象
- queryforobject():结果封装为对象 -
queryFormap():将列名当成key,值作为value,但是长度只能为一。
-
queryforlist():将查询的结果封装为list集合,相当于先封装成map集合然后在装载进list集合中
-
query():将查询结果封装为javabean对象。参数:Rowmapper,一般使用beanpropertyrowmapper实现类,可以完成数据导Javabean的自动封装。new beanpropertyrowmapper<类型>(类型。class)
-
queryforobject():结果封装为对象:一般用于聚合查询。
-
queryFormap()使用方式:
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
String sql2 = "select *from stu where id = ?";
Map<String, Object> queryForMap = template.queryForMap(sql2,2);
System.out.println(queryForMap);
结果:
- query():将查询结果封装为javabean对象
- 过去的方式:
List<Singer> ls = new ArrayList<Singer>();
try {
conn = JDBCUtils.getConnection();
state = conn.createStatement();
String sql = "select *from stu";
rs = state.executeQuery(sql);
while (rs.next()) {
Singer singer = new Singer();
singer.setId(rs.getInt("id"));
singer.setUsername(rs.getString("username"));
singer.setAge(rs.getInt("age"));
singer.setSex(rs.getInt("sex"));
singer.setGrade(rs.getInt("grade"));
ls.add(singer);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.release(state, conn, rs);
}
for (Singer singer : ls) {
System.out.println(singer);
}
需要注意进行赋值然后进行封装,遍历操作
使用现在的方法:
@Test
public void test3(){
//查询id并封装为Map集合对象
String sql = "select * from stu";
List<Singer> singers =template.query(sql, new BeanPropertyRowMapper<Singer>(Singer.class));
for (Singer singer : singers) {
System.out.println(singer);
}
}
值得注意的是里面的数据类型要用其相应的包装类
查询结果二者一摸一样,但是少了太多的重复性操作
- queryforobject():结果封装为对象:一般用于聚合查询。
@Test
public void test4(){
//查询id统计条数,使用聚合函数
String sql = "select count(id) from stu";
Long totaL = template.queryForObject(sql,Long.class);
System.out.println("总人数:"+totaL);
}
结果:
欢迎指正,共同学习!