一、Mybatis 的 Dao 层两种开发方式
1、原始Dao开发模式( 自己手动实现Dao层接口和实现类 )
》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,通过SqlSessionFactory获取SqlSession来获取数据库操作对象。》
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.代码冗余,重复代码很多。
2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。
3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");
2、mapper代理方法( 自己只需要写mapper接口( Dao接口 ) ):与Spring整合后就更简单,这种方式也就不需要了,在这做大概了解。
根据接口编写规范:Mybatis可以自动生成Mapper接口实现类的代理对象
1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件
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自动生成代理实现类需要遵循的规范
->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )
->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);
}
}
来源:oschina
链接:https://my.oschina.net/u/2453485/blog/651918