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