前言
本章学习有关MyBatis接口绑定的相关知识
方法
1.概念
通过前面的学习,我们基本上掌握了XXXMapper.xml的编写方法。但是我们仍然遗留了一些问题:
1)无法像传统的DAO那样使用接口定义方法实现
2)多值传递查询等情况时,必须使用Map或者对象的方式进行参数传递
所以,MyBatis接口绑定便应运而生了!
2.配置接口绑定
既然是接口绑定,那么我们就需要进行接口的创建,接口的创建需要满足以下条件:
- 按照官方文档的说法,最好将包名和类名起名成如xx.xx.mapper.XXXMapper的形式,用于代替之前书写的DAO包和类
- 接口的包名类名必须要和XXXMapper.xml中的<mapper>标签的namespace相同
- 接口中的方法名和mapper子标签(select,insert,update,delete)的id属性值相同
- mybatis全局配置文件中配置包扫描接口以及XXXMapper.xml
3.编写测试类进行测试
package cn.edu.ccut.test;
import cn.edu.ccut.mapper.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
public class StudentTest {
@Test
public void testLoginUser(){
SqlSession session = null;
try {
//获取sqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象
session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
boolean flag = mapper.doLogin("admin", "admin");
if(flag){
System.out.println("Login Success!");
}else{
System.out.println("Login Fail!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
session.close();
}
}
}
到这里简单的登录功能就完成了哦!
大家可以思考一下以前的实现方式和现在有什么不同!
之前我们使用Map或者对象实现了多参数的传递,十分的不友好。
之前我们没有像以前调用dao那样使用接口,有了接口之后,操作更加便利!
附录
一、扩展内容
1.使用param注解的方式自定义参数名称
之前,我们在mapper.xml中书写的sql中传递参数使用#{arg0}或者#{param1}的方式,如果我们使用自定义参数名该如何实现呢?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper配置文件的根路径,namespace代表实现类的全路径(包名+类名) -->
<mapper namespace="cn.edu.ccut.mapper.StudentMapper">
<!-- 该处每一个标签代表一个方法(select、insert、delete、update等),
id为方法名,
parameterType为参数类型,
resultType为返回值类型
-->
<select id="doLogin" resultType="boolean">
select * from users where username=#{username} and password=#{password}
</select>
</mapper>
如果直接执行测试类的话,会报如下错误:
我们需要在接口中使用@Param注解进行解决:
语法:@Param("参数名称") 方法形参
实例:使用自定义参数
package cn.edu.ccut.mapper;
import org.apache.ibatis.annotations.Param;
public interface StudentMapper {
public boolean doLogin(@Param("username") String username,@Param("password") String password) throws Exception;
}
2.使用注解的方式替代XXXMapper.xml
这是一个很大的改动,也是一个方便的实现方式!
删除之前的StudentMapper.xml
加入如下注解:
@Select、@Insert、@Update、@Delete
package cn.edu.ccut.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface StudentMapper {
@Select("select * from users where username=#{username} and password=#{password}")
public boolean doLogin(@Param("username") String username,@Param("password") String password) throws Exception;
}
该代码可同样实现之前的操作!!!
一个dao的实现竟然可以做到两行代码实现登录的后台功能编写,是不是很赞!