MyBatis初探二

1、Mybatis 的 Dao 层两种开发方式



一、原始Dao开发模式( 本身手动实现Dao层接口和实现类 )

》    实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,经过SqlSessionFactory获取SqlSession来获取数据库操做对象。java

package com.ts.dao;

import com.ts.domain.Users;

public interface UsersDao {
	
	//根据ID查询用户信息
	Users findUserById(int id) throws Exception;
	
}
package com.ts.dao.impl;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.ts.dao.UsersDao;
import com.ts.domain.Users;

public class UsersDaoImpl implements UsersDao {

	private SqlSessionFactory sqlSessionFactory;

	//构造函数注入SqlSessionFactory
	public UsersDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory =sqlSessionFactory;
	}


	/**
	 * 1和3是模板代码
	 * 1.SqlSession sqlSession = getSqlSession();
	 * 2.业务逻辑
	 * 3.sqlSession.close();
	 */

	@Override
	public Users findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		Users user  = sqlSession.selectOne("Users.findUserById", id);
		sqlSession.close();
		return user;
	}

    缺点: 1.代码冗余,重复代码不少。sql

                2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。数据库

                3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");apache

二、mapper代理方法( 本身只须要写mapper接口( Dao接口 ) ):与Spring整合后就更简单,这种方式也就不须要了,在这作大概了解。

       根据接口编写规范:Mybatis能够自动生成Mapper接口实现类的代理对象session

        1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件app

package com.ts.dao;
public interface UserMapper {
	public Users findUserById(int id) throws Exception;
}
<mapper namespace="com.ts.dao.UserMapper">
	<select id="findUserById" parameterType="int" resultType="com.ts.domain.Users">
		select * from Users where id = #{id}
	</select>
</mapper>

      2.Mybatis自动生成代理实现类须要遵循的规范
dom

            ->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )ide

            ->Mapper.java接口中的方法名和mapper.xml中每一个SQL的ID一致函数

            ->Mapper.java接口中的输入参数类型和mapper.xml中每一个SQL的输入参数指定的类型一致测试

            ->Mapper.java接口中的返回值参数类型和mapper.xml中每一个SQL的返回值指定的类型一致

    3.测试( 不要忘记把mapper.xml添加到SqlMapConfig.xml中

package com.ts.dao.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.ts.dao.UserMapper;
import com.ts.domain.Users;

public class UserMapperTest {

	private static SqlSessionFactory sqlSessionFactory;

	@Before
	public void before() throws IOException{
		//经过输入流读取全局配置信息建立工厂
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

	}

	@Test
	public void test() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//生成代理实现类
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		Users user = userMapper.findUserById(1);
		//==>Users [id=1, name=田硕, sex=男, birth=Sat Apr 02 00:00:00 CST 2016, address=河南商丘]
		System.out.println(user);
	}

}
相关文章
相关标签/搜索