使用Mapper代理开发,使用mapper接口相当于使用dao接口。mapper代理使用了jdk的代理策略。下面通过User的查找和删除来了解。这里默认有pojo 类sqlMapConfig.xml 已经创建好,就不一一介绍了如果想了解请看我之前的文章。
1. Mapper代理开发规范
使用过程中我们要遵守下面规则:
1. mapper 接口的权限定名(形如:com.mybatis.example.mapper)要和mapper映射文件的namespace值一致
2. mappper接口的方法名称要和mapper映射文件的statement的id一致。
3. mapper接口的方法参数类型要和mapper映射文件statement的parameterType的值一致,而且它的参数是一个。
4. mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
2. 定义mapper 接口
在src目录下新建包 并创建mapper接口
public interface UserMapper {
//查询用户
public User findUserById(int id) throws Exception ;
//插入用户
public int insertUser(User user) throws Exception ;
}
3. mapper 映射文件
在config目录下创建mapper 包然后在mapper包下创建UserMapper.xml (这是mybatis的命名规范,不是必须这个名)
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.mybatis1.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.mybatis1.pojo.User">
select * from USER where id = #{id} ;
</select>
<insert id="insertUser" parameterType="com.mybatis1.pojo.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into USER(uname) values(#{uname}) ;
</insert>
</mapper>
4. 配置sqlMapConfig.xml
需要加载配置文件。在sqlMapConfig.xml中加入
<mapper resource="mapper/UserMapper.xml" />
如图:
这样就算配置好了。
5. 使用Junit调试
新建目录test 并在目录里新建 com.mybatis.mapper 包
Myeclise 上Junit
1. 在UserMapper.java 右击 new一个 选择 other
2. 选择 java 下的 JUnit 下的 JUnit Test Case 确定
- 将src改为test 其他的 按图所示。finnish
4.打开UserMapperTest.java 修改测试代码。
package com.mybatis1.mapper;
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.mybatis1.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sessionFactory ;
@Before
public void setUp() throws Exception {
//创建UserMapper 对象
String resource ="SqlMapConfig.xml" ;
InputStream is = Resources.getResourceAsStream(resource) ;
sessionFactory = new SqlSessionFactoryBuilder().build(is);
}
@Test
public void testFindUserById() throws Exception{
//创建sqlsession
SqlSession sqlSession = sessionFactory.openSession() ;
//使用sqlsession.getMapper()方法创建mapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class) ;
//使用mapper接口的方法查找用户
User user = mapper.findUserById(1) ;
System.out.println(user);
//关闭sqlsession
sqlSession.close();
}
@Test
public void testInsertUser() throws Exception{
SqlSession sqlSession = sessionFactory.openSession() ;
UserMapper mapper = sqlSession.getMapper(UserMapper.class) ;
User user = new User() ;
user.setUname("MapperInsert");
mapper.insertUser(user) ;
System.out.println(user);
System.out.print(user.getId());
sqlSession.commit(); //commit 的时候 真正的将数据放到数据库 ,之前只是在缓冲区
sqlSession.close();
}
5.进行调试 在测试方法上右击 run as JUnit Test
数据库:
testFindUserById方法进行单元测试结果:
testInsertUser 的结果