MyBatis接口绑定方案

本文介绍了MyBatis接口绑定的概念,即创建接口并让MyBatis自动生成其实现类,使得可以通过接口调用mapper.xml中的SQL。在SSM框架中,这种结合方式常见。接口的包名和接口名需与mapper.xml的namespace匹配,方法名对应id。当传入多个参数时,可以使用#{0}、#{1}或#{param1}、#{param2}形式。如果参数顺序不对应,会导致错误。此外,接口方法可用注解声明参数,mybatis会将其转为map传入SQL。执行SQL前,需通过mybatis实例化接口对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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&amp;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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值