Mybatis的代理接口

Mybatis的代理接口

基本Mybatis每个模块(表)都有用到增删改查,但是如果他们的标识都要不一样这个是很难做到的,针对这个问题我们该怎么办呢?

诚然,Mybtais除了可以直接调用xxMapper.xml中的映射文件之外,还可以通过间接的方式实现调用,这种间接的方式就是接口绑定

一、接口绑定在非web项目中的使用

导读

1.为什么mybatis要实现接口绑定:

  • 1)区分不同的模块
  • 2)为了在web项目中能够实现注入

2.切记将新的映射文件加入到mybatis的映射文件中

<mapper resource="pro/yf/bj/interfacebinds/StudentMapperByInterfaceBinds.xml"/>

3.接口绑定与直接调用映射文件的对比:

  • 1)调用方法明确:因为我们调用的是接口中的某个具体方法,而不再是通过一个字符串来指定执行映射文件中的某个SQL语句了
  • 2)注入方便:最主要的一点,就是将来Mybatis遇到了Spring,更能发挥出接口式编程的强大潜力,说白了就是可以很方便的实现注入
  • 3)传参方便:这样调用相比较之前更好的规范了我们参数的传递,大大的降低了我们因为参数类型导致的调用失败。

示例:

pom.xml:添加依赖jar包

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.4</version>
</dependency>

mybatis-config.xml:mybatis的配置文件

<?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">
  <!--
	  默认的环境ID(比如:default:"development")development : 开发模式    work : 工作模式
	 每个 environment 元素定义的环境 ID(比如:id=”development”)。
	 事务管理器的配置:type= ”JDBC”  :这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
	                  "MANAGED" :这个配置从来都不提交和回滚一个连接,不建议使用
	 数据源的配置:type=    UNPOOLED
	                  POOLED 
	                  JNDI 
	                 备注:详细见readMe中
	 默认的环境和环境 ID 是一目了然的。随你怎么命名,只要保证默认环境要匹配其中一个环境ID。
    -->
<configuration>
      <environments default="development">
          <!-- JDBC环境配置 -->
          <environment id="development">
          <transactionManager type="JDBC"></transactionManager>
              <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.jdbc.Driver" />
                  <property name="url" value="jdbc:mysql://localhost:3306/testmybatis?useUnicode=true&amp;characterEncoding=utf8&amp;allowMultiQueries=true" />
                  <property name="username" value="root" />
                  <property name="password" value="root" />
              </dataSource>
        </environment>

          <!-- 测试JDBC环境配置 -->
        <environment id="ceShi">
            <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.jdbc.Driver" />
                      <property name="url" value="jdbc:mysql://localhost:3306/test0909?useUnicode=true&amp;characterEncoding=utf8" />
                      <property name="username" value="root" />
                      <property name="password" value="root" />
                </dataSource>
        </environment>
    </environments>
  
	<!--   加载映射文件资源 -->
    <mappers>
        <mapper  resource="pro/yf/bj/interfacebinds/StudentMapperByInterfaceBinds.xml"/>
    </mappers>
</configuration>

student.java和classes.java类

student.java
    public String s_id;
    public String s_name;
    public Classes classes;//在多的这边有一的对象
    
classes.java
    public String  c_id;
    public String  c_name;
    public List<Student>  studentList;//在一这边有多的集合

test.java:测试类:测试在非web项目中mybatis的接口绑定的使用

import java.io.IOException;
import java.io.Reader;
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 pro.yf.bj.entity.Classes;
import pro.yf.bj.entity.Student;
import pro.yf.bj.entity.User;
public class Test {
	public static void main(String[] args) throws IOException {
		 String config="mybatis-config.xml";
		 Reader reader = Resources.getResourceAsReader(config);
		 SqlSessionFactory  sessionFactory=new  SqlSessionFactoryBuilder().build(reader);
		 SqlSession session = sessionFactory.openSession();
		 IStudentMapper studentMapper = session.getMapper(IStudentMapper.class);
		 System.out.println("studentMapper---------->"+studentMapper);
		 //1.查询全部
		 /*List<Student> list = studentMapper.findStudentAll();
		 System.out.println("当前表中有:"+list.size()+"条数据");
		 for (Student student : list)
		 {
			 System.out.println(student);
		 }*/
		 //添加学生
		 /*Student stu = new Student();
		 stu.setS_id("s003");
		 stu.setS_name("王大锤");
		 Classes cla = new Classes();
		 cla.setC_id("c003");
		 stu.setClasses(cla);
		 studentMapper.addStudent(stu);*/
		 //修改
		//1.接收页面传递过来的s_id,s_name,c_id
		/*Student stu = new Student();
		stu.setS_id("s002");
		stu.setS_name("123");
		Classes cla = new Classes();
		cla.setC_id("c002");
		stu.setClasses(cla);
		studentMapper.updateStudentMany(stu);*/
		//删除
		String s_id="s001";
		studentMapper.deleteStudentById(s_id);
		session.commit();
		session.close();
	}
}

