【Jsp】第十二课 数据库连接池插件及JDBCTemplate的用法

概念

上一文我们回顾了使用JDBC插件连接数据库,使用Java语言操作数据库中的数据,但在做任何一个操作之前都需要先连接上数据库,然后执行,在执行完毕之后要断开连接,减少程序内存的开支,但是这种操作在用户量比较多,访问人数比较多的时候,使得程序的性能降低了。

这里把连接对象就好比是服务员,那么今天来了一个客户,你就临时招一个服务员进行接待,接待完毕后,就把服务员开除,这种方式在客户量比较少的时候,确实是最节省开支的方式,当时一旦酒店要长期营业和发展壮大,这明显不是最好的选择,最好的选择是建立服务部门,招聘一些固定的服务员,进行等待迎接客户的到来,才是最优的长远发展的办法。

那么同样,我们想让软件发展的更好,那么就需要创建一个数据库连接池,在用户需要访问数据库的时候,从连接池中拿出一个连接对象进行使用,使用完毕之后,就将连接对象放回连接池中。

那么以下是企业中几种常用的连接池插件以及简化sql数据库执行操作代码的插件:

c3p0

c3p0简介

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。

代码演示

将c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar插件拷贝至lib文件夹下,将c3p0-config.xml配置文件拷贝至src的根路径下,在src文件夹的包中创建C3P0Demo.java类。

c3p0-config.xml配置文件信息如下:

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
  	<!-- 加载JDBC插件 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <!-- 要连接的数据库的地址     &amp;表示&连接符-->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/studentdb?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;serverTimeZone=UTC</property>
    <!-- 登录mysql数据库的用户名 -->
    <property name="user">root</property>
    <!-- 登录mysql数据库的密码 -->
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <!-- 设置初始化要用的连接对象个数 -->
    <property name="initialPoolSize">5</property>
    <!-- 设置最大允许连接的对象个数 -->
    <property name="maxPoolSize">10</property>
    <!-- 当连接后没有断开,3秒后框架会自动断开,将连接对象放回连接池中 -->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/ordersystem</property>
    <property name="user">root</property>
    <property name="password">admin</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>

C3P0Demo.java类获得配置文件中的配置信息创建的连接池对象DataSrouce,并从连接池中获得连接对象,在关闭连接时,将连接对象放回连接池中,给其他操作数据库的代码进行使用

package com.db.test;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * C3P0框架:作用是用于企业中,后端访问数据库创建指定数量的连接池
 * 当java需要操作数据库时,从连接池中拿出一个连接对象进行使用,使用完成放回连接池
 * @author admin
 *
 */
public class C3P0Demo {

