學了 Mybatis 以後,發現用 Mybatis 寫 Dao層實在是簡便多了,主要是在表的映射這塊簡單了不少。下面是我實現的使用 Mybatis 實現的簡單的操做用戶表的 Dao 層。spring
使用 Mybatis 實現 DAO 層,一共有兩種方式:sql
- 原始的 DAO 層的實現
- 使用 Mapper 代理方式【這裏又分兩種:直接配置 Mapper 代理;使用包掃描配置 Mapper 代理】
兩種方式都須要建立實體類,接口類;apache
第一種方式須要mybatis
- 建立接口的實現類,而且要繼承 SqlSessionDaoSuppurt【用於獲取 SqlSession 對象,用於執行CRUD】 ;
- 須要在 SqlMapConfig.xml 文件中註冊對應的 Mapper.xml 文件資源
- 固然,DAO 層的實現類必須在 Spring 容器中配置 bean
第二種方式須要遵照四個原則:app
- Mapper 接口中方法名 == XxxMappe.xml 文件的中每一個 statement 的 id 名
- 接口方法返回值類型要和 XxxMapper.xml 文件的中定義的每一個 sql 的返回值類型 resultType 一致
- 接口方法參數類型和 XxxMapper.xml 文件的入參類型 parameType 要一致
- XxxMapper.xml 文件的 namespace 屬性必須是對應接口類的全類名
第二種方式 - 01:【直接配置 Mapper 代理的實現】測試
- 須要在 applicationContext.xml 文件中添加 MapperFactoryBean 的配置,而且注入 SqlSessionFactory 以及須要被代理的對象
(即以前的 Mapper接口類)this
下面是一個簡單的配置:spa
<!-- Mapper代理的方式開發方式一,配置Mapper代理對象 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!-- 配置Mapper接口 --> <property name="mapperInterface" value="com.msym.cloudnote.dao.UserDao" /> <!-- 配置sqlSessionFactory --> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>若是沒有在mybatis-config.xml 中寫 <mappers> 標籤指定 XxxMapper.xml 文件的話,或者沒有 mybatis-config.xml 文件的話,也能夠像以下配置:【其中 mapperLocations 指定的是 XxxMapper.xml 文件】代理
<!-- 配置SqlSessionFactoryBean,用於Mapper的動態代理 --> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定鏈接資源 --> <property name="dataSource" ref="dbpool" /> <!-- 採用通配符的方式,指定映射文件--> <property name="mapperLocations" value="classpath:mapper/*.xml" /> </bean>這裏能夠指定 sqlMapConfig.xml 的路徑,若是整合到 Spring的配置文件的話,就能夠經過 mapperLocation,指定 Mapper 文件的位置。code
其中配置的 MapperFactoryBean 是屬於 mybatis-spring 整合包。
測試方法:
public class UserMapperTest { private ApplicationContext context; @Before public void setUp() throws Exception { this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); } @Test public void testQueryUserById() { // 根據接口,獲取 Mapper 對象 UserMapper userMapper = this.context.getBean(UserMapper.class); User user = userMapper.queryUserById(1); System.out.println(user); } }
第二種方式 - 02:【採用包掃描設置 Mapper 代理的實現】
- 須要在 applicationContext.xml 文件中添加 MapperScannerConfigurer 的配置,並注入 Mapper接口所在的包便可,不須要注入 sqlSessionFactory 了【掃描器會自動掃描基本包的及其子類下全部的類】
代理出來的 Mapper對象 id 就是接口類名,首字母小寫。<!-- Mapper代理的方式開發方式二,掃描包方式配置代理 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入基本包,配置Mapper接口所在包 --> <property name="basePackage" value="com.msym.cloudnote.dao" /> </bean>
UserDAO接口文件:
package com.msym.cloudnote.dao; import com.msym.cloudnote.entity.User; /** * 用於操做用戶表 * * @author 碼上猿夢 http://www.cnblogs.com/daimajun/ */ public interface UserDAO { /** * 根據名字查 * @param name * @return */ public User findUserByName(String name); /** * 增長用戶,用於註冊 * @param user * @return */ public int addUser(User user); /** * 根據用戶Id,獲取用戶信息 * @param userId * @return */ public User findUserById(String userId); /** * 修改密碼 * @param user * @return */ public int modifyPwd(User user); }
對應的 UserMapper.xml 文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.msym.cloudnote.dao.UserDAO"> <!-- 修改密碼 --> <update id="modifyPwd" parameterType="com.msym.cloudnote.entity.User"> update cn_user set cn_user_password = #{ password } where cn_user_id = #{ id } </update> <!-- 根據Id查詢用戶信息 --> <select id="findUserById" parameterType="string" resultType="com.msym.cloudnote.entity.User"> select cn_user_id as id, cn_user_name as name, cn_user_password as password, cn_user_token as token, cn_user_nick as nick from cn_user where cn_user_id = #{ userId } </select> <!-- 根據用戶名查詢用戶信息 --> <select id="findUserByName" parameterType="string" resultType="com.msym.cloudnote.entity.User"> select cn_user_id as id, cn_user_name as name, cn_user_password as password, cn_user_token as token, cn_user_nick as nick from cn_user where cn_user_name = #{ name } </select> <!-- 用戶註冊 --> <insert id="addUser" parameterType="com.msym.cloudnote.entity.User"> insert into cn_user( cn_user_id, cn_user_name, cn_user_password, cn_user_token, cn_user_nick ) values( #{ id }, #{ name }, #{ password }, #{ token }, #{ nick } ) </insert> </mapper>