在上一节使用原始的方式开发dao的时候存在着一些问题。
1.存在大量的重复代码。
2.调用sqlsession的方式时传入的statement的id硬编码了。
3.调用sqlsession的方法传入的变量由于sqlsession使用泛型即使传入错误在编译阶段也不报错,不利于开发。
mapper代理开发dao。
只需编写mapper接口和mapper.xml映射文件。
程序员只需编写mapper接口需要遵循的规范,mapper可以自动生成mapper接口实现类代理对象。
开发规范:
1.在mapper.xml中namespace等于mapper接口的地址。
2.mapper接口的方法名和mapper.xml中statement的id一致。
3.mapper接口中的方法的输入参数类型和mapper.xml中parameterType指定的类型一致。
4.mapper接口中的方法的返回值类型和mapper.xml中的resultType的类型一致。
依照此规范来开发一个我们自己的mapper。
在resource文件夹下面新建一个mapper文件夹并在其下面新建一个userMapper.xml文件。
创建一个mapper接口。
将原先sqlmap文件夹下面的userMapper中的内容复制过来,将namespace改成mapper接口的路径。
然后在SqlMapConfig.xml中引入这个文件
在mapper接口中新建一个根据id查询的方法。
public interface UserMapper {
/**
* @author:kevin
* @Description: 根据id查询用户
* @Date:21:18 2018/3/28
*/
User selectUser(int id) throws Exception;
}
<select id="selectUser" parameterType="int" resultType="com.beyond.mybatis.po.User">
select * from user WHERE id = #{value}
</select>
通过上面的方法可以看到。方法名和sql的id都是selectUser,方法的输入参数和sql输入参数都是int类型,方法的返回值和sql的返回值类型都是User。
下面来测试一下这个借口。
public class UserMapperTest {
private SqlSessionFactory factory;
@Before
public void loadFactory() throws Exception{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testfindUserById() throws Exception{
SqlSession sqlSession = factory.openSession();
//通过反射拿到UserMapper的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectUser(1);
System.out.println(user);
}
}
依照此方法可以编写剩下的方法。
public interface UserMapper {
/**
* @author:kevin
* @Description: 根据id查询用户
* @Date:21:18 2018/3/28
*/
User selectUser(int id) throws Exception;
/**
* @author:kevin
* @Description: 根据用户名模糊查询查询用户
* @Date:21:18 2018/3/28
*/
List<User> selectUserByName(String name) throws Exception;
/**
* @author:kevin
* @Description: 插入用户
* @Date:21:18 2018/3/28
*/
void insertUser(User user) throws Exception;
/**
* @author:kevin
* @Description: 删除用户
* @Date:21:18 2018/3/28
*/
void deleteUserById(int id) throws Exception;
/**
* @author:kevin
* @Description: 更新用户
* @Date:21:18 2018/3/28
*/
void updateUser(User user) throws Exception;
}
测试方法这里不再演示,可以仿照查询的那个测试。
当输入参数有多个的话,可以将其包装成一个pojo类,然后在这个类里面来封装输入参数。