MyBatis传统开发方式
先提前说一点,现阶段dao层也可以叫做mapper层。
传统开发方式就是MVC中dao层的经典写法,只是把sql逻辑写在xxxMapper.xml配置文件中而已:
[接口]com.samarua.mapper.userMapper
-------------------------------------------------------------------------------------------
public interface UserMapper {
public List<User> findAll();
public User findById(int id);
}
[实现类]com.samarua.mapper.impl.userMapperImpl
-------------------------------------------------------------------------------------------
public class UserMapperImpl implements UserMapper {
public List<User> findAll() {
// 1.获取sqlSession对象
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 2.直接使用sqlSession对象调用各种sql逻辑
List<User> userList = sqlSession.selectList("userMapper.findAll");
return userList;
}
public User findById(int id) {
//...
}
}
[模拟service层]com.samarua.service.serviceTest
-------------------------------------------------------------------------------------------
public class ServiceDemo {
public static void main(String[] args) throws IOException {
UserMapper userMapper = new UserMapperImpl();
List<User> userList = userMapper.findAll();
System.out.println(userList);
User user = userMapper.findById(3);
System.out.println(user);
}
}
MyBatis代理开发方式
我们发现,传统开发方式需要手动实现接口。实现接口的目的是补充上逻辑代码,但是MyBatis中逻辑代码(即sql语句)是解耦到配置文件中的——我们先实现接口,又在接口实现类中调用配置文件中的逻辑,实在没有必要。
在代理开发模式中,无需实现接口,只需要将接口中的方法与配置文件中的方法做好对应;在使用时,会自动生成该接口的代理实现对象(实际上是接口与配置文件结合的产物),我们直接使用这个对象就可以一步到位完成各种逻辑了。
MyBatis传统开发和代理开发的不同,体现在代码上就是对sqlSession对象的使用——传统开发直接使用该对象调用各种sql逻辑;代理开发使用该对象获取代理对象,再由代理对象调用各种sql逻辑。
xxxMapper接口与xxxMapper.xml的对应规范:
1) Mapper接口完整类名和Mapper.xml中的namespace相同
2)Mapper接口每个方法名和Mapper.xml中每个sql的id相同
3)Mapper接口每个方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4)Mapper接口每个方法的返回参数类型和mapper.xml中定义的每个sql的resultType的类型相同
[接口]com.samarua.mapper.UserMapper
-------------------------------------------------------------------------------------------
public interface UserMapper {
public List<User> findAll();
public User findById(int id);
}
[配置文件]resources.com.samarua.mapper.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.samarua.mapper.UserMapper">
<select id="findAll" resultType="com.samarua.domain.User">
select * from user
</select>
<select id="findById" parameterType="int" resultType="com.samarua.domain.User">
select * from user where id = #{id}
</select>
</mapper>
[模拟service层]com.samarua.service.serviceTest
-------------------------------------------------------------------------------------------
public class ServiceDemo {
public static void main(String[] args) throws IOException {
// 1.获取sqlSession对象
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 2.通过sqlSession对象获得mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.使用mapper代理对象调用各种sql逻辑
List<User> userList = mapper.findAll();
System.out.println(userList);
User user = mapper.findById(1);
System.out.println(user);
}
}