MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql。在SSM框架中,MyBatis 和Spring 整合时使用的就是这个方案。
使用接口绑定方式需要创建一个接口,接口包名需要和接口名需要与mapper.xml中<mapper>
的namespace属性相同。并且接口中的方法名要和mapper.xml标签的id属性相同。同时需要在mybatis.xml中使用<package>
进行扫描接口和mapper.xml。
mybatis.xml:
<?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>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="com.test.pojo" />
</typeAliases>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.test.mapper"/>
</mappers>
</configuration>
LogMapper.xml:
<?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="com.test.mapper.LogMapper">
<select id="selAll" resultType="log">
select * from log
</select>
<!-- 当多参数时,不需要写parameterType -->
<select id="selByAccInAccout" resultType="log" >
select * from log where accin=#{0} and accout=#{1}
</select>
</mapper>
LogMapper.java:
package com.test.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.test.pojo.Log;
public interface LogMapper {
List<Log> selAll();
List<Log> selByAccInAccout(String accin, String accout);
/**
* mybatis把参数转换为map了,其中@Param("key") 参数内容就是map的value
* @param accin123
* @param accout3454235
* @return
*/
//List<Log> selByAccInAccout(@Param("accin") String accin123,@Param("accout") String accout3454235);
}
Test.java:
package com.test.main;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 com.test.mapper.LogMapper;
import com.test.pojo.Log;
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
/*
* 接口,为什么能实例化?
*
* 需要给接口一个实例化对象.
*
* 使用的JDK的动态代理设计模式.
* 面向接口的代理设计模式(必须有接口)
*
*/
// LogMapper logMapper = session.getMapper(LogMapper.class);
// List<Log> list = logMapper.selAll();
// for (Log log : list) {
// System.out.println(log);
// }
LogMapper logMapper = session.getMapper(LogMapper.class);
List<Log> list = logMapper.selByAccInAccout("01234", "56789");
for (Log log : list) {
System.out.println(log);
}
session.close();
System.out.println("程序执行结束");
}
}
当需要向mapper.xml中映射的sql语句中传入多个参数的时候,需要使用#{0}、#{1}等分别表示第一个参数、第二个参数…或者使用#{param1}、#{param2}的形式。
如果接口中使用普通参数的形式传递参数,而mapper中的sql语句没有体现参数的顺序,则会报如下错误:
<select id="selByAccInAccout" resultType="log" >
select * from log where accin=#{accin} and accout=#{accout}
</select>
也可以在接口方法中使用注解的方式声明参数,那样mybatis会将参数转换成map传入到mapper中的SQL语句映射,例如:
<select id="selByAccInAccout" resultType="log" >
select * from log where accin=#{accin} and accout=#{accout}
</select>
/**
* mybatis把参数转换为map了,其中@Param("key") 参数内容就是map的value
* @param accin123
* @param accout3454235
* @return
*/
List<Log> selByAccInAccout(@Param("accin") String accin123,@Param("accout") String accout3454235);
在执行sql语句之前需要先通过mybatis实例化一个接口实现类的对象,再调用接口方法:
LogMapper logMapper = session.getMapper(LogMapper.class);
List<Log> list = logMapper.selByAccInAccout("01234", "56789");