Spring Jdbc
JdbcTemplate
Spring JDBC 中的一个辅助类(JdbcTemplate)
是为不同类型的jdbc操作提供模板方法。
个人觉得比较灵活、简单、易用。
类似的有工具有:DButil
一个简单实例
POJO类:
package com.wm.spring.IOC;
public class Dept {
private int d_id ;
private String d_name ;
private String d_address ;
public int getD_id() {
return d_id;
}
public void setD_id(int d_id) {
this.d_id = d_id;
}
public String getD_name() {
return d_name;
}
public void setD_name(String d_name) {
this.d_name = d_name;
}
public String getD_address() {
return d_address;
}
public void setD_address(String d_address) {
this.d_address = d_address;
}
@Override
public String toString() {
return "Dept [d_id=" + d_id + ", d_name=" + d_name + ", d_address="
+ d_address + "]";
}
}
1、首先配置数据源
spring-jdbcTemplate.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">
<!-- 自动扫描 -->
<context:component-scan base-package="com.wm.spring.Jdbc"></context:component-scan>
<!-- 导入外部配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- c3p0 数据源 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxPoolSize" value="${c3p0.pool.size.max}"></property>
<property name="minPoolSize" value="${c3p0.pool.size.min}"></property>
<property name="initialPoolSize" value="${c3p0.pool.size.ini}"></property>
</bean>
<!-- spring jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
用的C3P0数据连接池
jdbc.properties
jdbc.driverClassName = oracle.jdbc.OracleDriver
jdbc.url = jdbc:oracle:thin:@10.5.1.50:1521:cddev
jdbc.username = base_55demo
jdbc.password = crm_12345
c3p0.pool.size.max=20
c3p0.pool.size.min=5
c3p0.pool.size.ini=3
一些jdbc的数据库的配置及连接池的配置参数
2、DAO使用jdbcTemplate的一些模板方法
DAO
DeptDAO.java类:
package com.wm.spring.Jdbc.DAO;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.wm.spring.IOC.Dept;
@Repository // 注册dao bean
public class DeptDAO {
@Autowired
private JdbcTemplate jdbcTemplate ; // 这里的模板bean是配置在XML中的
public void insert(){
String sql = "insert into demo_dept(d_id,d_name,d_address) values(?,?,?)";
jdbcTemplate.update(sql, 19,"家宽","成都");
}
public void update(){
String sql = "update demo_dept set d_address = ? where d_id = ?";
jdbcTemplate.update(sql, "北京", 8);
}
public void delete(){
String sql = "delete from demo_dept where d_id = ?";
jdbcTemplate.update(sql, 6);
}
// 查询所有结果 以对象形式保存
public void query(){
String sql = "select * from demo_dept";
RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);
List<Dept> query = jdbcTemplate.query(sql, rowMapper);
for (Dept dept : query) {
System.out.println(dept);
}
}
// 查询 以对象形式保存
public void queryDept(){
String sql = "select * from demo_dept where d_id = ?";
// 一个映射关系 结果《--》对象
RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);
Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19);
System.out.println(dept);
}
// 批量 插入,执行更新操作
public void batchUpdate(){
String sql = "insert into demo_dept values(?,?,?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{13,"个人","北京"});
batchArgs.add(new Object[]{14,"集团","成都"});
batchArgs.add(new Object[]{15,"互联网","上海"});
jdbcTemplate.batchUpdate(sql, batchArgs);
}
}
JdbcTemplate主要提供下列方法:
1、execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
2、update方法及batchUpdate方法:
update方法用于执行新增、修改、删除等更新语句;
batchUpdate方法用于执行批处理相关语句;
3、query方法及queryForXXX方法:用于执行查询相关语句;
用RowMapper<T>接口,可以实现查询对象或者对象数组。
如:
public void queryDept(){
String sql = "select * from demo_mawei_dept where d_id = ?";
// 接口的实现类 有很多,可以根据实际情况去选择
RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);
Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19);
System.out.println(dept);
}
3、service层
DeptSV.java类:
package com.wm.spring.Jdbc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.wm.spring.Jdbc.DAO.DeptDAO;
@Service
public class DeptSV {
@Autowired
private DeptDAO dao; //注解自动匹配
public void insert(){
dao.insert();
System.out.println("插入成功!");
}
public void update(){
dao.update();
System.out.println("修改成功!");
}
public void delete(){
dao.delete();
System.out.println("删除成功!");
}
public void query(){
dao.query();
System.out.println("查询成功!");
}
public void queryDept(){
dao.queryDept();
System.out.println("查询 部门 成功!");
}
public void batchUpdate(){
dao.batchUpdate();
System.out.println("批量 更新 成功!");
}
}
4、测试类:
JDBCTemplateTest.java类:
package com.wm.spring.TEST;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.wm.spring.Jdbc.service.DeptSV;
public class JDBCTemplateTest {
private ApplicationContext ac ;
@Before
public void init(){
ac = new ClassPathXmlApplicationContext("spring-jdbcTemplate.xml");
}
@Test // 测试数据源 连接
public void testDataSource() throws SQLException{
DataSource ds = ac.getBean(DataSource.class);
System.out.println(ds.getConnection());
}
@Test
public void testUpdate(){
DeptSV sv = ac.getBean(DeptSV.class);
sv.insert();
sv.update();
sv.delete();
}
@Test
public void testQuery(){
DeptSV sv = ac.getBean(DeptSV.class);
sv.query();
sv.queryDept();
}
@Test
public void testBatchUpdate(){
DeptSV sv = ac.getBean(DeptSV.class);
sv.batchUpdate();
}
}
总而言之,Spring JDBC 中的 JdbcTemplate模板类,对SQL操作比较简单、易用。 但是缺点就是 不能 级联查询(这方面,hibernate框架实现的比较好)。
除了使用JdbcTemplate作为Dao层的成员变量方式外,还有一种方式实现jdbc模板方法。
继承JdbcDaoSupport类
org.springframework.jdbc.core.support.JdbcDaoSupport
DeptJdbcTemplateDAO.java 对应的代码:
package com.wm.spring.Jdbc.DAO;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式
public class DeptJdbcTemplateDAO extends JdbcDaoSupport{
public void insert(){
String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)";
// 其中 this.getJdbcTemplate() 获取模板对象
this.getJdbcTemplate().update(sql, 10,"能力开放平台","成都");
}
}
使用这种方式时,不能够对DAO注解,否则会报错的,只能在XML中配置bean的方式。
<bean id="deptJdbcTemplateDAO" class="com.wm.spring.Jdbc.DAO.DeptJdbcTemplateDAO">
<property name="dataSource" ref="dataSource" />
</bean>
并且要配置成员:dataSource 或者 jdbcTemplate,两者之一即可。
配置了才能获取到 this.getJdbcTemplate() 模板对象。
如果非要对DAO进行注解配置,则要实现对 数据源dataSource 或者jdbcTemplate进行setter方法。
package com.wm.spring.Jdbc.DAO;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
@Repository
// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式
public class DeptJdbcTemplateDAO extends JdbcDaoSupport{
@Autowired // 对数据源设值 并且 方法名不能是 setDataSource()
public void setDataSource1(DataSource dataSource){
setDataSource(dataSource);
}
public void insert(){
String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)";
// 其中 this.getJdbcTemplate() 获取模板对象
this.getJdbcTemplate().update(sql, 20,"能力开放平台","成都");
}
}
因为父类已经有此方法setDataSource了,并且方法类型为final,不可重写。
这几种方式都可以,但是最常用的还是第一种方式:把JdbcTemplate作为DAO的成员变量来实现模板方式。