什么是Driud数据库连接池,JDBCTemplate怎么封装数据?

Driud数据库连接池和JDBCTemplate封装数据

数据库连接池
概念:其实就是一个容器,存放数据库连接的容器,当系统初始化好以后,容器被创建,容器中会申请一些连接对象,当数据来访问数据库的时候,从容器中获取连接,而不需要再次加载连接之类的了,用户用完后,会将连接对象归还,实现资源的高效,不用每次使用都去加载驱动,获取连接之类的。

Druid:数据库连接池
Druid连接池是阿里巴巴平台上的一个数据连接池实现的,它综合了C3P0,DBCP,等DB连接的优点,同时加入了日志监控,可以很好的监控DB池的连接和SQL的执行情况,可以说是针对监控而生的连接池,据说是最好的连接池,多的不是,阿里巴巴是国内很成功的上市公司,旗下600多款应用都使用了自己封装的Druid数据库连接池,你说以后在国内做JAVA开发不就一步小心就与阿里扯到一起了哟

使用步骤:
1.建立web项目,并添加响应的jar包
2.定义配置文件,是以properties形式的,可以放在任意目录下
3.加载配置文件,properties形式的
4.获取数据库连接对象,通过工厂来获取DriudDateSoureFactory
5.获取连接对象

分布讲解:
1.建立项目,并添加相对应的jar包
在这里插入图片描述
在这里插入图片描述
2.书写核心的配置文件
在这里插入图片描述

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day_17
username=root
password=123
initialSize=5
maxActive=10
maxWait=3000

3.定义工具类JDBCUtils

3.1定义一个类JDBCUtils
3.2提供了静态代码块加载配置资源,初始化连接对象
3.3提供方法:获取连接对象的方法,释放资源,获取连接对象

package cn.ujiuye.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * JDBCUtils工具类
 */
public class JDBCUtils {
    //1.定义成员变量
    private static DataSource ds;
    static {
        try {
            //2.加载配置文件
            //2.1创建集合对象
            Properties prop = new Properties();
            //2.2用类加载器加载资源即获取路径
            prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //3.获取Datesource
            ds = DruidDataSourceFactory.createDataSource(prop);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
        return  ds.getConnection();
    }
    //获取返回连接池的方法
    public  static  DataSource getDataSource(){
        return ds;
    }
    /**
     * 释放资源,归还连接
     */
    public  static void close(Statement stat,Connection con){
        //两个变量的直接调用3个参数的,简化书写
        close(null,stat,con);
    }
    /**
     * 释放资源,归还连接
     */
    public  static void close(ResultSet rs,Statement stat, Connection con){
        if (rs != null){   //释放资源
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stat != null){ //释放资源
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null){ //归还对象
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

4.写一个demo大家可以看下效果

package cn.ujiuye.datasource.druid;

import cn.ujiuye.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 使用工具类来完成增加功能
 */
public class DruidDemo2 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstat = null;
        try {
            //1.获取连接
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "insert into bank values(null,?,?)";
            //3.获取连接对象
            pstat = conn.prepareStatement(sql);
            //4.给sql相关的值赋值
            pstat.setString(1,"刘刚");
            pstat.setDouble(2,3000);
            //5.执行sql
            int count = pstat.executeUpdate();
            System.out.println("返回的结果是:"+count+"插入成功了数据");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(pstat,conn);
        }
    }
}

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

  1. 导入jar包
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
    * JdbcTemplate template = new JdbcTemplate(ds);

     3. 调用JdbcTemplate的方法来完成CRUD的操作
     	* update():执行DML语句。增、删、改语句
     	* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
     		* 注意:这个方法查询的结果集长度只能是1
     	* queryForList():查询结果将结果集封装为list集合
     		* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
     	* query():查询结果,将结果封装为JavaBean对象
     		* query的参数:RowMapper
     			* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
     			* new BeanPropertyRowMapper<类型>(类型.class)
     	* queryForObject:查询结果,将结果封装为对象
     		* 一般用于聚合函数的查询
    

相关的代码操作

package cn.ujiuye.Jdbctemplate;

import cn.ujiuye.domin.Usr;
import cn.ujiuye.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;

/**
 * 利用JdbcTemple实现数据的DML操作
 */
public class JdbcTemplateDemo02 {
    //1.获取jdbcTemplate连接
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
     * 修改数据 ,利用Junit测试
     * junit测试要注意的是只能是public定义和返回值为空
     */
    @Test
    public void updateUser(){
        //2.定义sql
        String sql = "update user set password ='888888' where id = ?";
        //3.执行sql
        int account = template.update(sql, 1);
        //4.处理sql
        System.out.println("该程序运行的结果是1则代表成功,如果是0则代表失败:"+account);
    }

    /**
     * 增加记录
     */
    @Test
    public void addUser(){
        //2.定义sql
        String sql = "insert into user values(?,?,?)";
        //3.执行sql
        int account = template.update(sql, null, "赵六", "123456");
        //4.处理sql
        System.out.println(account);
    }
    /**
     * 增加记录
     */
    @Test
    public void deleteUser(){
        //2.定义sql
        String sql = "delete from user where id = ?";
        //3.执行sql
        int account = template.update(sql, 1);
        //4.处理sql
        System.out.println(account);
    }
    /**
     * 查询语句,将其封装到map集合中
     * 将其对象以字段为key 值为value的形式写出来了
     * 显然只能够使用一条记录而不能使用两条记录
     */
    @Test
    public void selectByIdMap(){
        //2.定义sql
        String sql = "select * from user where id = ?";
        //3.执行sql
        Map<String, Object> map = template.queryForMap(sql, 2);
        //4.处理sql
        System.out.println(map);
    }

    /**
     * 将结果全部封装到list集合中循环读出来
     */
    @Test
    public void selectByIdList(){
        //2.定义sql
        String sql = "select * from user";
        //3.执行sql
        List<Map<String, Object>> list = template.queryForList(sql);
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }
    /**
     * 查询所有,封装数据为对象的需求
     */
    @Test
    public void  selectByIdQuery(){
        //2.定义sql
        String sql = "select * from user";
        //3.执行sql
        List<Usr> list = template.query(sql, new BeanPropertyRowMapper<Usr>(Usr.class));
        //4.处理sql
        for (Usr user :list){
            System.out.println(user);
        }
    }
    /**
     * 查询数据的总数是多少
     */
    @Test
     public void  selectCount(){
         //2.定义sql
         String sql = "select count(*) from user";
         //3.执行sql
         Long total = template.queryForObject(sql, long.class);
         //4.处理sql
         System.out.println(total);
     }
}

发布了63 篇原创文章 · 获赞 54 · 访问量 9110

猜你喜欢

转载自blog.csdn.net/loveyouyuan/article/details/100774291
今日推荐