Mybatis学习第二天——mapper的动态代理

传统的Dao层开发通过接口与实现类的方式,Mybatis中通过mapper动态代理是需要定义接口。

1.传统Dao层封装

技术分享图片

那么可以将公共资源提取出来,剩余的封装成方法来实现。下面是UserDaoImpl.java中对查询的简单封装

 1 package com.mybatis.dao.impl; 2  3 import org.apache.ibatis.session.SqlSession; 4 import org.apache.ibatis.session.SqlSessionFactory; 5  6 import com.mybatis.dao.UserDao; 7 import com.mybatis.pojo.User; 8  9 public class UserDaoImpl implements UserDao {10 11 //没有导入Spring,采用传参的方式获取12  SqlSessionFactory sqlSessionFactory ;13 14 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {15 super();16 this.sqlSessionFactory = sqlSessionFactory;17  }18 19  @Override20 public User findUserById(Integer id) {21 SqlSession sqlSession = sqlSessionFactory.openSession();22 User user = sqlSession.selectOne("test.findUserById",id);23 24  sqlSession.close();25 return user;26  }27 28 }

在测试中通过加载公共资源,确定调用的mapper文件(此时表示User.xml)

 1 @Test 2 public void testName() throws Exception { 3 /** 4  * 1. 创建SqlSessionFactoryBuilder对象 5  2. 加载SqlMapConfig.xml配置文件 6  3. 创建SqlSessionFactory对象 7  4. 创建SqlSession对象 8  5. 执行SqlSession对象执行查询,获取结果User 9  6. 打印结果10  7. 释放资源11 */12 String resource = "SqlMapConfig.xml";13 InputStream in = Resources.getResourceAsStream(resource);14 15 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);16 17 UserDao userdao = new UserDaoImpl(sqlSessionFactory);18 19 User user = userdao.findUserById(1);20 21 System.out.println(user.getUsername());

2.mapper动态代理模式

UserMapper um = sqlSession.getMapper(UserMapper.class);获取代理,传入的值为创建的动态代理接口

技术分享图片(个人理解,有误希望指正)

在UserMapper接口中,创建的方法需要满足以下四个原则Mybatis才能进行动态代理操作:

1 public interface UserMapper {2 //四大原则3 //1.接口中的方法名与User.xml中对应的id名一致4 //2.方法中的返回类型与User.xml中的一致5 //3.传入的参数类型一致6 //4.命名空间绑定此接口7 public User findUserById(Integer id);8 }

前三个好理解,方法的名字,返回类型,参数类型与User.xml文件中的属性一致。命名空间绑定此接口,只需要在namesapce上用接口的全路径。如下:

技术分享图片

注意:User.xml一定要在核心配置SqlMapConfig.xml中加载

3.mapper映射器

1 <mappers>2 <!-- 第一种方式只需指定mapper文件路径即可 -->3 <mapper resource="sqlmap/User.xml"/>4 <mapper resource="sqlmap/UserMapper.xml"/>5 <!-- 第二种方式,需对应接口的路径,同时mapper文件名需与接口名一致,文件位置必须在同一目录下 -->6 <mapper class="com.mybatis.mapper.UserMapper"/>7 <!-- 第三种方法,指定接口文件的包名,同时mapper文件名需与接口名一致,文件位置必须在同一目录下 -->8 <package name="com.mybatis.mapper"/>9 </mappers>

推荐使用第三种方式。

 

相关文章