- 浏览: 4380756 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (163)
- 职场 && 心情 (22)
- Java/Basic (17)
- Java/Compression (7)
- Java/Security (20)
- Java/Maven (3)
- Java/Cache (11)
- Eclipse (4)
- Spring (19)
- ORM/Hibernate (2)
- ORM/iBatis (3)
- DB/NoSQL (11)
- DB/MySQL (7)
- DB/MS SQL Server (4)
- OS/Linux (11)
- OS/Mac (7)
- C/C++ (4)
- Server Architecture/Basic (13)
- Server Architecture/Distributed (17)
- Moblie/Andriod (2)
- WebService (3)
- Objective-C (1)
- Html (1)
- 设计模式 (1)
- Scala (0)
- Kafka (1)
最新评论
-
w47_csdn:
证书安装:在"浏览"选项中选择" ...
Java加密技术(九)——初探SSL -
w47_csdn:
spiritfrog 写道你好,我按照你的步骤,tomcat中 ...
Java加密技术(九)——初探SSL -
liuyachao111:
11楼说的对 用@ControllerAdvicepublic ...
Spring 注解学习手札(八)补遗——@ExceptionHandler -
irayslu:
作者你好, 我把你的源码放在jdk6, jdk7 中运行正常, ...
Java加密技术(五)——非对称加密算法的由来DH -
夏季浅忆-卖小子:
为什么不能解压rar格式的压缩包呢
Java压缩技术(三) ZIP解压缩——Java原生实现
今天,我们玩玩数据库,搞搞持久层。不搞太复杂的东西,Spring注解对于持久层的改造并不难懂! 我们用最直接的JdbcTemplate诠释Spring注解持久层部分,关于业务层和事务控制,稍后详述! 某位兄弟不要着急,咱要一步一步来!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
这里将用到以下几个包:
aopalliance-1.0.jar
commons-collections.jar
commons-dbcp.jar
commons-logging-1.1.1.jar
commons-pool.jar
jstl.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.6-bin.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-tx-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard.jar
主要增加了commons-collections.jar、commons-dbcp.jar、commons-pool.jar、mysql-connector-java-5.1.6-bin.jar和spring-jdbc-2.5.6.jar
先弄个数据库,这里使用MySQL,我的最爱! 可惜前途未卜!
建库:
建表:
插入默认数据:
给出一个数据库查询的结果:
很不巧,为了能让数据查询更有意义,我又要改动Account类:
Account.java
这样,域对象与数据库表将完成一一对应绑定关系。
再建立一个用于构建数据源配置的文件database.properties
database.properties:
该文件位于/WEB-INF/目录下。
接下来,我们需要把它引入spring容器,修改applicationContext.xml:
applicationContext.xml
如果需要引入多个properties文件,可以用逗号分隔。
这时,我们已经引入了数据源配置,我们可以通过修改dao.xml构建基于DBCP的数据源:
dao.xml中dataSource配置
上述配置稀松平常,没有什么好阐述的内容,这与一般spring配置无异样。
需要注意的是这个jdbcTemplate配置!
dao.xml中jdbcTemplate配置
这个配置很关键,如果你要使用其他的ORM框架,同样需要配置这样的模板类,在Dao实现中无需继承JdbcDaoSupport类。
不需要明确JdbcTemplate的id(id="jdbcTemplate")吗?不再需要了!
AccountDao.java
AccountDaoImpl.java
分段详述:
注解@Repository明确这个类是用于持久层的实现类,注意这样的注解不能用于接口,仅适用于实现类!
同时,不再需要继承JdbcDaoSupport类,其而代之的是直接注入JdbcTemplate类!
再看声明JdbcTemplate类:
需要说明一下,这里的JdbcTemplate对象jdbcTemplate名称可以自定,没有任何限制!
这里使用 RowMapper 定义了一个用于绑定Account域对象的内部映射类:
RowMapper
语句级的内容,十分简单,如下所示:
写完这两段代码不由感慨,我曾经就这么噼里啪啦的敲了一年多这样的代码。不断的做绑定、映射、写SQL,直到可以有机会将持久层JDBC实现替换Hibernate、iBatis,我才得以解放!
接着,再调整一下Service实现类
AccountServiceImpl.java
使用AccountDao接口来完成响应的操作,逻辑部分不做详述,根据业务逻辑而定!
稍稍修改一下profile.jsp,将用户的生日、邮件地址都输出出来!
启动应用,登录,查看用户信息:
相关代码见附件!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
你是理解反了吧,我反而觉得JdbcTemplate更灵活,最接近原生sql故而系统的性能也更高了一步
别急,胳膊肘扭伤了,让我歇会接着来~
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
这里将用到以下几个包:
引用
aopalliance-1.0.jar
commons-collections.jar
commons-dbcp.jar
commons-logging-1.1.1.jar
commons-pool.jar
jstl.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.6-bin.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-tx-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard.jar
主要增加了commons-collections.jar、commons-dbcp.jar、commons-pool.jar、mysql-connector-java-5.1.6-bin.jar和spring-jdbc-2.5.6.jar
先弄个数据库,这里使用MySQL,我的最爱! 可惜前途未卜!
建库:
CREATE DATABASE `spring` /*!40100 DEFAULT CHARACTER SET utf8 */;
建表:
DROP TABLE IF EXISTS `spring`.`account`; CREATE TABLE `spring`.`account` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `birthday` datetime NOT NULL, `email` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
插入默认数据:
INSERT INTO `spring`.`account`( `username`, `password`, `birthday`, `email`) VALUES( 'snowolf', 'zlex', '2010-01-01', 'snowolf@zlex.org');
给出一个数据库查询的结果:
很不巧,为了能让数据查询更有意义,我又要改动Account类:
Account.java
public class Account implements Serializable { /** * 主键 */ private int id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 生日 */ private Date birthday; /** * Email */ private String email; // get方法set方法省略 }
这样,域对象与数据库表将完成一一对应绑定关系。
再建立一个用于构建数据源配置的文件database.properties
database.properties:
dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/spring dataSource.username=root dataSource.password=admin dataSource.maxActive=200 dataSource.maxIdle=50 dataSource.maxWait=10000
该文件位于/WEB-INF/目录下。
接下来,我们需要把它引入spring容器,修改applicationContext.xml:
applicationContext.xml
<context:property-placeholder location="/WEB-INF/database.properties" />
如果需要引入多个properties文件,可以用逗号分隔。
这时,我们已经引入了数据源配置,我们可以通过修改dao.xml构建基于DBCP的数据源:
dao.xml中dataSource配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false" p:driverClassName="${dataSource.driverClassName}" p:url="${dataSource.url}" p:username="${dataSource.username}" p:password="${dataSource.password}" p:maxActive="${dataSource.maxActive}" p:maxIdle="${dataSource.maxIdle}" p:maxWait="${dataSource.maxWait}" />
上述配置稀松平常,没有什么好阐述的内容,这与一般spring配置无异样。
需要注意的是这个jdbcTemplate配置!
dao.xml中jdbcTemplate配置
<bean class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" />
这个配置很关键,如果你要使用其他的ORM框架,同样需要配置这样的模板类,在Dao实现中无需继承JdbcDaoSupport类。
不需要明确JdbcTemplate的id(id="jdbcTemplate")吗?不再需要了!
AccountDao.java
public interface AccountDao { /** * 读取账户信息 * * @param username * @return */ Account read(String username); /** * 读取账户信息 * * @param id * @return */ Account read(int id); }
AccountDaoImpl.java
/** * 2010-1-23 */ package org.zlex.spring.dao.impl; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import org.zlex.spring.dao.AccountDao; import org.zlex.spring.domain.Account; /** * 账户数据库实现 * * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */ @Repository public class AccountDaoImpl implements AccountDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public Account read(String username) { String sql = "SELECT * From account WHERE username = ?"; return (Account) jdbcTemplate.queryForObject(sql, new Object[] { username }, accountRowMap); } @Override public Account read(int id) { String sql = "SELECT * From account WHERE id = ?"; return (Account) jdbcTemplate.queryForObject(sql, new Object[] { id }, accountRowMap); } protected RowMapper accountRowMap = new RowMapper() { @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Account account = new Account(); account.setId(rs.getInt("id")); account.setUsername(rs.getString("username")); account.setPassword(rs.getString("password")); account.setBirthday(rs.getDate("birthday")); account.setEmail(rs.getString("email")); return account; } }; }
分段详述:
注解@Repository明确这个类是用于持久层的实现类,注意这样的注解不能用于接口,仅适用于实现类!
同时,不再需要继承JdbcDaoSupport类,其而代之的是直接注入JdbcTemplate类!
再看声明JdbcTemplate类:
@Autowired private JdbcTemplate jdbcTemplate;
需要说明一下,这里的JdbcTemplate对象jdbcTemplate名称可以自定,没有任何限制!
这里使用 RowMapper 定义了一个用于绑定Account域对象的内部映射类:
RowMapper
protected RowMapper accountRowMap = new RowMapper() { @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Account account = new Account(); account.setId(rs.getInt("id")); account.setUsername(rs.getString("username")); account.setPassword(rs.getString("password")); account.setBirthday(rs.getDate("birthday")); account.setEmail(rs.getString("email")); return account; } };
语句级的内容,十分简单,如下所示:
@Override public Account read(String username) { String sql = "SELECT * From account WHERE username = ?"; return (Account) jdbcTemplate.queryForObject(sql, new Object[] { username }, accountRowMap); } @Override public Account read(int id) { String sql = "SELECT * From account WHERE id = ?"; return (Account) jdbcTemplate.queryForObject(sql, new Object[] { id }, accountRowMap); }
写完这两段代码不由感慨,我曾经就这么噼里啪啦的敲了一年多这样的代码。不断的做绑定、映射、写SQL,直到可以有机会将持久层JDBC实现替换Hibernate、iBatis,我才得以解放!
接着,再调整一下Service实现类
AccountServiceImpl.java
public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; @Override public Account read(String username, String password) { Account account = accountDao.read(username); if (!password.equals(account.getPassword())) { account = null; } return account; } @Override public Account read(int id) { return accountDao.read(id); } }
使用AccountDao接口来完成响应的操作,逻辑部分不做详述,根据业务逻辑而定!
稍稍修改一下profile.jsp,将用户的生日、邮件地址都输出出来!
<fieldset><legend>用户信息</legend> <ul> <li><label>用户名:</label><c:out value="${account.username}" /></li> <li><label>生日:</label><fmt:formatDate value="${account.birthday}" pattern="yyyy年MM月dd日" /></li> <li><label>Email:</label><c:out value="${account.email}" /></li> </ul> </fieldset> 标签<fmt:formatDate />用于格式化输出,大家可以了解一下,很简单很好用的标签! :D
启动应用,登录,查看用户信息:
相关代码见附件!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
评论
6 楼
di1984HIT
2017-06-25
RowMapper思路其实和mybatis类似,还是类库没封装好。
5 楼
Spirit_eye
2015-08-31
evaspring 写道
顶楼主 ~
RowMapper 实在是让人痛苦啊,还是 ibatis 好啊 !
RowMapper 实在是让人痛苦啊,还是 ibatis 好啊 !
你是理解反了吧,我反而觉得JdbcTemplate更灵活,最接近原生sql故而系统的性能也更高了一步
4 楼
newbeehi
2013-06-19
[list] [*]引用[u][b][i][u][/u][/i][/b][/u]
[/list]
3 楼
snowolf
2010-02-02
javaz 写道
事务没有体现呢!
别急,胳膊肘扭伤了,让我歇会接着来~
2 楼
javaz
2010-02-02
事务没有体现呢!
1 楼
evaspring
2010-02-02
顶楼主 ~
RowMapper 实在是让人痛苦啊,还是 ibatis 好啊 !
RowMapper 实在是让人痛苦啊,还是 ibatis 好啊 !
发表评论
-
征服 Redis + Jedis + Spring (三)—— 列表操作
2013-03-06 16:16 83952一开始以为Spring下操 ... -
Memcached笔记——(四)应对高并发攻击
2012-09-13 09:48 28918近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意 ... -
征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
2012-08-29 18:29 82313不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然 ... -
征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
2012-08-29 16:30 157441有日子没写博客了,真的是忙得要疯掉。 完成项目基础架构搭建 ... -
Spring 注解学习手札(八)补遗——@ExceptionHandler
2012-08-17 18:35 84100Spring注解,改变了我的 ... -
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
2012-08-10 21:27 439615最近需要做些接口服务,服务协议定为JSON,为了整合在Spri ... -
征服 Kestrel + XMemcached + Spring TaskExecutor
2012-07-30 14:43 6196上一篇征服 Kestrel + XMemcached只是对Ke ... -
征服Spring AOP—— @AspectJ
2012-04-10 12:01 18648接N年前写的一篇Spring AOP相关的内容征服Spring ... -
Memcached笔记——(二)XMemcached&Spring集成
2012-04-01 09:55 42315今天研究Memcached的Java的Client,使用XMe ... -
Spring util
2011-02-24 12:02 01,<util:constant/> 取代了之前通 ... -
Spring HttpInvoke实现,以及效率提升!
2010-07-01 17:38 15015最近接手服务器总被人质疑效率问题,说到底是质疑Spring H ... -
Spring 注解学习手札(六) 测试
2010-02-05 16:28 53152既然系统基于注解自成一体,那么基于Spring的测试是否可以依 ... -
Spring 注解学习手札(五) 业务层事务处理
2010-02-04 16:11 25338控制器层、持久层都有 ... -
Spring 注解学习手札(三) 表单页面处理
2010-01-26 15:21 40473昨天小歇一天,看着两篇博客迅速飙升的点击率,十分欣慰。今天来研 ... -
Spring 注解学习手札(二) 控制层梳理
2010-01-24 15:53 36562昨天对Spring注解有了一 ... -
Spring 注解学习手札(一) 构建简单Web应用
2010-01-23 13:40 83369近来工作发生了一些变化,有必要学习一下Spring注解了! ... -
征服Spring AOP—— Schema
2008-09-03 17:41 6427自从开始使用Spring,就接触到AOP,但一直未能深入,沉淀 ... -
关于Spring中Commons Validator的使用说明
2008-09-01 09:57 8133关于Spring中Commons Validator的使用说明 ... -
acegi 我该从哪里取到用户的信息
2006-09-21 17:32 5774项目需要 用acegi做为安全屏障,按acegi 1.0.1 ...
相关推荐
Spring 注解学习手札,个人学习Spring mvc的知识总结
NULL 博文链接:https://snowolf.iteye.com/blog/577989
NULL 博文链接:https://snowolf.iteye.com/blog/578452
NULL 博文链接:https://snowolf.iteye.com/blog/587602
NULL 博文链接:https://snowolf.iteye.com/blog/580194
NULL 博文链接:https://snowolf.iteye.com/blog/588351
NULL 博文链接:https://snowolf.iteye.com/blog/1628861
分享Perl_学习手札书籍,供大家学习、参考及交流perl。
perl学习手札,共同学习,共同进步。希望你能很快掌握perl。
关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”
Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm
Perl 学习手札,这本书介绍了perl的基本语法及perl的一些用法,想了解perl的就看一看
hibernate学习手札.z03
Perl 学习手札,好东西
hibernate学习手札.z01
本资料完全来源于网上收集,对于作者并没有做过多的考证,考虑到作者本身,所以保持原作品不变只是略加整理,为用户提供一个方便的浏览方式。
1-高级perl编程(黑豹书).pdf 2-Perl_学习手札.pdf
8086汇编学习手札及各章节检测题详细答案。 配套书籍 王爽的汇编
非常著名的perl学习手札(初学者有福了),本文档是精美的PDF版,排版精美,是网络上到现在为止能找到的最好的。 全书共分17个小节,通过讲解实例来学习perl,你可以复制这些代码,然后执行。学习非常方便!