Spring应用——对 JDBC 的支持
一、说明
1.Spring JDBC 对原始的 JDBC 进行了封装,使其更加易用。
2.JdbcTemplate 作为 Spring JDBC 的核心,为不同类型的 JDBC 操作提供了模板方法。
3.JdbcTemplate 对于 Spring 作用与 DbUtils 对于 Jdbc 的意义相同。它们做的是同一件事情。
二、JdbcTemplate
1.在 Spring Config 文件中注册 JdbcTemplate 的实例,同时配置数据源,如:
<context:property-placeholder location="classpath:db.properties"/> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
2.在目标类中,注入 JdbcTemplate 实例,进行相应的 Jdbc 操作。
/**
* @author solverpeng
* @create 2016-07-28-20:29
*/
@Repository
public class StudentDao {
@Autowired
private JdbcTemplate jdbcTemplate;
}
3.更新(增、删、改)和批量更新,这里只作一个类型的例子。
(1)增,返回受影响的行数
StudentDao:
public void insertStudent() {
String sql = "insert into student(student_id, student_name, student_class) " +
"values(?,?,?)";
int affectRows = this.jdbcTemplate.update(sql, 1, "tom", "0102");
System.out.println("affectRows:" + affectRows);
}
控制台输出:
affectRows:1
(2)增,返回增加的主键值
StudentDao:
public void insertStudent2() {
PreparedStatementCreator psc = new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
String sql = "insert into student(student_id, student_name, student_class) values(?, ?, ?)";
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, 2);
ps.setString(2, "jerry");
ps.setString(3, "0805");
return ps;
}
};
KeyHolder keyHolder = new GeneratedKeyHolder();
this.jdbcTemplate.update(psc, keyHolder);
Number key = keyHolder.getKey();
System.out.println(key);
}
数据库:

控制台输出:
2
在做这个测试的时候遇到一个问题:!Statement.GeneratedKeysNotRequested!
解决:http://stackoverflow.com/questions/7162989/sqlexception-generated-keys-not-requested-mysql
(3)批量增
StudentDao:
public void batchUpdate() {
String sql = "insert into student(student_id, student_name, student_class) values(?, ?, ?)";
List<Object[]> list = new ArrayList<>();
list.add(new Object[]{3, "lily", "0806"});
list.add(new Object[]{4, "lucy", "0807"});
this.jdbcTemplate.batchUpdate(sql, list);
}
数据库:

4.查询单个对象:queryForObject
StudentDao:
public void getStudent(Integer id) {
String sql = "select student_id, student_name, student_class from student where student_id = ?";
RowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
Student student = this.jdbcTemplate.queryForObject(sql, rowMapper, id);
System.out.println(student);
}
控制台输出:
Student{studentId=1, studentName='tom', studentClass='0804'}
5.返回查询的记录数
public void getCount() {
String sql = "select count(student_id) from student";
Long count = this.jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
}
控制台输出:
4
三、NamedParameterJdbcTemplate :在 sql 中嵌入命名参数。
1.同样在 Spring Config 文件中进行配置
2.使用 ParamMap 插入
StudentDao:
public void insert() {
String sql = "insert into student(student_id, student_name, student_class) values(:studentId, :studentName, :studentClass)";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("studentId", 5);
paramMap.put("studentName", "jakc");
paramMap.put("studentClass", "0808");
this.namedParameterJdbcTemplate.update(sql, paramMap);
}
数据库:

3.使用 SqlParameterSource 插入
public void insert2() {
String sql = "insert into student(student_id, student_name, student_class) values(:studentId, :studentName, :studentClass)";
Student student = new Student();
student.setStudentId(6);
student.setStudentName("mary");
student.setStudentClass("0809");
SqlParameterSource source = new BeanPropertySqlParameterSource(student);
this.namedParameterJdbcTemplate.update(sql, source);
}
数据库:

4.使用 SqlParameterSource 插入返回主键
public void insert3() {
String sql = "insert into student(student_id, student_name, student_class) values(:studentId, :studentName, :studentClass)";
Student student = new Student();
student.setStudentId(7);
student.setStudentName("kobe");
student.setStudentClass("0810");
SqlParameterSource source = new BeanPropertySqlParameterSource(student);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.namedParameterJdbcTemplate.update(sql,source, keyHolder);
Number key = keyHolder.getKey();
System.out.println(key);
}
控制台输出:
7
数据库:

