MyBatis学习笔记——06MyBatis mapper接口(相当于dao接口)代理开发方法
为什么要使用mapper接口方法代理?
因为原始的dao的开发方法存在着一些问题:
1.上一节讲到的实现类里存在着许多模板代码如sqlsession的创建等使用代理方法可以减少这种代码减少程序员工作量
2.上一节讲到的实现类里有许多硬编码如test.findUserById等代理方法可以把这些硬编码作为代理的一部分
3.调用sqlsession时传入的变量由于是object类型所以不易发现类型传入错误的问题
mapper接口代理开发方法的规范和注意事项
要写mapper.xml映射文件(和User.xml文件是相同的只不过改动了namespace)
mybatis自动代理开发规范:
特别重要:mapper.xml中的namespace必须和mapper.java中的全限定性名一致(com.lipengge.mybaits.UserMapper)

不要忘了在SqlMapConfig.xml中配置mapper.xml的映射

1.mapper.java接口函数名必须和statement的id一致
2.mapper.java接口函数参数必须和mapper.xml中的一致
3.mapper.java接口函数返回类型必须和mapper.xml中的一致
使用须知:
1.如果mapper返回单个pojo对象则代理对象内部通过selectOne()来实现
2.如果mapper返回多个pojo对象则代理对象内部通过selectList()来实现
开发过程
1.架构同入门程序 加了一个包com.lipengge.mybatis.mapper用来保存mapper接口

package com.lipengge.mybatis.mapper;
import java.util.List;
import com.lipengge.mybatis.bean.User;
public interface UserMapper {
public User findUserById(int id) throws Exception;
public List<User> findUserByName(String name) throws Exception;
public void insertUserById(User user) throws Exception;
public void deleteUserById(int id) throws Exception;
}
2.映射的xml文件增加了一个UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lipengge.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.lipengge.mybatis.bean.User">
SELECT * FROM USERDB WHERE id = #{id}
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="com.lipengge.mybatis.bean.User">
SELECT * FROM USERDB WHERE user_name LIKE '%${value}%'
</select>
<insert id="insertUserById" parameterType="com.lipengge.mybatis.bean.User" >
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into userdb(user_name,user_sex,user_age) values(#{user_name},#{user_sex},#{user_age})
</insert>
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from userdb where id=#{id}
</delete>
<update id="updateUserById" parameterType="com.lipengge.mybatis.bean.User">
update userdb set user_name=#{user_name},user_sex=#{user_sex},user_age=#{user_age} where id=#{id}
</update>
</mapper>
实现类

生成代理对象的关键语句

这句话过后就自动生成了代理对象(相当于UserDaoImpl)
package com.lipengge.mybatis.first;
import static org.junit.Assert.*;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.lipengge.mybatis.bean.User;
import com.lipengge.mybatis.mapper.UserMapper;
public class TestMapper {
private SqlSessionFactory ssf;
@Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
ssf= new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
SqlSession openSession = ssf.openSession();
UserMapper um=openSession.getMapper(UserMapper.class);
System.out.println(um.findUserById(6));
System.out.println(um.findUserByName("振川"));
User user=new User();
user.setUser_age(63);
user.setUser_name("王八蛋");
user.setUser_name("男");
um.insertUserById(user);
System.out.println(user.getId());
um.deleteUserById(22);
openSession.close();
}
}