博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iBATIS&Spring合奏(一)--DAO
阅读量:2015 次
发布时间:2019-04-28

本文共 6603 字,大约阅读时间需要 22 分钟。

    iBATIS,大家都用的比喻就是什么半自动步枪之类的,没错。一个框架是做神马的相信靠谱点的程序猿们都会先去Google,然后看看官方文档之类的,再在网上找点代码copy下然后运行看看。随后需要深入研究了,需要性能优化了,再去深入研究和体会,牛者自己写个差不多的框架用起来还爽些。这合奏系列文章就是提供给刚刚接受iBATIS框架,想和Spring放在一起用的猿类们的。也是觉得过几阵子不用它自己也会不记得了,先写下来,以后用到的时候也会方便唤醒沉睡的记忆。
     1)iBATIS做ORM,还是很轻便且强大的,某些方面的性能方面比Hibernate好些啦。下面简单建两个数据库。如下图:
     当然,这里先不用外键,今天是第一步。等会会有两表连接的查询,存储过程下次介绍。然后就是POJO也就是domain模型,这里就不列举代码了。Order表中的user会联合User表的username做链接查询。先以user的操作为例。
     2)iBATIS的核心配置文件SqlMapConfig.xml如下:
       这里配置了数据源,属性值通过读取Properties文件获得。这里就不列举该文件了。涉及到了三个sqlMap标签中指明的资源配置文件。
        3)sqlMap配置文件。先看看User.xml。
INSERT INTO user ( username, password, company )VALUES( ?,?,? )
update user set username=#username#, password=#password#, company=#company# where id=#id#
delete from user where id=#id#
       一看就知道了很多的sql语句。参数类型,返回值类型都在CRUD相关标签中配置了。相信熟悉Hibernate的同学看这个应该很容易理解的。##中间夹着的不就是可爱的参数啦,参数,当然我们在后面看是如何传进来的。下面开始把Spring搞进来啦。
        4)Spring在此不介绍了,这里只简单用了Ioc,陆续会加上事务管理的融合再加上Aop的东东。当然也用到了Spring的中间层数据访问的DAO支持。先看beans.xml
classpath:sqlmap.properties
       5)DAO 接口的示例如下。只简单列举到User表的操作DAO。
package com.qiyun.spritis.persistence.sqlmapdao.interfaces;import java.util.List;import org.springframework.dao.DataAccessException;import com.qiyun.spritis.pojo.User;public interface UserDao {   	List
getAllUsers()throws DataAccessException; List
getUserByCompanyName(String compName) throws DataAccessException; void insertUser(User user) throws DataAccessException; void updateUser(User user) throws DataAccessException; void deleteUserById (int id) throws DataAccessException;}
       6)DAO的实现类。这里用到了Spring的Templete方法,和HibernateTemplete差不多。如下先睹为快:
package com.qiyun.spritis.persistence.sqlmapdao.impl;import java.util.List;import org.springframework.dao.DataAccessException;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import com.qiyun.spritis.persistence.sqlmapdao.interfaces.UserDao;import com.qiyun.spritis.pojo.User;public class UserSqlMapDao extends  SqlMapClientDaoSupport implements UserDao {	@Override	public void deleteUserById(int id) throws DataAccessException {		getSqlMapClientTemplate().delete("deleteUser", id);	}		@SuppressWarnings("unchecked")	@Override	public List
getAllUsers() throws DataAccessException { return (List
)getSqlMapClientTemplate().queryForList("getAllUsers"); } @SuppressWarnings("unchecked") @Override public List
getUserByCompanyName(String compName) throws DataAccessException { return (List
)getSqlMapClientTemplate().queryForList("getUsersByCompanyName2",compName); } @Override public void insertUser(User user) throws DataAccessException { getSqlMapClientTemplate().update("insertUser",user); } @Override public void updateUser(User user) throws DataAccessException { getSqlMapClientTemplate().update("updateUser",user); }}
 
      到这里就差不多懂了吧,就是把User。xml配置文件中的id和所要传入的参数给getSqlMapClientTemplate方法去调用iBATIS来处理。Spring只是对iBATIS获取sqlMapClient这个核心类进行了轻量的封装。当然为了把AOP加进来,少不了Service层啦。
       7)Service层,用Spring容器来管理的Dao们要呼之欲出了。以后要加什么逻辑的话还可以进一步封装。UserService类如下:
package com.qiyun.spritis.service;import java.util.List;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.qiyun.spritis.persistence.sqlmapdao.impl.UserSqlMapDao;import com.qiyun.spritis.persistence.sqlmapdao.interfaces.UserDao;import com.qiyun.spritis.pojo.User;public class UserService {		public List
getAllUsers() throws Exception { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserDao service = (UserSqlMapDao)ctx.getBean("userDao"); List
list=(List
)service.getAllUsers(); ctx.destroy(); return list; } public List
getUserByCompanyName(String company)throws Exception { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserDao service = (UserSqlMapDao)ctx.getBean("userDao"); List
list=(List
)service.getUserByCompanyName(company); ctx.destroy(); return list; } public void insertUser(User user) throws Exception{ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserDao service = (UserSqlMapDao)ctx.getBean("userDao"); System.out.println(service.getClass()); service.insertUser(user); ctx.destroy(); } public void deleteUser(int id)throws Exception{ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserDao service = (UserSqlMapDao)ctx.getBean("userDao"); service.deleteUserById(id); ctx.destroy(); } public void updateUser(User user)throws Exception{ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserDao service = (UserSqlMapDao)ctx.getBean("userDao"); service.updateUser(user); ctx.destroy(); }}
       8)以上就不错做解释,下面开始测试啦。用JUnit来测一下吧,比较方便,用单元测试的好处,相信猿类们早有体会。UserServiceTest如下:
package com.qiyun.spritis.test;import java.util.List;import org.junit.Test;import com.qiyun.spritis.pojo.User;import com.qiyun.spritis.service.UserService;public class UserServiceTest {		@Test	public void testGetAllUsers() throws Exception {		UserService us=new UserService();		List
li=us.getUserByCompanyName("TB"); for(int i=0;i
li=us.getAllUsers(); System.out.println("最新添加的员工:"+li.get(li.size()-1).getUsername()); } @Test public void testDeleteUser()throws Exception{ UserService us=new UserService(); us.deleteUser(8); } @Test public void testUpdateUser()throws Exception{ User u=new User(); u.setId(new Integer(8)); u.setUsername("LK"); u.setPassword("lk"); u.setCompany("IBM"); UserService us=new UserService(); us.updateUser(u); } }
       到此。一个Spring和iBATIS的前奏总算演奏完了。当然很简单的一个示例。后面会陆续加上连接查询,动态SQL,以及一些Handler的介绍。等用熟了之后再深入其架构,一个好用的框架当然少不了好的设计模式。先到这里。源码奉上。如果运行中报错,希望同学们先Google一下,可能是缺jar包哦。项目压缩包:spritis(Spring+iBATIS)
  • 大小: 26.2 KB
  • (26.3 KB)
  • 下载次数: 19

转载地址:http://vljxf.baihongyu.com/

你可能感兴趣的文章
source insight快捷键及使用技巧
查看>>
映 射 ALT 键
查看>>
vim使用快捷键F4生成文件头注释、F5生成main函数模板、F6生成.h文件框架模板
查看>>
SERVICE_UNAVAILABLE/1/state not recovered / initialized
查看>>
OV5620的视频驱动
查看>>
C++中两个类交叉定义或递归定义的解决办法
查看>>
记一次Hive 行转列 引起的GC overhead limit exceeded
查看>>
OpenGL ES八 - 交叉存取顶点数据
查看>>
crontab定时任务写法
查看>>
nginx: [emerg] unknown directive "if($remote_addr" in /usr/local/tools/nginx/conf/nginx.conf:57
查看>>
module pip has no attribute main问题解决
查看>>
LeetCode 134.Gas Station (加油站)
查看>>
Python之命名元组 (namedtuple)
查看>>
使用libpcap过滤arp
查看>>
[转帖]Robots.txt指南
查看>>
正则表达式简介(微软)--6.优先权顺序
查看>>
多用户与多租户的区别
查看>>
Python自动化运维 - day14 - JavaScript基础
查看>>
oracle保存小数点前为"0"的问题
查看>>
linux sar 命令详解
查看>>