IStudentMapper.java:Student模块的进行增删改查的持久层的接口

import java.util.List;
import pro.yf.bj.entity.Student;
public interface IStudentMapper {
	public List<Student>  findStudentAll();
	public void addStudent(Student stu);
	public void updateStudentMany(Student stu);
	public void deleteStudentById(String s_id);
}

StudentMapperByInterfaceBinds.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="pro.yf.bj.interfacebinds.IStudentMapper">
	<resultMap type="pro.yf.bj.entity.Student" id="studentList">
		<result    property="s_id"    column="s_id" />
		<result    property="s_name"    column="s_name" />
	  	<association property="classes" javaType="pro.yf.bj.entity.Classes">  
	         <result    property="c_id"     column="c_id" />
	         <result   property="c_name"   column="c_name"/> 
	    </association>
	</resultMap>
	<!-- 查询 -->
	<select id="findStudentAll"  resultMap="studentList">
		select * from student s ,classes cs where s.c_id=cs.c_id
	</select>
	<!-- 添加 -->
	<insert id="addStudent"  parameterType="pro.yf.bj.entity.Student">
		insert into student(s_id,s_name,c_id)  values(#{s_id} ,#{s_name},#{classes.c_id})
	</insert>
	<!-- 修改 -->
	<update id="updateStudentMany"  parameterType="pro.yf.bj.entity.Student">
		update student  
			<set>
				s_name=#{s_name},
				c_id=#{classes.c_id}
			</set>
			where s_id=#{s_id}
	</update>
	<!-- 删除 -->
	<delete id="deleteStudentById"   parameterType="java.lang.String"  >
		delete  from student where s_id=#{s_id}
	</delete>
</mapper> 

二、接口绑定之在非web项目中通过注解使用

导读模块:

Mybatis提供了几个进行增删改查的注解,其目的是将xxMapper.xml文件给省略掉,但是在开发中可不是绝对的,因为在xxMapper.xml中我们可以很方便的使用动态sql语句,所以两者经常混着使用

使用步骤:

  • 1)pom.xml:添加依赖jar包

  • 2)创建一个映射接口即是:IUserMapper.java,且在里面定义CRUD的方法,且在方法上添加上mybatis支持CRUD的注解

    import java.util.List;
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    //@desc Mybatis的注解代替UserMapper.xml这个映射文件
    public interface IUserMapper {
    	@Select("select * from user")
    	public List<User> getAllUser();
    	@Update("update user set name=#{name} where id=#{id}")
    	public void UpdateUser(User user);
    	@Insert("insert into user(id,name) values(#{id},#{name});")
    	public void InsertUser(User user);
    	@Delete("delete from user where id=#{id}")
    	public void DeleteUser(String id);
    }
    
  • 3)在mybatis的配置文件即是mybatis-config.xml中添加上映射接口的声明:

    <mapper class="pro.yf.bj.IUserMapper"/>
    
  • 4)创建一个User.java这样一个实体类

    public String id;
    public String name;
    
  • 5)创建一个测试类进行测试:Test.java

    import java.io.IOException;
    import java.io.Reader;
    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;
    public class Test {
    	public static void main(String[] args) throws IOException {
    		String config = "mybatis-config.xml";
    		Reader reader = Resources.getResourceAsReader(config);
    		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    		SqlSession session = sessionFactory.openSession();
    		IUserMapper userMapper = session.getMapper(IUserMapper.class);// 实现接口绑定
    		/*查询全部*/
    		List<User> list =userMapper.getAllUser();
    		//调用查询全部的方法,通过注解的使用执行sql语句进而获取到数据 
    		for(User user : list) { 
    		  	System.out.println(user.getId()+"\t"+user.getName());
    		}
    		/* 添加*/
    		User user = new User();
    		user.setId("13");
    		user.setName("风陵师太");
    		userMapper.InsertUser(user);
    		/*修改*/
    		User user_update=new User();
    		user_update.setId("13");
    		user_update.setName("灭绝师太的师傅");
    		userMapper.UpdateUser(user_update);
    		/*删除*/
    		String id="13";
    		userMapper.DeleteUser(id);
    		session.commit();
    		session.close();
    	}
    }
    

扩展导读:那么Mybtais的注解有那些呢:

常见的有:@Select @Update @Insert @Delete

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值