从2010开始接触iBatis到现在,一直到现在把iBatis作为数据访问层ORM。为了演示一个Web应用,今天又搭了个SpringMVC应用,由于应用比较简单,Spring版本直接用最新版本3.2.4.RELEASE,结果惊讶的发现,Spring已经不推荐使用iBatis了,SqlMapClientDaoSupport类已经加上了@deprecated as of Spring 3.2, in favor of the native Spring support in the Mybatis follow-up project (http://code.google.com/p/mybatis/)注解。于是乎,简单的学习了下MyBatis3,在这里把学习笔记记录下来,希望能对和我一样,在从iBatis转入到MyBatis的网友一些参考。
1、增加Maven依赖
由于要整合Spring和MyBatis,所以至少需要spring/springmvc和mybatis-spring的Maven依赖,和Spring一样,直接使用最新版本:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.1</version> </dependency>
2、增加MyBatis的配置文件
和iBatis的SqlMapConfig配置一样,MyBatis也有一个总配置文件,本应用中为mybatis-config.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="UserDO" type="com.github.obullxl.jeesite.dal.dto.UserDO" /> </typeAliases> <mappers> <mapper resource="mybatis/mappers/atom-user-mapper.xml" /> </mappers> </configuration>
在该文件中,增加一个类型别名,类型别名的目的是避免多次输入过长的类路径;同时有一个映射文件,它和iBatis的sqlmapping文件一样,里面是动态SQL内容;熟悉iBatis的朋友会发现,其实MyBatis和iBatis的思路其实差不多的。
3、增加映射文件
从中配置文件和结合iBatis的SqlMap文件可以得出,SQL也是需要映射文件,本应用为atom-user-mapper.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="ATOM-USER"> <resultMap id="UserMap" type="UserDO"> <id property="id" column="id" /> <result property="uname" column="uname" /> <result property="passwd" column="passwd" /> <result property="uemail" column="uemail" /> <result property="gmt_create" column="gmtCreate" /> <result property="gmt_modify" column="gmtModify" /> </resultMap> <select id="findAll" resultMap="UserMap" fetchSize="1"> SELECT * FROM atom_user </select> <select id="count" resultType="int"> SELECT COUNT(*) FROM atom_user; </select> </mapper>
大家发现,和sqlmapping文件非常的相似,其中ResultMap的class用type代替,由于我们的中配置文件中,已经定义了UserDO的别名,所以这里直接用UserDO就行了,无需包含包名称。
4、增加Spring配置文件
在Spring配置文件中,定义MyBatis相关的Bean,本应用为mybatis-context.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/osnode?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" /> <property name="username" value="osnode" /> <property name="password" value="site" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="500" /> <property name="defaultAutoCommit" value="true" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> </bean> <bean id="abstractDAO" abstract="true"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="userDAO" parent="abstractDAO" class="com.github.obullxl.jeesite.dal.mybatis.MyBatisUserDAO" /> <bean id="userService" class="com.github.obullxl.jeesite.service.impl.UserServiceImpl" /> </beans>
5、DAO类
接口定义如下:
public interface UserDAO { public int count(); public List<UserDO> findAll(); }
默认实现如下:
public class MyBatisUserDAO extends SqlSessionDaoSupport implements UserDAO { /** * @see com.github.obullxl.jeesite.dal.dao.UserDAO#count() */ public int count() { return this.getSqlSession().selectOne("ATOM-USER.count"); } /** * @see com.github.obullxl.jeesite.dal.dao.UserDAO#findAll() */ public List<UserDO> findAll() { return this.getSqlSession().selectList("ATOM-USER.findAll"); } }
6、测试应用
到目前为止,我们的MyBatis和Spring就整合完成了,写一个简单的Java类看看:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/mybatis-context.xml"); UserService service = context.getBean(UserService.class); int count = service.count(); logger.warn("Count value is:{}", count); List<UserDO> users = service.findAll(); logger.warn("All users:\n{}", users); }
哈哈,可以看到我们所希望的结果,有了基本的框架,接下来就是补充应用其他内容了……