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&characterEncoding=utf8&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&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