上篇文章的代码是Mybatis入门代码。下面介绍Mybatis的动态代理。在后续的Mybatis的开发都是使用动态代理。
一 动态代理Q&A
Q : 为什么需要动态代理?
A : 传统的方法中,我们Dao需要一个接口,一个实现类,在我们的Test层里面需要new一个实现类的对象,使用实现类的
方法,当然了,这个方法回去调用mapper.xml对应的id标签。这个过程过程冗余,而动态代理帮我们,在Test层直接
对mapper.xml中的方法进行操作。也就是我们不需要Dao层的实现类了。
二 测试代码
2.1 工程目录:
可以看到我们的Dao层没有了实现类。
2.2 test层的myTest代码:
这里关键的就是@before的语句,后续的test代码都是单表查询的实例,有兴趣可以试试。几个点说一下:
1)第一步获取sqlseesion
2)第二步获取获取映射,这里的getMapper括号内的参数后续会用到
3)记得提交事务,特别是增删改要记得提交。
package test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import beans.Student;
import dao.IStudentDao;
import utils.myUtils;
public class myTest {
private IStudentDao sdao;
private SqlSession sqlsession;
@Before
public void before() {
sqlsession = myUtils.getsqlsession();
sdao = sqlsession.getMapper(IStudentDao.class);
}
@After
public void after() {
if(sqlsession!=null) {
sqlsession.close();
}
}
@Test
public void test1() {
Student student = new Student("张si",23,93.2);
sdao.insertStudent(student);
sqlsession.commit();
}
@Test
public void test2() {
Student student = new Student("黄update",23,93.2);
sdao.insertStudentCacheId(student);
System.out.println(student);
sqlsession.commit();
}
@Test
public void test3() {
sdao.deletStudentById(21);
sqlsession.commit();
}
@Test
public void test4() {
Student student = new Student("黄update",23,93.2);
student.setId(15);
sdao.updateStudent(student);
sqlsession.commit();
}
@Test
public void test5() {
List<Student> students = sdao.selectAllStudents();
for(Student xx : students) {
System.out.println(xx);
}
sqlsession.commit();
}
@Test
public void test6() {
Map<String, Object> students = new HashMap<String, Object>();
students = sdao.selectAllStudentMap();
System.out.println(students.get("张三"));
sqlsession.commit();
}
@Test
public void test7() {
Student student = sdao.selectStudentById(6);
System.out.println(student);
sqlsession.commit();
}
@Test
public void test8() {
String a = "张";
List<Student> student = sdao.selectAllStudentsByName(a);
for(Student xx : student) {
System.out.println(xx);
}
sqlsession.commit();
}
}
2.3 Mapper文件:
关键的就是:
<mapper namespace="dao.IStudentDao">
<?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="dao.IStudentDao">
<insert id="insertStudent" parameterType="Student">
insert into student(sname,age,score) value(#{sname},#{age},#{score})
</insert>
<!--获取id值到student的成员变量 -->
<insert id="insertStudentCacheById" parameterType="Student">
insert into student(sname,age,score) value(#{sname},#{age},#{score})
<selectKey resultType="int" keyProperty="id" order="AFTER">
select @@identity
</selectKey>
<!--根据id值进行删除 -->
</insert>
<delete id="deletStudentById" parameterType="Student">
delete from student where id=#{xxx}
</delete>
<!--根据id值进行修改-->
<update id="updateStudent" parameterType="Student">
update student set sname=#{sname},age=#{age},score=#{score} where id=#{id}
</update>
<!--选择所有student -->
<select id="selectAllStudents" resultType="Student">
select sname,age,score from student
</select>
<select id="selectStudentById" resultType="Student">
select id,sname,age,score from student where id=#{ddd}
</select>
<!--模糊查询 -->
<select id="selectAllStudentsByName" resultType="Student">
select id,sname,age,score from student where sname like '%' #{name} '%'
</select>
</mapper>
三 总结
代码很简单:
1 sqlsession.getmapper()
2 namespace="Dao全名"
完成以上两个代码就能实现,同过接口直接访问映射文件的sql操作。