版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337140
MyBatis常用的开发DAO的方式有两种,第一种就是常用的原始DAO的开发方法,第二种就是Mapper代理的方法。
原始DAO开发方法
原始DAO开发方法就是之前文章《【MyBatis框架点滴】——初识+环境搭建》中的DAO实现方法,编写相应pojo的xml文件,定义DAO接口及其实现类,限于篇幅,这里不再copy-paste~
Mapper代理方法
使用Mapper代理方法开发,与原始DAO开发方法类似,编写mapper配置文件(相当于User.xml)、定义Mapper接口(相当于DAO接口)。
mapper配置文件:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD iBatis Mapper 3.0 //EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.danny.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int"
resultType="com.danny.mybatis.po.User">
select * from user where id=#{id}
</select>
<select id="findUserByName" parameterType="java.lang.String"
resultType="com.danny.mybatis.po.User">
select * from user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="com.danny.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.danny.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
</mapper>
Mapper接口:
UserMapper.java
package com.danny.mybatis.mapper;
import java.util.List;
import com.danny.mybatis.po.Person;
import com.danny.mybatis.po.User;
/**
* @ClassName:UserMapper
* @Description:用户Mapper
* @author Danny
* @date 2016年5月29日上午9:06:58
*/
public interface UserMapper {
/**
* 根据id查询用户信息
* @param id
* @return
* @throws Exception
*/
public User findUserById(int id) throws Exception;
/**
* 根据用户名模糊查询用户信息
* @param userName
* @return
* @throws Exception
*/
public List<User> findUserByName (String userName) throws Exception;
/**
* 添加用户信息
* @param user
* @throws Exception
*/
public int insertUser(User user) throws Exception;
/**
* 删除用户信息
* @param id
* @throws Exception
*/
public void deleteUser(int id) throws Exception;
/**
*
* @param 更新用户
* @throws Exception
*/
public void updateUser(User user) throws Exception;
}
如上,对表数据库进行操作时,不需要手动实现mapper接口中的方法(MyBatis框架根据接口定义创建接口的动态代理对象,代理对象的方法跟上面DAO接口的实现类方法类似),直接调用即可。
比如:
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.selectByPrimaryKey(1);
System.out.println(null==user?"":user.getUsername());
但是编写mapper配置文件与mapper接口有如下几条约束:
1、mapper配置文件中的namespace必须为mapper接口的全路径(这里为com.danny.mybatis.mapper.UserMapper)
2、mapper接口中的方法名必须为mapper配置文件中statement的id(这里的findUserById、findUserByName等)
3、mapper接口中方法的输入参数类型必须与mapper配置文件中statement的parameterType指定的类型一致
4、mapper接口中方法的返回值类型必须与mapper配置文件中statement的resultType指定的类型一致。
当查询结果返回单条数据时(比如上面的findUserById方法),代理对象内部通过SqlSession的selectOne方法执行查询;当查询结果返回集合时(比如上面的findUserByName方法),代理对象内部通过SqlSession的selectList方法执行查询。
小结
在原始DAO开发方法中,操作数据库需要用SqlSession提供的方法,且SqlSession中有些方法的参数类型为Object类型,所以操作的时候传入的变量类型如果错误,在系统编译阶段无法暴露出来,增加开发负担。
利用Mapper代理开发,除了避免编写mapper接口的实现类,mapper接口、mapper映射文件甚至pojo也可以通过mybatis代码生成器——MyBatisGenerator来自动生成,具有快速、高效的特点。
【 转载请注明出处——胡玉洋《【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法 》】