我的 MyBatis 实现的 Dao 层

  

     学了 Mybatis 之后,发现用 Mybatis 写 Dao层实在是简便多了,主要是在表的映射这块简单了很多。下面是我实现的使用 Mybatis 实现的简单的操作用户表的 Dao 层。

使用 Mybatis 实现 DAO 层,一共有两种方式:

  1. 原始的 DAO 层的实现
  2. 使用 Mapper 代理方式【这里又分两种:直接配置 Mapper 代理;使用包扫描配置 Mapper 代理】

两种方式都需要创建实体类,接口类;

第一种方式需要

  • 创建接口的实现类,并且要继承 SqlSessionDaoSuppurt【用于获取 SqlSession 对象,用于执行CRUD】 ;
  • 需要在 SqlMapConfig.xml 文件中注册对应的 Mapper.xml 文件资源
  • 当然,DAO 层的实现类必须在 Spring 容器中配置 bean

第二种方式需要遵守四个原则:

  • Mapper 接口中方法名 == XxxMappe.xml 文件的中每个 statement 的 id 名
  • 接口方法返回值类型要和 XxxMapper.xml 文件的中定义的每个 sql 的返回值类型 resultType 一致
  • 接口方法参数类型和 XxxMapper.xml 文件的入参类型 parameType 要一致
  • XxxMapper.xml 文件的 namespace 属性必须是对应接口类的全类名

第二种方式 - 01:【直接配置 Mapper 代理的实现】

  • 需要在 applicationContext.xml 文件中添加 MapperFactoryBean 的配置,并且注入 SqlSessionFactory 以及需要被代理的对象

(即之前的 Mapper接口类)

下面是一个简单的配置:

<!-- 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 文件的位置。

其中配置的 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>
原文地址:https://www.cnblogs.com/daimajun/p/7106057.html