数据库连接池技术

C3P0 : 数据库连接池技术

1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2.定义配置文件:

	*名称:c3p0.properties  或者  c3p0-config.xml
	#路径:直接吧文件放在SRC目录下即可,该数据库连接池不用自己加装配置文件

3.创建核心对象 数据库连接池对象: ComboPooledDataSource
4.获取连接:getConnection
下面是配置文件:

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>
    <property name="user">root</property>
    <property name="password">9672005</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.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>
    <property name="user">root</property>
    <property name="password">9672005</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>

下面是获取连接的类:

public class C3P0 {
    private static Connection Connection;

    public static void main(String[] args) throws SQLException {
        //创建数据库连接池对象
        DataSource dataSource = new ComboPooledDataSource("otherc3p0");
        //获取连接对象
        Connection = dataSource.getConnection();
        //打印
        System.out.println(Connection);
    }
}

注意:数据库连接池中colse方法是把连接对象connection归还给连接池,连接池的最大连接数和默认连接数都可以通过配置文件配置,我们比较推荐使用配置文件配置连接池.
下面是不使用配置文件的c3p0的使用
基本使用

在这里插入图片描述

Druid:数据库连接池,阿里巴巴提供

1.导入jar包 Druid-1.0.9.jar
2.定义配置文件并加载配置文件:
*properties形式
*可以是任意名称,可以放在任意的目录下
3.获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
4.获取连接
配置文件内容:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=9672005
initialSize=5
maxActive=10
maxWait=3000

得到数据库连接池

public class Druid {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties properties = new Properties();
        ClassLoader classLoader = Druid.class.getClassLoader();
        //配置文件在SRC中的路径
        InputStream inputStream = classLoader.getResourceAsStream("cn/itcast/jdbc/druid.properties");
        properties.load(inputStream);

        //传递配置文件
        DataSource ds = DruidDataSourceFactory.createDataSource(properties);

        Connection connection = ds.getConnection();
        System.out.println(connection);
    }
}

上面这两种连接池方式,推荐使用第二种,连接池技术有很多种,步骤基本一样,已经学过的还有一个DBCP数据源技术,
其实在使用这些技术的时候,我们要把它们封装成一个工具类,对外提供获得connection,DataSource,和归还connection的方法.

Druid连接池的工具类

