我们在了解 MyBatis 的映射文件和配置文件时,所举例的实例都是通过单元测试的方式实现。但在实际开发中,我们需要将 MyBatis 的实现写到 Dao 层中。所以下面我们具体了解两种 Dao 层的实现方式
1、传统开发方式
在传统 web 开发中,我们首先需要定义 Dao 接口,然后定义 DaoIImpl 类实现接口。
定义 UserDao 接口:
public interface UserDao {
// 1、 根据用户ID查询用户信息
public User findUserById(int id) throws IOException;
// 2、 根据用户ID和用户名称查询用户信息
public User findByUserIdAndName(User user) throws IOException;
}
定义 UserDao 接口的实现类 UserDaoImpl :
public class UserDaoImpl implements UserDao {
// 依赖注入,将工程在外面创建
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring)
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws IOException {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用SqlSession的增删改查方法
User user = sqlSession.selectOne("userMapper.findByUserId", id);
System.out.println(user);
// 关闭资源
sqlSession.close();
return user;
}
@Override
public User findByUserIdAndName(User user) throws IOException {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用SqlSession的增删改查方法
User user= sqlSession.selectOne("userMapper.findByIdAndName", user);
System.out.println(user);
// 关闭资源
sqlSession.close();
return list;
}
}
模拟业务层调用:
public static void main(String [] args) throws Exception {
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
UserDao dao = new UserDaoImpl(sqlSessionFactory);
User user = dao.findUserById(1);
System.out.println(user);
}
这种方式其实大家都会,在学习 javaweb 的时候我们就是使用这种方式实现 Dao 层,只是连接数据库的方式改变了。
2、代理开发方式
分析第一种方式的代码会发现有大量的重复的模板代码。为了简化开发,Mybatis 提供了一种代理开发的方式,这种方式是项目开发中 Mybatis 实现 Dao 层的主流。
代理开发方式只需要程序员编写Mapper 接口(相当于Dao 接口),然后由 Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。 代理开发方式使用的是动态代理的 JDK 代码实现的。
Mapper 接口需要遵循以下规范:
-
映射文件中的
mapper
标签的namespace
属性与 mapper 接口的全限定名相同
-
映射文件中的每条映射语句中
id
的属性值与 mapper 接口中方法名相同
-
映射文件中的每条映射语句的
parameterType
属性与 mapper 接口中方法的形参相同
-
映射文件中的每条映射语句的
resultType
属性与 mapper 接口中方法的返回值类型相同
如果 Mapper 接口已经遵循上述规范,那么不需要创建 Dao 层的实现类了,可以直接进行使用:
public static void main(String [] args) throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = dao.findByUserId(1);
System.out.println(user);
}
版权声明:本文为qq_45040919原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。