Spring学习之JdbcTemplate
来源:互联网 发布:电脑雕刻机制图软件 编辑:程序博客网 时间:2024/05/29 11:22
一、什么是JDBCTemplate
Spring使用模板方式封装jdbc数据库操作固定流程,并提供丰富callback回调接口功能,方便用户自定义加工细节,更好模块化jdbc操作,简化传统的JDBC操作的复杂和繁琐过程。
JDBCTemplate主要提供以下五类方法:
(1) execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
jdbcTemplate.execute("CREATE TABLE t_user (user_id integer, name varchar(64))");
(2) update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
jdbcTemplate.update("update t_user set username=? where id=?",user.getUsername(), user.getId());
(3) query方法及queryForXXX方法:用于执行查询相关语句;
int count = jdbcTemplate.queryForInt("select count(*) from t_user");
List<String> nicknameList = jdbcTemplate.queryForList("select nickname from t_user", String.class);
(4) call方法:用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类:
(1) 预编译语句及存储过程创建回调
PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;
CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;
(2) 预编译语句设值回调
PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;
BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;
(3)自定义功能回调
ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;
StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;
PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;
CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
(4)结果集处理回调
RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
二、使用JDBCTemplate
这里先给出使用JDBCTemplate的一般步骤:
1.导入Spring的包和数据库驱动包
2.选择一个数据源(DBCP, C3P0)
3.导入数据源的包:DBCP
4.在beans.xml中创建datasource数据源
5.创建jdbc.propertier来设置数据库连接信息
6.在beans.xml中导入相应的properties文件
<context:property-placeholder location="jdbc.properties"/>
7.写一个DAO,并且为这个DAO创建一个JdbcTemplate,通过JdbcTemplate对象可以方便的完成对数据的操作
8.为Dao注入相应的DataSource并且创建JdbcTemplate
@Resource
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
9.完成数据对象的添加
首先需要把DataSource注册到JdbcTemplate之中。同时,为了支持对properties文件的支持,spring提供了类似于EL表达式的方式,把properties的文件参数引入到参数配置之中。
<?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:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 打开spring的Annotation支持 --><context:annotation-config /><!-- 设定spring去哪些包中找Annotation --><context:component-scan base-package="com.spring" /><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- 导入src目录下的jdbc.properties文件 --><context:property-placeholder location="jdbc.properties" /></beans>
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/spring_teachjdbc.username=rootjdbc.password=123
a. 将DataSource注入到JDBCTemplate中:
@Resourcepublic void setDataSource(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}
b. 添加数据
public void add(User user, int gid) {jdbcTemplate.update("insert into t_user(username, password, nickname, gid) value(?, ?, ?, ?)",user.getUsername(), user.getPassword(),user.getNickname(), gid);}
c.修改数据
public void update(User user) {jdbcTemplate.update("update t_user set username=?, password=?,nickname=? where id=?", user.getUsername(), user.getPassword(), user.getNickname(), user.getId());}
d. 删除数据
public void delete(int id) {jdbcTemplate.update("delete from t_user where id=?", id);}
在查询对象的时候,需要用到RowMappe类:
public class UserMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {Group g = new Group();g.setId(rs.getInt("gid"));g.setName(rs.getString("name"));User u = new User();u.setGroup(g);u.setId(rs.getInt("uid"));u.setNickname(rs.getString("nickname"));u.setPassword(rs.getString("password"));u.setUsername(rs.getString("username"));return u;}}
e. 查询一条数据
public User load(int id) {String sql = "select t1.id uid, t1.*, t2.* from t_user t1 left join t_group t2 on (t1.gid=t2.id) where t1.id=?";/** * 第一个参数是SQL语句 第二个参数是SQL语句中的参数值,需要传入一个对象数组 * 第三个参数是RowMapper,这个RowMapper可以完成一个对象和数据库字段的对应,实现这个RowMapper需要 * 实现mapRow方法,在mapRow方法中有rs这个参数,通过rs可以有效的获取数据库的字段 */User u = (User) jdbcTemplate.queryForObject(sql, new Object[] { id }, new UserMapper());return u;}
f. 查询一组数据
public List<User> list(String sql, Object[] args) {//获取整数值String sqlCount = "select count(*) from t_user";int count = jdbcTemplate.queryForInt(sqlCount);System.out.println("count = "+count);//获取String类型的列表String sqlNickname = "select nickname from t_user";List<String> nicknameList = jdbcTemplate.queryForList(sqlNickname, String.class);for(String str : nicknameList){System.out.println(str);}//以下写法无法查询数据/*String sqlStrs = "select username, nickname from t_user";List<User> users = jdbcTemplate.queryForList(sqlStrs, User.class);for(User user : users){System.out.println(user);}*///以下写法也无法查询数据/*String sqlStrs = "select username, nickname from t_user";List<Object []> users = jdbcTemplate.queryForObject(sqlStrs, Object[].class);*///只能通过RowMapper来实现/*String sqlStrs = "select username, nickname from t_user";List<User> users = jdbcTemplate.query(sqlStrs, new RowMapper<User>(){@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User u = new User();u.setUsername(rs.getString("username"));u.setNickname(rs.getString("nickname"));return u;}});for(User user:users){System.out.println(user);}*/return jdbcTemplate.query(sql, args, new UserMapper());}
- Spring学习之JdbcTemplate
- 【Spring学习】之 JdbcTemplate
- spring学习之JdbcTemplate
- Spring之JDBCTemplate学习
- Spring学习之 jdbcTemplate操作
- 学习Spring中的JdbcTemplate
- Spring JdbcTemplate学习笔记
- Spring JdbcTemplate基础学习
- Spring JDBCTemplate学习笔记
- Spring之JDBCTemplate使用
- Spring之JdbcTemplate
- spring之jdbcTemplate实例
- spring 之jdbcTemplate使用
- Spring 之 JdbcTemplate
- spring之jdbctemplate
- spring boot之JdbcTemplate
- spring之jdbcTemplate
- Spring学习5--spring+JDBCTemplate
- poj 2063 Investment
- 网页布局:浮动部件紧贴主体
- UIView的 contentStretch属性
- 闭包的应用场景二
- iOS:工程架构
- Spring学习之JdbcTemplate
- Extjs异步请求判断Session超时的方法
- 闭包的应用场景三
- Java中Interface的用法
- new/delete和malloc/free的区别
- android中sdk更新时, google不能访问 怎么解决?
- IOS 国际化 (项目名和内容)
- C++学习笔记:随机数的生成、double和float的区别
- js获取实时时间