在上一节使用原始的方式开发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类,然后在这个类里面来封装输入参数。