SQL之数据库连接池与spring jdbc

学习数据库连接池和spring jdbc可以简化jdbc原始代码

数据库连接池的概念

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

当系统初始化之后(Tomcat服务器启动),容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,直接从容器中获取连接对象(无需再跟数据库创建连接),用户访问完之后,会将连接对象归还给容器

好处

  1. 节约资源
  2. 用户访问高效

实现

  1. 标准接口:DataSource
    1. 方法:
      获取连接:getConnection()
      归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么Connection.close()不再是关闭资源,而是归还连接至数据库连接池
  1. 一般我们不去实现它,由数据库厂商来实现
    Druid:数据库连接池实现技术,由阿里巴巴提供

Druid数据库连接池

步骤:

  1. 导入jar包
  2. 定义配置文件
    druid.properties
    可以叫任意名称,可以放在任意目录下,需要手动加载
  3. 加载配置文件
  4. 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory.createDataSource()
  5. 获取连接:getConnection

driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/contest?serverTimezone=GMT%2B8&useSSL=false

username=username

password=password

# 初始化连接数量

initialSize=5

# 最大连接数

maxActive=10

# 最大等待时间

maxWait=3000

public class Druid {

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

       //1.导入jar包

       //2.定义配置文件

       //3.加载配置文件

       Properties pro = new Properties();

       InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");

       pro.load(is);

       //4.获取连接池对象

       DataSource ds = DruidDataSourceFactory.createDataSource(pro);

       //5.获取连接

       Connection coon = ds.getConnection();

       System.out.println(coon);

   }

}

Druid连接池的工具类

package utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import jdbc.Druid;

import javax.sql.DataSource;

import java.io.InputStream;

import java.sql.*;

import java.util.Properties;

/**

* druid连接池的工具类

*/

public class JDBCUtils {

   //定义数据库连接池

   private static DataSource ds;

   /**

    * 当类被加载时,初始化数据库连接池

    */

   static{

       try {

           //加载配置文件

           Properties pro = new Properties();

           InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");

           pro.load(is);

           //获取连接池对象

           ds = DruidDataSourceFactory.createDataSource(pro);

       } catch (Exception e) {

           e.printStackTrace();

       }

   }

   /**

    * 获取连接

    */

   public static Connection getConnection() throws SQLException {

       return ds.getConnection();

   }

   /**

    * 释放资源

    */

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

       if(rs!=null){

           try {

               rs.close();

           } catch (SQLException throwables) {

               throwables.printStackTrace();

           }

       }

       if(stmt!=null){

           try {

               stmt.close();

           } catch (SQLException throwables) {

               throwables.printStackTrace();

           }

       }

       if(conn!=null){

           try {

               conn.close();

           } catch (SQLException throwables) {

               throwables.printStackTrace();

           }

       }

   }

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

       close(conn,stmt,null);

   }

    

   /**

    * 获取数据库连接池

    */

   public static DataSource getDataSource(DataSource ds){

       return ds;

   }

}

Spring JDBC

spring框架对jdbc进行了简单封装。提供一个JDBCTemplate对象简化JDBC的开发 template:模板;即jdbc模板

jdbcTemplate内部对申请连接,释放资源等做了封装,我们不需要再去关心,只需要考虑如何定义SQL语句,如何执行及如何处理结果即可,大大简化jdbc的操作,很nice

步骤

  1. 导入jar包
  2. 创建JdbcTemplate对象。依赖于数据库连接池DataSource
    JdbcTemplate template = new JdbcTemplate(ds);
  3. 调用JdbcTemplate的方法来完成crud操作
    1. update():执行DML语句。增删改语句
    2. queryForMap():查询结果并封装为map集合
      注意:查询结果集长度只能为1(只能封装一行数据)
    3. queryForList():查询结果并封装为list集合
      注意:将每一行数据封装为一个map集合,再将map集合装载到list集合中
    4. query():查询结果并封装为Javabean对象(封装为数据库表的实体类的对象)
      注意:query的参数:RowMapper
      一般我们使用BeanPropertyRowMapper实现类。可以完成数据到javabean的自动封装
      new BeanPropertyRowMapper<类型>(类型.class)
    5. queryForObject():查询结果并封装为对象注意
      1. 如果要实现使用queryForObject获得自定义的类的对象,需要使用和方法query()相似的重载方法queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)

template.queryForObject(sql, new BeanPropertyRowMapper<E>(E.class));

      1. 一般用于聚合函数的查询

/**

* 操作数据库中user表的类

* dao:database access object 数据库访问对象

*/

public class UserDao {

   //声明jdbcTemplate对象共用

   private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());

   /**

    * 登录方法

    * @param loginUser 只有用户名和密码

    * @return user 用户全部数据,没有返回null

    */

   public User login(User loginUser){

       try {

           //1.定义SQL

           String sql="select * from user where username=? and password=?";

           //2.调用query方法

           User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(),loginUser.getPassword());

           return user;

       } catch (DataAccessException e) {

           return null;

       }

   }

}


上一篇:你还不了解SpringSecurity吗?快来看看SpringSecurity实战总结~


下一篇:服务器DD命令将已有的硬盘镜像文件直接写到别的硬盘上