public class DataUtils {
    //创建数据源
    private  static DataSource ds = null;
    static {
        //加载配置文件
        Properties properties = new Properties();
        try {
            properties.load(DataUtils.class.getClassLoader().getResourceAsStream("cn/itcast/jdbc/druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //得到连接对象
    public  static Connection getConnection(){
        Connection connection = null;
        try {
            connection = ds.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }
    //归还连接对象到连接池中
    public static  void close(Statement statement , Connection connection){
        if(statement!=null) {
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null) {
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
    }

    public static  void close(ResultSet resultSet , Statement statement,Connection connection){
        if(resultSet!=null) {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        close(statement,connection);
    }
    //得到连接池对象
    public  static  DataSource getDs(){
        return ds;
    }
}

工具类的一个简单使用(我没有关闭连接类)

public class DruidJDBC {
    private static PreparedStatement pstmt;

    public static void main(String[] args) throws SQLException {
        Connection connection = DataUtils.getConnection();
        System.out.println(connection);
        String sql = "insert into user values(null,?,?,?)";
        pstmt = connection.prepareStatement(sql);
        pstmt.setString(1,"并");
        pstmt.setInt(2,88);
        pstmt.setString(3,"女");
        int count = pstmt.executeUpdate();
        System.out.println(count);
    }
}

当我们准备到这一步的时候,其实我们已经可以很方便的获取数据库的连接对象connection了,
通过该连接对象我们可以很方便的操作数据库了,但是我们任然要写很多的代码去操作,接下来,我们就可以使用Spring JDBC 来进一步简化数据库的连接操作

Spring JDBC

*.Spring 框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
1.导入jar包(5个)

*commons-logging-1.jar
*spring-beans-5.0.0.RELEASE.jar
*spring-core-5.0.0.RELEASE.jar
*spring-jdbc-5.0.0.RELEASE.jar
*.spring-tx-5.0.0.RELEASE.jar

2.创建JDBCTemplate对象,依赖于数据源DataSource

*JDBCTemplate template  =  new JdbcTemplate(ds);

3.调用JDBCTemplate 的方法来完成CURD的操作

*update():执行DML语句.增删改语句
*queryForMap:查询结果吧结果集封装为map集合
			*注意:这个方法查询的结果集长度为1,只能查到一个结果
*queryForList():查询结果把结果集封装成list集合
			*注意:这个方法把每一条记录封装成Map集合,再把map集合封装到list集合中
*query():查询结果,把结果封装为JavaBean对象
			*query()参数:RowMapper
					*一般我们使用BeanPropertyRowMapper实现类.可以完成数据到JavaBean的						  自动封装
						*new BeanPropertyRowMapper<bean类型>(bean类.class)
*queryForObject:查询结果,把结果封装为对象
			*一般用于聚合函数的查询
public class jdbcTemplateDemo02 {

        //1.导入jar包
        //创建JDBCtemplate对象
        //3.调用方法
        //Junit单元测试,可以让方法独立执行
    private   JdbcTemplate template = new JdbcTemplate(DataUtils.getDs());
    @Test
    public void test1(){

        String sql = "insert user values(?,?,?,?)";
        int count = template.update(sql,8,"rong",22,"男");
        System.out.println(count);
    }
    //查询一条记录,封装成map
    @Test
    public void test4(){
        String sql = "select * from user where id = ?";
        Map<String,Object> map = template.queryForMap(sql,1);
        System.out.println(map);
    }
    //查询所有的记录,并封装成list
    @Test
    public void test5(){
        String sql = "select * from user ";
        List<Map<String ,Object>> list = template.queryForList(sql);

        for (Map<String ,Object> StringObjectMap: list
             ) {
            System.out.println(StringObjectMap);
        }
    }
    //最常用的方法
    //查询所有的记录,并把它们封装成bean对象到list集合
    @Test
    public void test6(){
        String sql = "select * from user";
        List<UserBean> list = template.query(sql, new RowMapper<UserBean>() {
            @Override
            public UserBean mapRow(ResultSet resultSet, int i) throws SQLException {
                UserBean userBean = new UserBean();
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                String sex = resultSet.getString("sex");
                userBean.setAge(age);
                userBean.setId(id);
                userBean.setName(name);
                userBean.setSgx(sex);
                return userBean;
            }
        });
        for (UserBean userBean : list) {
            System.out.println(userBean);
        }
    }
    //查询所有,精简版
    @Test
    public void test7(){
        String sql = "select * from user";
        List<UserBean> list = template.query(sql,new BeanPropertyRowMapper<UserBean>(UserBean.class));
        for (UserBean userBean : list) {
            System.out.println(userBean);
        }
    }
    //T查询总记录数
    @Test
    public void test8(){
        String sql = "select count(id) from user";
        //返回定义的long类型数据
        Long total = template.queryForObject(sql,Long.class);
        System.out.println(total);
    }
}

下面看怎么封装Javabean类

public class jdbcTemplateDemo02 {

        //1.导入jar包
        //创建JDBCtemplate对象
        //3.调用方法
        //Junit单元测试,可以让方法独立执行
    private   JdbcTemplate template = new JdbcTemplate(DataUtils.getDs());
        //查询所有,精简版
    @Test
    public void test7(){
        String sql = "select * from user";
        List<UserBean> list = template.query(sql,new BeanPropertyRowMapper<UserBean>(UserBean.class));
        for (UserBean userBean : list) {
            System.out.println(userBean);
        }
    }
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值