不用写Dao接口的实现类了,直接使用接口,但是接口怎么使用?
- 需要编写mapper.xml文件
- 需要编写mapper接口(相当于Dao接口)
mapper.xml文件就相当于之前的UserMapper.xml,不同的是namespace要写成mapper接口的全限定名
接口
public interface UserDao {
/**
* 查全部
* @return
*/
public List<User> findAll();
/**
* 保存用户
* @param user
*/
public void save(User user);
/**
* 更新用户
* @param user
*/
public void update(User user);
/**
* 根据id删除用户
* @param id
*/
public void del(Integer id);
}
接口映射
<?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">
<!--
动态代理模式:规范必须遵守
namespace:必须是对应接口的全限类名
select|update|insert|delete: 四个标签 id必须对应dao接口的方法名
-->
<mapper namespace="com.itheima.dao.UserDao">
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(null ,"${username}",#{password},#{sex},#{address},#{birthday})
</insert>
</mapper>
由于接口与映射文件是对应的,所以:
- mapper.xml中namespace要为接口的全限定名
- 接口中方法名与映射文件中statement的id一致
- 接口中输入参数类型与映射文件中parameterType一致
- 接口中方法返回值类型与映射文件resultType一致
测试程序TestMybatisProxy.java
如何产生接口的实现类对象呢?
通过sqlSession的getMapper方法,参数传接口字节码对象(接口名.class)
自动创建mapper接口的代理对象
public class TestMybatisProxy {
SqlSessionFactory sessionFactory;
@Before
public void init(){
sessionFactory = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
}
@Test
public void testFindAll(){
SqlSession sqlSession = sessionFactory.openSession();
//获取Dao接口的动态代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void testSave(){
SqlSession sqlSession = sessionFactory.openSession();
//获取Dao接口的动态代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername("小红");
user.setAddress("通州");
user.setBirthday("1990-08-08");
user.setSex("女");
user.setPassword("xiaohong");
userDao.save(user);
//提交
sqlSession.commit();
sqlSession.close();
}
}
小总结:
与之前的差别在于,解决了传统Dao开发中的弊端,按照规范修改了配置文件,通过反射方式生成接口代理对象。