传统的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 @Override 20 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>
推荐使用第三种方式。