MyBatis开发方式

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代理方式编写相对简单很多。


猜你喜欢

转载自blog.csdn.net/qq_38550836/article/details/79418198