数据库连接池/JDBC Template

数据库连接池/JDBC Template

JDBC

每次查询数据都要加载驱动,创建连接对象

package com.test.Demo01;

import java.sql.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCyh {
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        try{
            //1,加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2,链接数据库
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","root","123456");
            //3,得到发送查询语句的对象
            stmt=conn.createStatement();
            //4,发送语句
            String sql="select * from user";
            rs=stmt.executeQuery(sql);
            //5,打印
            while(rs.next()){
                System.out.print("id号:"+rs.getInt("id"));
                System.out.print("姓名:"+rs.getString("name"));
                System.out.println("年龄:"+rs.getInt("age"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //6释放资源
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                rs=null;
            }
//            关闭stmt
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                stmt=null;

            }
            //关闭连接
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                conn=null;
            }
        }
    }
}

数据库连接池

概念:其实就是一个容器,集合,用来存放数据库连接的容器

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

好处

1.节约资源

2.用户访问高效

Interface DataSource

DataSource对象代表的物理数据源的连接工厂。一种替代的DriverManager设施,一DataSource对象获得连接的首选方法。实现DataSource接口通常是与命名服务基于java™命名和目录注册一个对象(JNDI)API。

DataSource接口是由一个驱动程序供应商实施。有三种类型的实现:

  1. 基本实现生产标准Connection对象
  2. 连接池的实现,产生一个Connection对象将自动参与连接池。此实现与一个中间层连接池管理器一起工作。
  3. 分布式事务实现–产生Connection对象可用于分布式事务几乎总是参与连接池。此实现与一个中间层事务管理器一起工作,并且几乎总是与一个连接池管理器一起工作。

一个DataSource对象的属性,可以进行修改,必要时。例如,如果数据源被移动到不同的服务器,服务器的属性就可以改变了。好处是,因为数据源的属性可以被更改,任何代码访问该数据源不需要改变。

Modifier and Type Method and Description 
Connection getConnection() 
试图建立这种 DataSource对象代表数据源连接。  
Connection getConnection(String username, String password) 
试图建立这种 DataSource对象代表数据源连接。
    
    
    获取连接
    getconnection
    归还连接
	Connection.close

数据库连接池厂商

C3P0: 数据库连接池技术

Druid: 阿里巴巴

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
<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://47.93.197.238:3306/test</property>
    <property name="user">root</property>
    <property name="password">root123456</property>
    
    <!-- 连接池参数 -->
    <!--初始化的申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--连接超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://47.93.197.238:3306/test</property>
    <property name="user">root</property>
    <property name="password">root123456</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>
Druid :数据库连接池技术
1.导入jar包
2.定义配置文件  druid.properties
3.加载配置文件 Properties
4.获取连接池对象 DruidDataSourceFactory
5.获取连接  Getconnection
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://47.93.197.238:3306/test?characterEncoding=UTF-8
username=root
password=root123456
# 初始化连接数
initialSize=5
#最大连接数
maxActive=10
#超时时间
maxWait=3000

定义工具类

JDBC Template

JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。

需要的依赖:

img

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-beans</artifactId>
	<version>5.3.6</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.6</version>
</dependency>

在JdbcTemplate中执行SQL语句的方法大致分为3类:

  1. execute:可以执行任何SQL语句,一般用于执行DDL(data definition language)语句。

  2. update:用于执行INSERTUPDATEDELETE等DML(data manipulation language)语句。

  3. queryXxx:用于DQL(数据查询语言DQL)数据查询语句。

JDBC工具类

package util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

//Jdbc工具类
public class JDBCUtill {
    private static DruidDataSource dataSource;
    static {
        try {
            Properties properties = new Properties();
            //读取properties文件
            InputStream inputStream = JDBCUtill.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(inputStream);
            //创建数据库连接池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取数据库连接池
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  conn;
    }

    //关闭连接
    public static void close(Connection conn) {
        if(conn !=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

//    获取数据源
    public static DruidDataSource getDataSource(){
        return dataSource;
    }
}

JdbcTemplate配置连接池

org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句

创建JDBCTemplate对象。依赖于数据源DataSource
public JdbcTemplate(DataSource dataSource)

    JdbcTemplate template = new JdbcTemplate(JDBCUtill.getDataSource());
调用JdbcTemplate的方法来完成CRUD的操作
update():执行DML语句。增删改语句

 @Test
    public void test01(){

        String sql="update user set name ='zqh' where id=2";
        int count =template.update(sql);
        System.out.println(count);

    }

queryForMap():查询结果将结果集封装为Map集合,查询的结果集只能为1,列名为Key,值为Value,将这一条记录封装为一个map集合
    @Test
    public void test04(){
        String sql ="select * from user where id=? ";
        Map<String, Object> map = template.queryForMap(sql,1);
        System.out.println(map);
//com.mysql.cj.jdbc.ConnectionImpl@6e171cd7
//{id=1, name=zqh, pwd=123456}
    }

一般只能用来查询一条结果
如果查询多条会报错org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
  @Test
    public void test04(){
        String sql ="select * from user where id=? or id =?";
        Map<String, Object> map = template.queryForMap(sql,1,3);
        System.out.println(map);

    }



queryForList():查询结果将结果集封装为List集合,将每一条记录封装为一个Map,再将所有记录封装为一个List
 @Test
    public void test05(){
        String sql ="select * from user  ";
        List<Map<String, Object>> list = template.queryForList(sql);
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }

com.mysql.cj.jdbc.ConnectionImpl@6e171cd7
{id=1, name=zqh, pwd=123456}
{id=3, name=李四, pwd=987654}
{id=4, name=AAA, pwd=wewae}

query():查询结果,将结果封装为JavaBean对象
query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper(类型〉(类型.class)

    @Test
    public void test06(){
        String sql ="select * from user  ";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
        for (User user : list) {
            System.out.println(user);
        }

    }

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

   @Test
    public void test06(){
        String sql ="select count(*) from user  ";
        Integer count = template.queryForObject(sql,Integer.class);
        System.out.println(count);

    }

ry(sql, new BeanPropertyRowMapper(User.class));
for (User user : list) {
System.out.println(user);
}

}

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

   @Test
    public void test06(){
        String sql ="select count(*) from user  ";
        Integer count = template.queryForObject(sql,Integer.class);
        System.out.println(count);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值