四、继承 JdbcDaoSupport
1.继承 JdbcDaoSupport,需要为每一个目标类配置数据源,JdbcTemplate会自动注入,不需要在SpringConfig文件中配置JdbcTemplate。
2.需要注意的是,不能在目标类中通过 @Autowired 的方式注入 dataSource。
3.演示一个例子:
/**
* @author solverpeng
* @create 2016-07-29-11:29
*/
@Repository
public class PersonDao extends JdbcDaoSupport{
public void insert() {
String sql = "insert into person(id, person_name) values(?, ?)";
this.getJdbcTemplate().update(sql, 1, "tom");
}
}
SpringConfig文件:
<bean class="com.nucsoft.spring.jdbc.PersonDao" id="dao">
<property name="dataSource" ref="dataSource"/>
</bean>
Spring应用——对 JDBC 的支持的更多相关文章
- Spring项目对JDBC的支持和基本使用
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
- 开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践
7.5 集成Spring JDBC及最佳实践 大多数情况下Spring JDBC都是与IOC容器一起使用.通过配置方式使用Spring JDBC. 而且大部分时间都是使用JdbcTemplate类(或 ...
- 1.Spring对JDBC整合支持
1.Spring对JDBC整合支持 Spring对DAO提供哪些支持 1)Spring对DAO异常提供统一处理 2)Spring对DAO编写提供支持的抽象类 3)提高编程效率,减少DAO编码量 Spr ...
- Spring 对JDBC操作的支持
1.Spring 对JDBC操作的支持 Spring对jdbc技术提供了很好的支持,体现在: 1.Spring对c3p0连接池的支持很完善 2.Spring对jdbc提供了jdbcTemplate,来 ...
- 8.Spring对JDBC的支持和事务
1.Spring对JDBC的支持 DAO : Spring中对数据访问对象(DAO)的支持旨在简化Spring与数据访问技术的操作,使JDBC.Hibernate.JPA和JDO等采用统一的方式访问 ...
- Spring 中的 JDBC 事务
Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...
- 使用Spring JDBCTemplate简化JDBC的操作
使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...
- 开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述
7.1 概述 7.1.1 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTes ...
- Spring 对事务管理的支持
1.Spring对事务管理的支持 Spring为事务管理提供了一致的编程模板,在高层次建立了统一的事务抽象.也就是说,不管选择Spring JDBC.Hibernate .JPA 还是iBatis,S ...
随机推荐
- Asp.Net customErrors与httpErrors的区别
先看一下简单的对比 customErrors Asp.Net级别的错误处理程序,只处理Asp.Net应用抛出的异常(404,403,500..) 在IIS7+的服务器依然可用(IIS7之前就引进了) ...
- ios app 提交评审注意事项
在网络上看到的一个文档是这样写,原文的出处无法确认了 基本要点 · 不能导致手机故障(比如崩溃或屏幕问题) · 长时间/过度使用之后反应仍然很快 · 应 ...
- Jquery 实现input回车时跳转到下一个input元素
/** * 回车时跳转到下一个元素 * @Author HTL * @DateTime 2016-12-30T11:33:25+0800 * @param {[type]} $input [INP ...
- DATE_FORMAT函数用法
一.在oracle中,当想把字符串为‘2011-09-20 08:30:45’的格式转化为日期格式,我们可以使用oracle提供的to_date函数. sql语句为: SELECT to_date(' ...
- HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
导致这个错误出现的原因是因为.net Framework4.0没有注册 解决方法:打开运行命令行,运行下面的命令: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30 ...
- leveldb - 并发写入处理
在并发写入的时候,leveldb巧妙地利用一个时间窗口做batch写入,这部分代码值得一读: Status DBImpl::Write(const WriteOptions& options, ...
- .net_ckeditor+ckfinder的图片上传配置
CKEditor和CKFinder的最新版可以到官方网站(http://cksource.com)上下载获得. 把以上两个资源放到网站的根目录: /CKEditor 和 /CKFinder (不区分大 ...
- LoadRunner执行过程报错“Failed to connect to server "xxx.xxx.xxx.xxx:xx":[10060] connetion time out”
执行性能测试过程中,LR报错: Action.c(6):Error -27796: Failed to connect to server "xxx.xxx.xxx.xxx:xx" ...
- SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
Q:bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7 A: svnadmin recover /var/wh ...
- Cubieboard2裸机开发之(一)点亮板载LED
前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...