我的 MyBatis 实现的 Dao 层
学了 Mybatis 之后,发现用 Mybatis 写 Dao层实在是简便多了,主要是在表的映射这块简单了很多。下面是我实现的使用 Mybatis 实现的简单的操作用户表的 Dao 层。
使用 Mybatis 实现 DAO 层,一共有两种方式:
- 原始的 DAO 层的实现
- 使用 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>这里可以指定 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对象 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>