使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。
原始Dao开发方法需要程序员编写Dao接口和Dao实现类,此方式开发Dao,存在以下问题:
- Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
- 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不便于开发维护。
所以建议使用mapper动态代理方式来开发dao。
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象。
Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径相同。
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
具体demo请查看如下:
就根据 caseCountByQueryCaseVo这个接口来看,然后一一对照上面的四个规则要求,就会发现能够一一对上,假如你发现对不上,那你就牛鼻了,记得找我,让我也牛鼻一下,哈哈。
上面写完后,接下来就写一个测试方法去测试看看能不能成功运行啦。(至于pojo对象我这里就不写了,你自己根据上面规则写就好了)
public class TestMybatis {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
// 创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlsessionFactory
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testMybatisMapper() {
// 获取sqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
TestCase testCase = sqlSession.getMapper(TestCase.class);
// 执行查询方法
int count = testCase.caseCountByQueryCaseVo(queryCaseVo);//queryCaseVo为入参查询条件
System.out.println(count);
sqlSession.close();
}
特别注意:
1.记得sql的函数(比如此处的count(1))不能作为查询结果返回,必须要加个别名存储结果,否则执行会报错的。
2.测试前记得配置好相关配置文件哦,如下,记得把TestCase.java和TestCasexml文件放在一个目录下,如上图所示
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 设置别名 -->
<typeAliases>
<!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->
<package name="com.pojo" />
</typeAliases>
</configuration>