在上一篇文章中说了说JDBC的基本使用方法,用起来的感觉就是:费劲儿!!!
懒惰是人类进步的阶梯,既然我是操作数据库,那么我就只想写Sql语句,其他的我一概不想写!!!
为此,数据库连接池(DataSource)和JDBCTemplate就诞生了
数据库连接池(DataSource)
首先来分析下之前那种用法的弊端
每当我想连接数据库的时候,我就去找系统要一个Connection资源,用完再还给系统,等我下一次要用的时候我再去找系统拿,如此循环往复,效率自然是不用说了,系统都怕你了,那么该怎么办呢?我们先找系统要他十几二十个Connection资源,管它用不用,我先申请好,剩下的就没系统什么事儿了,只看我怎么调遣这些资源了。系统一下就自由飞翔了,这个烦人的家伙终于不用再来找麻烦了。我只要拿到Connection了,之后的操作是不是就和之前完全一样了啊
package com.it.leon;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
public class DataSourcePractice {
static DataSource ds = null;
static {
Properties pro = new Properties();
try {
pro.load(DataSourcePractice.class.getResourceAsStream("/druid.properties"));
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test01() {
try {
Connection con = ds.getConnection();
String sql = "insert into test values(?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1,10);
pstmt.setString(2,"萧远山");
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这一次我们不再通过DriverMananger来获取Connection了,而是通过DataSource(数据库连接池)来获取,DataSource就是个装Connection的容器,里面已经放好了已连上指定数据库的Connection对象了,当我们需要使用时,就用来获取即可
Connection con = ds.getConnection(); //通过DataSource获取Connection
而我们的DataSource又怎么来呢?没有DataSource我们又怎么获得Connection呢?答案就在静态代码块这里
static {
Properties pro = new Properties(); //配置文件
try {
pro.load(DataSourcePractice.class.getResourceAsStream("/druid.properties"));
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
现有的数据库连接池,就用阿里巴巴的Druid,没有为什么,它就是当前最强的,用就是了。
配置文件里面就是指定连哪个数据库之类的
driverClassName=com.mysql.jdbc.Driver //注册驱动
url=jdbc:mysql://127.0.0.1:3306/db1 //连接哪个IP下的哪个数据库
username=root //用户名
password=root //密码
initialSize=5 //初始时的Connection个数
maxActive=10 //最大的Connection个数
maxWait=3000 //最大响应时间
至此,我们的DataSource就介绍完毕了,但是还是用起来不爽,为什么呢?因为我只想写sql语句,什么申请资源啊,释放资源啊,我一律不想做,我连statement都不想创建,我就只想写sql,这是我的初衷。
好,有需求就有实现,JDBCTemplate来了
package com.it.leon;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
public class JDBCTemplatePractice {
private static JdbcTemplate tem = null;
static {
Properties pro = new Properties();
try {
pro.load(JDBCTemplatePractice.class.getResourceAsStream("/druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
tem = new JdbcTemplate(ds);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test01() {
String sql = "select * from test";
List<TestObj> list = tem.query(sql, new BeanPropertyRowMapper<TestObj>(TestObj.class));
for (TestObj testObj : list) {
System.out.println(testObj);
}
}
}
JDBCTemplate的核心思想就是,我只要获取了JDBCTemplate对象,就可以对数据库进行CRUD了,用完之后连释放都不用做了,美哉美哉!
static {
Properties pro = new Properties();
try {
pro.load(JDBCTemplatePractice.class.getResourceAsStream("/druid.properties")); //装载配置文件
DataSource ds = DruidDataSourceFactory.createDataSource(pro); //获取DataSource对象
tem = new JdbcTemplate(ds); //获取JDCBTemplate对象
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
只要我们有了DataSource对象,就可以有JDBCTemplate对象了
有了对象之后直接执行sql语句即可
@Test
public void test01() {
String sql = "select * from test";
List<TestObj> list = tem.query(sql, new BeanPropertyRowMapper<TestObj>(TestObj.class)); //将JDBCTemplate对象查询到的结果封装到TestObj这个对象里面
for (TestObj testObj : list) {
System.out.println(testObj); //遍历对象
}
}
上述是查询用法,使用时必须要保证TestObj类重写了get()和set()函数
@Test
public void test01() {
String sql = "insert into test values(?,?)"; //preparedStatement的用法
tem.update(sql,30,"丁春秋"); //按照问号的顺序依次赋值即可
}
好了,现在我只要有了JDBCTemplate对象,就可以对数据库进行CRUD了,省去了繁琐的statement和关闭资源,好爽啊,哈哈哈哈哈哈!!!!!!