JDBCTemplate、Druid连接池

一、JDBC

       1.概念:Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库

          * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

       2.快速入门         

//1. 导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
        //4.定义sql语句  
        String sql = "update account set balance = ? where id = ?";
        //5.获取执行sql的对象 Statement
      PreparedStatement pst =con.prepareStatement(sql);
       pst.setDouble(1, 500);
    pst.setDouble(2, 1000);
        //6.执行sql
        int count = stmt.executeUpdate(sql);
        //7.处理结果
        System.out.println(count);
        //8.释放资源
        stmt.close();
        conn.close();

 

         3.详解各个对象:

            3.1. DriverManager:驱动管理对象

                 功能:

                           1.注册驱动:告诉程序该使用哪一个数据库驱动jar

                            2.获取数据库连接;

             3.2. Connection:数据库连接对象

                 功能:1. 获取执行sql 的对象

                                * Statement createStatement()

                               * PreparedStatement prepareStatement(String sql)

 

                            2.管理事务

                                 * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务

                                         * 在执行sql之前开启事务

                                * 提交事务:commit() 

                                           * 当所有sql都执行完提交事务

           * 回滚事务:rollback()

                                           * 在catch中回滚事务

 

二、数据库连接池

       1.概念:是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

       2. 好处: 节约资源、用户访问高效

       3.实现: 标准接口:DataSource   javax.sql包下的;

                  方法: 获取连接:getConnection();

        4.连接池技术

           4.1.c3p0: 数据库连接技术

              步骤:

                 1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
                     * 不要忘记导入数据库驱动jar包
                 2. 定义配置文件:
                      * 名称: c3p0.properties 或者 c3p0-config.xml
                     * 路径:直接将文件放在src目录下即可。

                 3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
                 4. 获取连接: getConnection         

public class C3_P0utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");
 
 public static DataSource getDataSource() {
     return dataSource;
 }
 
 public static Connection getConnection() {
     try {
         
         return dataSource.getConnection();
         
    } catch (SQLException e) {
        throw new RuntimeException();
    }
 } 
}
<!--c3p0-config配置文件-->

<?
xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///mbase</property> <property name="user">root</property> <property name="password">123</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> </c3p0-config>

 

 

 

            4.2.Druid:数据库连接技术,阿里巴巴提供

               步骤:

                   1. 导入jar包 druid-1.0.9.jar

                   2. 定义配置文件:
                      * 是properties形式的
                      * 可以叫任意名称,可以放在任意目录下
                   3. 加载配置文件。Properties
                  4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
                  5. 获取连接:getConnection

public class JDBCUtils {

            //1.定义成员变量 DataSource
            private static DataSource ds ;
        
            static{
                try {
                    //1.加载配置文件
                    Properties pro = new Properties();
                    pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                    //2.获取DataSource
                    ds = DruidDataSourceFactory.createDataSource(pro);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception 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 e) {
                        e.printStackTrace();
                    }
                }
        
                if(conn != null){
                    try {
                        conn.close();//归还连接
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }*/
        
               close(null,stmt,conn);
            }
        
        
            public static void close(ResultSet rs , Statement stmt, Connection conn){
        
        
                if(rs != null){
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
        
        
                if(stmt != null){
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
        
                if(conn != null){
                    try {
                        conn.close();//归还连接
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        
            /**
             * 获取连接池方法
             */
        
            public static DataSource getDataSource(){
                return  ds;
            }
        
        }
//druid.properties文件
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mbase username=root password=123

 

 

三、DButils

  例:    

//1.创建按核心类QueryRunner
        QueryRunner qr = new QueryRunner(C3_P0utils.getDataSource());

//增加
String sql="insert into sort values(null,?,?,?)";
        //3.为占位符设置值
        Object[] params = {"超萌二哈",190,"拆家拆家"};
        //4.执行添加操作
        int row=qr.update(sql, params);

//修改

String sql="update sort set sname=? where id=?";
        Object[] param= {"二哈",19};
        int row =qr.update(sql,param);

//删除
String sql ="delete from sort where id=?";
        int row = qr.update(sql,20);
//查询
  //1.将结果集的每一行数据封装成JavaBean对象 : BeanListHandler
List<Users> users=qr.query(sql, new BeanListHandler<Users>(Users.class));
  //2.将结果集的一行数据封装成JavaBean对象:BeanHandler
 Users users=qr.query(sql,new BeanHandler<Users>(Users.class), param);
  //3.查询所有个数:ScalarHandler
 Long count=(Long) qr.query(sql, new ScalarHandler<Object>());
//4.MapListHandler
List<Map<String,Object>> list=qr.query(sql, new MapListHandler());
//5.将某列的值封装到List集合中
String sql="select * from product where pname like ? limit 0,8";
        List<Object> query = qr.query(sql, new ColumnListHandler("pname"), "%"+word+"%");

 

 

 四、JdbcTemplate

       1.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:查询结果,将结果封装为对象

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

例:

  //1. 获取JDBCTemplate对象
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
 
//添加一条记录
int count = template.update(sql, 1015, "郭靖", 10);

//删除刚才添加的记录
int count = template.update(sql, 1015);

//查询id为1001的记录,将其封装为Map集合
 Map<String, Object> map = template.queryForMap(sql, 1001,1002);

// 查询所有记录,将其封装为List
 List<Map<String, Object>> list = template.queryForList(select * from emp);

//查询总记录数
 Long total = template.queryForObject(sql, Long.class);

  //查询所有记录,将其封装为Emp对象的List集合
      List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));

 

 

 

              

           

                         

posted @ 2020-03-07 11:21  撑起一片阳光  阅读(3152)  评论(0编辑  收藏  举报