個人 MyBatis 實現的 Dao 層

  

     學了 Mybatis 以後,發現用 Mybatis 寫 Dao層實在是簡便多了,主要是在表的映射這塊簡單了不少。下面是我實現的使用 Mybatis 實現的簡單的操做用戶表的 Dao 層。spring

使用 Mybatis 實現 DAO 層,一共有兩種方式:sql

  1. 原始的 DAO 層的實現
  2. 使用 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>

image

這裏能夠指定 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代理的方式開發方式二,掃描包方式配置代理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 注入基本包,配置Mapper接口所在包 -->
    <property name="basePackage" value="com.msym.cloudnote.dao" />
</bean>
代理出來的 Mapper對象 id 就是接口類名,首字母小寫。

 

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>
相關文章
相關標籤/搜索