持久化层的ORM倒是很多的,之前学校的项目中用到了hibernate,虽然说是轻量级,但是感觉也挺重量级的,其查询、删除、更新等方法虽然接近SQL语法,但是也是有区别,反正觉得不是很好用。Mybatis也早有耳闻,越来越多的公司在采用,其主要的方便之处是动态化的原生态sql语句、基于xml配置的sql语句和java程序解耦,感觉这两个主要特性设计得相当好用。
首先,要想使用ibatis,自定义的DAO类要继承org.springframework.orm.ibatis.support.SqlMapClientDaoSupport,SqlMapClientDaoSupport继承自大家都熟悉的org.springframework.dao.support.DaoSupport。现在有一个RoleDao类,继承SqlMapClientDaoSupport,然后在Spring的实例化Bean配置文件中配置如下。
application.xml中
<bean id="roleDao" class="com.XXXX.YY.qs.admin.dao.RoleDao">
<property name="sqlMapClientTemplate">
<ref bean="qsAdminSqlMapClientTemplate" />
</property>
</bean>
显然RoleDao中没有sqlMapClientTemplate,该成员来自继承的SqlMapClientDaoSupport。
接下来是几个对象的依次注入:org.apache.commons.dbcp.BasicDataSource配置好用户名、密码、URL连接字符串后注入到org.springframework.orm.ibatis.SqlMapClientFactoryBean,SqlMapClientFactoryBean的configLocation是一个org.springframework.core.io.Resource类的对象,加载的xml文件包含了映射的sql语句。SqlMapClientTemplate类的对象中的sqlMapClient本来应该注入一个SqlMapClient类的对象,但是这里注入了一个SqlMapClientFactoryBean类的对象。现在还没有看懂源码中这里是怎么转化过去的,目前看到SqlMapClientFactoryBean类中有一个SqlMapClient类的成员,其getObject方法将该成员返回了,应该是返回的对象被注入了。下面给出配置文件。
application.xml中
<bean id="qsAdminDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://10.10.58.45:3306/envideo9?useUnicode=true&characterEncoding=gbk" />
<property name="username" value="username" />
<property name="password" value="passwd" />
</bean>
<bean id="qsAdminSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:conf/ibatis/qs_admin/SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="qsAdminDataSource" />
</property>
</bean>
<bean id="qsAdminSqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient">
<ref bean="qsAdminSqlMapClient" />
</property>
</bean>
conf/ibatis/qs_admin/SqlMapConfig.xml
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Role">
<typeAlias alias="role" type="com.XXXX.YY.qs.admin.entity.Role" />
<resultMap class="role" id="RoleBasicResultMap">
<result property="id" column="id" />
<result property="remark" column="remark" />
<result property="active" column="active" />
</resultMap>
<resultMap class="role" id="roleWithRoleBasicResultMap" extends="RoleBasicResultMap">
<result property="menus" column="id" select="Role.getMenusByRoleId"/>
</resultMap>
<select id="getAllRoles" resultMap="RoleBasicResultMap">
select
id,
remark,
active
from
b_role
</select>
</sqlMap>
RoleDao的部分片段如下
public class RoleDao extends SqlMapClientDaoSupport {
public List<Role> getAllRoles()
{
List<Role> list=this.getSqlMapClientTemplate().queryForList("Role.getAllRoles");
if(list == null)
return new ArrayList<Role>();
return list;
}