java数据库连接线程池_Java学习之数据库连接池

Java学习之数据库连接池

0x00 前言

前面用到的jdbc,在每次连接数据库的时候都需要去重新建立对象。我们在这里会用到创建一个连接池,每次使用完后归还给连接池。

0x01 连接池概述

连接池其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

使用连接池能节约资源使用户访问高效。

0x02 连接池实现

C3P0创建线程池

添加jar文件到libs目录下,所需文件:

c3p0-0.9.5.2.jar c3p0包 mchange-commons-java-0.2.12.jar//c3p0 依赖包

mysql-connector //数据库连接驱动包

将c3p0-config.xml放到src目录下,并进行配置。

创建连接池代码:

public class test1 {

public static void main(String[] args) throws SQLException {

DataSource dataSource = new ComboPooledDataSource();

Connection connection = dataSource.getConnection();

System.out.println(connection);

}

}

Druid 数据库连接池

导入jar包

druid-1.0.9.jar

导入druid.properties文件

代码:

public class test2 {

public static void main(String[] args) throws Exception {

Properties pro = new Properties(); //创建properties对象

InputStream is = test2.class.getClassLoader().getResourceAsStream("druid.properties"); //获取配置文件资源

pro.load(is); //加载配置文件

DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); //创建连接池对象,并传入配置文件信息

Connection connection = dataSource.getConnection(); //获取连接对象

System.out.println(connection);

}

}

使用完这些方式后可以发现,连接数据库也比较方便了,都是一些封装好的代码。

我们在这里可以再定义一个工具类,把连接的东西都封装在工具类里面,简化我们的代码。

工具类:

public class JDBCutiss {

private static DataSource ds;

static {

Properties pro = new Properties();

InputStream rs = JDBCutiss.class.getClassLoader().getResourceAsStream("druid.properties");

try {

pro.load(rs);

try {

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (Exception e) {

e.printStackTrace();

}

} catch (IOException e) {

e.printStackTrace();

}

}

//返回连接对象

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

public static void close(Statement stmt,Connection conn){

if (stmt!=null){

try {

stmt.close();

} catch (SQLException throwables) {

throwables.printStackTrace();

}

}

if (conn!=null){

try {

conn.close();

} catch (SQLException throwables) {

throwables.printStackTrace();

}

}

}

//该方法返回定义好的DataSource对象

public static DataSource getDataSource(){

return ds;

}

}

main方法:

public class test2 {

public static void main(String[] args) throws Exception {

Connection connection = JDBCutiss.getConnection();//获取连接对象

String sql = "select * from users where id =?"; //设置sql语句

PreparedStatement preparedStatement = connection.prepareStatement(sql);//传入sql语句并创建预编译执行对象

preparedStatement.setString(1,"1"); //sql语句设置值

// System.out.println(sql);

ResultSet resultSet = preparedStatement.executeQuery(); //执行sql语句

while (resultSet.next()){

System.out.println(resultSet.getString("id")); //获取id

System.out.println(resultSet.getString("username"));//获取用户账户

System.out.println(resultSet.getString("password"));//获取密码

}

JDBCutiss.close(preparedStatement,connection);

}

}

Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。

创建对象:

JdbcTemplate template = new JdbcTemplate(ds);

常用方法:

* update():执行DML语句。增、删、改语句

* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合

* 注意:这个方法查询的结果集长度只能是1

* queryForList():查询结果将结果集封装为list集合

* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

* query():查询结果,将结果封装为JavaBean对象

* query的参数:RowMapper

* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装

* new BeanPropertyRowMapper(类型.class)

* queryForObject:查询结果,将结果封装为对象

* 一般用于聚合函数的查询

Template连接代码:

public class test3 {

public static void main(String[] args) {

JdbcTemplate template = new JdbcTemplate(JDBCutiss.getDataSource());//从工具类获取对象传入

String sql = "update users set password =? where id =?";

int admin = template.update(sql,"500",2); //参数sql语句需要的参数,再进行执行sql语句

System.out.println(admin);

}

}

总体来说也就3行代码就实现了这么一个操作数据库的,比前面几个方法都简单很多,其他的所需功能都在工具类里面封装好了,可以直接进行调用。

0x03 结尾

在使用了spring Jdbc后发现代码比前面几个都轻松很多,定义的工具类开发程序的时候可以直接复制来使用,或者做一点稍微的改进再进行使用。总体来说spring还是很方便。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值