Druid,JDBCTemplate连接池详解

Druid

为什么使用连接池呢?什么时连接池?

  • 概念:就是一个容器(集合),存放数据库的连接的容器
    当系统初始化化好了以后,容器就会被创建,容器中会被申请一些连接对象,当用户用来访问数据库后,会将连接对象归还给池子。

  • 好处:

    • 1,节约资源
    • 2,用户访问高效。不用来回的申请资源,释放资源浪费时间。
  • Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前国产的连接池中最好的。无论是在功能还是在性能扩展性上都超过了其他的连接池,同时加入了日志监控,听着是不是很牛X。

  • Druid连接池的相关jar包:自行百度
    然后导入到项目中:

  • Druid的配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ab1
username=root
password=root
initialSize=5 //初始化的池中连接的个数
maxIdle = 8 //已经不在使用,不会生效
maxActive=10 //最大的连接池数量
maxWait=3000 //获取连接时最大的等待时间
minIdle=3

如果你运行后出现这样的提示:
在这里插入图片描述
好的,那你就把这行干掉
在这里插入图片描述
好了现在我们开始使用连接池吧
我们之前已经学习了JDBCUtils工具类的使用,接下来我们就用工具类实现吧。

package utils;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class JDBCUtils {
	
	private static DataSource ds;
	
	static{
		
		try {
			
		//1,加载配置文件
		Properties ps = new Properties();ps.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
			
		//2,获取datasource
			ds = DruidDataSourceFactory.createDataSource(ps);
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}
	
	public static void release(Statement state,Connection conn) {
		if (state!=null) {
			try {
				state.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//重载一下上面的方法
	public static void release(ResultSet rs,Statement state,Connection conn) {
		if (rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		release(state, conn);
	}
	
	public static DataSource getDataSource() {
		return ds;
	}
	
}

注意上边的释放资源,不是真正的是释放,而是归还给池子。
标准的接口:DateSource javax.sql包下的

public interface DataSource
extends CommonDataSource, Wrapper

该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming andDirectory Interface (JNDI) API 的命名服务中注册。
DataSource 接口由驱动程序供应商实现。

JDBCTemplate连接池

spring框架对JDBC的简单封装,提供一个JDBCTemplate对象简化JDBC的开发。
使用步骤:

  • 1,导入jar包(自行百度吧)

  • 2,创建jdbctemplate对象。依赖于数据源Datasource

  • 3,调用jdbctemplate的方法来完成CRUD操作
    - update():执行DML语句,增删改操作
    - queryFormap():将查询的结果封装为map集合
    - queryforlist():将查询的结果封装为list集合
    - query():将查询结果封装为javabean对象
    - queryforobject():结果封装为对象

  • queryFormap():将列名当成key,值作为value,但是长度只能为一。

  • queryforlist():将查询的结果封装为list集合,相当于先封装成map集合然后在装载进list集合中

  • query():将查询结果封装为javabean对象。参数:Rowmapper,一般使用beanpropertyrowmapper实现类,可以完成数据导Javabean的自动封装。new beanpropertyrowmapper<类型>(类型。class)

  • queryforobject():结果封装为对象:一般用于聚合查询。

  • queryFormap()使用方式:

JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
		String sql2 = "select *from stu where id = ?";
		Map<String, Object> queryForMap = template.queryForMap(sql2,2);
		System.out.println(queryForMap);

结果:
在这里插入图片描述

  • query():将查询结果封装为javabean对象
  • 过去的方式:
List<Singer> ls = new ArrayList<Singer>();
		try {
		    conn = JDBCUtils.getConnection();
			state = conn.createStatement();
			String sql = "select *from stu";
		    rs = state.executeQuery(sql);
			while (rs.next()) {
				Singer singer = new Singer();
				singer.setId(rs.getInt("id"));
				singer.setUsername(rs.getString("username"));
				singer.setAge(rs.getInt("age"));
				singer.setSex(rs.getInt("sex"));
				singer.setGrade(rs.getInt("grade"));
				ls.add(singer);
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.release(state, conn, rs);
		}
		
		for (Singer singer : ls) {
			System.out.println(singer);
		}

需要注意进行赋值然后进行封装,遍历操作
使用现在的方法

@Test
	public void test3(){
		//查询id并封装为Map集合对象
		String sql = "select * from stu";
		List<Singer> singers =template.query(sql, new BeanPropertyRowMapper<Singer>(Singer.class));
		for (Singer singer : singers) {
			System.out.println(singer);
		}
	}

值得注意的是里面的数据类型要用其相应的包装类
查询结果二者一摸一样,但是少了太多的重复性操作
在这里插入图片描述

  • queryforobject():结果封装为对象:一般用于聚合查询。
@Test
	public void test4(){
		//查询id统计条数,使用聚合函数
		String sql = "select count(id) from stu";
		Long totaL = template.queryForObject(sql,Long.class);
		System.out.println("总人数:"+totaL);
	}

结果:
在这里插入图片描述
欢迎指正,共同学习!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值