MyBatis开发方式有两种:原生Dao开发和Mapper代理方式,接下来将分别举例介绍这两种开发方式。
原生Dao开发方式在编写的时候需要编写Dao接口及其实现类;而Mapper代理方式只需写Dao接口,由MyBatis自动生成Dao实现的代理对象
1.原生Dao开发方式
目录结构:
其中SqlMapConfig.xml为mybatis的核心配置文件,User.xml为映射文件,pojo包中的User.java为需要的javabean。
User.xml映射文件填写内容:
<mapper namespace="test">
<!--
id:为方法名标识,与Dao类中方法名一致
parameterType:为方法中传入参数类型
resultType:为方法返回参数类型,若返回为集合则类型为其泛型类
增删改查标签分别为:<insert><delete><update><select>
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.sk.pojo.User">
select * from user where id = #{id}
</select>
<insert id=""></insert>
<delete id=""></delete>
<update id=""></update>
</mapper>
UserDao接口内容:
public interface UserDao {
public User findUserById(Integer id);
}
其中方法名对应于映射文件中的id,传入参数Integer id对应映射文件中的parameterType,返回类型和resultType相对应。
UserImpl类内容:
public class UserDaoImpl implements UserDao {
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory)
{
this.factory = factory; //初始化工厂
}
@Override
public User findUserById(Integer id) {
SqlSession session = factory.openSession();
//通过SqlSession中的selectOne()方法获取一条结果集。
//参数一:映射文件的namespace.方法名。参数二:传递参数
User user = session.selectOne("test.findUserById", 1);
return user;
}
}
测试类:
public class DaoTest {
private SqlSessionFactory factory ;
@Before
public void init() throws Exception
{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById()
{
UserDao userDao = new UserDaoImpl(factory);
User user = userDao.findUserById(1);
System.out.println(user);
}
}
2.Mapper代理方式
目录结构:
UserMapper.xml映射文件:
<mapper namespace='cn.sk.dao.UserMapper'>
<select id="findUserById" parameterType='java.lang.Integer' resultType='cn.sk.pojo.User'>
select * from user where id = #{id}
</select>
</mapper>
UserMapper接口:
public interface UserMapper {
public User findUserById(Integer id);
}
注意:dao包内接口名和映射文件名称需一致,且在同一包内。
测试类:
public class DaoTest {
private SqlSessionFactory factory;
@Before
public void getFactory() throws Exception
{
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(is);
}
@Test
public void testFindById()
{
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
}
}
3.两种方式对比
目录结构:原生Dao方式需要Dao接口和一个对应的实现类,并且在实现类中调用SqlSession的方法以完成CURD,而Mapper代理方式只需要Dao接口,不需要实现类,Mapper代理方式映射文件和Dao接口需在同一包下且名称相同;
测试类:原生Dao利用创建的Dao类对象(User user = userDao.findUserById(1))完成对数据库操作,而Mapper代理方式利用生成的Mapper代理对象完成操作(User user = userMapper.findUserById(1));
映射文件:原生Dao方式的映射文件的namespace可任意取,在实现接口时作为标识,Mapper代理方式的namespace为Mapper类的全路径;
两种方式相比较Dao方式更容易理解,但是编写较复杂,Mapper代理方式编写相对简单很多。