	@Test
	public void test1() {
		//使用C3P0框架创建连接池
		DataSource ds=new ComboPooledDataSource();
		//从设置的连接池中拿连接对象
		try {
			Connection con=ds.getConnection();
			if (con!=null) {
				String sql="select * from tb_student where id=?";
				PreparedStatement ps=con.prepareStatement(sql);
				ps.setInt(1, 3);
				ResultSet rs=ps.executeQuery();
				if (rs.next()) {
					int id=rs.getInt(1);
					String name=rs.getString(2);
					int age=rs.getInt(3);
					System.out.println(id+"--"+name+"--"+age);
				}
				//并不是断开连接,而是将用完的连接对象放回连接池
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
}

druid

druid简介

Druid是一个高效的数据查询系统,主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到Druid后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入Druid,外部系统就可以对该事实进行查询。
Druid采用的架构:
shared-nothing架构与lambda架构
Druid设计三个原则:
1.快速查询(Fast Query) : 部分数据聚合(Partial Aggregate) + 内存华(In-Memory) + 索引(Index)
2.水平拓展能力(Horizontal Scalability):分布式数据(Distributed data)+并行化查询(Parallelizable Query)
3.实时分析(Realtime Analytics):Immutable Past , Append-Only Future

代码演示

将druid-1.0.9.jar插件拷贝至lib文件夹下,将druid.properties配置文件拷贝至与java代码同级的包中,

druid.properties配置文件

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/studentdb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimeZone=UTC
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

从信息中可以看出,其创建连接池的信息与C3P0插件的xml文件的配置信息内容是类似的,这里不再描述。

DruidDemo.java

package com.db.test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

import javax.sql.DataSource;

import org.junit.Test;

import com.alibaba.druid.pool.DruidDataSourceFactory;



public class DruidDemo {
	/**
	 * druid框架:用于创建指定数量的连接池
	 * 加快后端访问数据库的性能
	 */
	@Test
	public void test1() {
		//1.需要先将连接池配置文件读取至java代码
		InputStream is=DruidDemo.class
				.getClassLoader()
				.getResourceAsStream("com/db/test/druid.properties");
		//创建一个Properties对象
		Properties properties=new Properties();
		//将输入流中的内容加载导入properties
		try {
			properties.load(is);
			System.out.println(properties.getProperty("driverClassName"));
			//获得连接池
			DataSource ds=DruidDataSourceFactory.createDataSource(properties);
			//从连接池中拿连接对象
			Connection con=ds.getConnection();
			if (con!=null) {
				String sql="select * from tb_student where id=?";
				PreparedStatement ps=con.prepareStatement(sql);
				ps.setInt(1, 3);
				ResultSet rs=ps.executeQuery();
				if (rs.next()) {
					int id=rs.getInt(1);
					String name=rs.getString(2);
					int age=rs.getInt(3);
					System.out.println(id+"--"+name+"--"+age);
				}
				//并不是断开连接,而是将用完的连接对象放回连接池
				con.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

JDBCTemplate

JdbcTemplate简介

Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。

  JdbcTemplate位于

中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个

这个包包含了一下事务和异常控制

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;

  • query方法及queryForXXX方法:用于执行查询相关语句;

  • call方法:用于执行存储过程、函数相关语句。

代码演示

将以下插件Spring框架的插件拷贝至lib文件夹下:

 

 创建JDBCTemplateDemo.java类,连接druid插件从连接池中获得连接的对象,并将获得的连接对象中产生JDBCTemplate对象用于操作sql语句完成增删改查操作:

package com.db.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class JDBCTemplateDemo {
	public static JdbcTemplate jt=null;
	
	static {
		InputStream is=JDBCTemplateDemo.class
				.getClassLoader()
				.getResourceAsStream("com/db/test/druid.properties");
		Properties properties=new Properties();
		try {
			properties.load(is);
			DataSource ds=DruidDataSourceFactory.createDataSource(properties);
			//将获得出来的连接池交给JDBCTemplate管理
			//不再需要开发者手动获得数据库连接,以及手动关闭连接
			jt=new JdbcTemplate(ds);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void test1() {
		//添加语句
		String sql="insert into tb_student(name,age) values(?,?)";
		int i=jt.update(sql, "马化腾",30);
		if (i>0) {
			System.out.println("添加成功");
		}
	}
	
	@Test
	public void test2() {
		//修改语句
		String sql="update tb_student set age=? where id=?";
		int i=jt.update(sql, 23,7);
		if (i>0) {
			System.out.println("修改成功");
		}
	}
	
	@Test
	public void test3() {
		//删除语句
		String sql="delete from tb_student where id=?";
		int i=jt.update(sql,7);
		if (i>0) {
			System.out.println("删除成功");
		}
	}
	
	@Test
	public void test4() {
		//查询学号为4的学生信息
		String sql="select * from tb_student where id=?";
		Map<String, Object> map=jt.queryForMap(sql, 4);
		System.out.println(map);
	}
	
	@Test
	public void test5() {
		//查询所有学生
		String sql="select * from tb_student";
		List<Map<String, Object>> oList=jt.queryForList(sql);
		oList.forEach(map->System.out.println(map));
	}
}

从代码的演示中可以发现,使用该插件完成数据库的增删改查操作代码量简化到极致,因此企业中做开发大多都是使用各种优化性能比较强的插件和框架进行加快项目的开发速度,提高开发者的开发效率,所有初学者必须掌握企业中常用的各种框架的使用!!!

本文介绍到这里,对于这些框架的其他使用方式,初学者可查阅每一个插件的官网api说明文档!!!

猜你喜欢

转载自blog.csdn.net/u010321564/article/details/121712834