文章目录

  • 第一章 mybatis简单示例
    • 工作原理解析
  • 第二章 mybatis项目配置
    • 第一节 environments
    • 第二节 transactionManager
    • 第三节 dataSource
    • 第四节 properties
    • 第五节 typeAliases(类型别名)
    • 第六节 mappers
    • 第七节 Log4j日志
  • 第三章 使用 XML 配置 SQL 映射器
    • 第一节:INSERT 映射语句
    • 第二节:UPDATE 映射语句
    • 第三节:DELETE 映射语句
    • 第四节:SELECT 映射语句
  • 第四章 MyBatis 关系映射
    • 第一节:一对一关系实现
    • 第二节:一对多关系实现
  • 第五章 动态 SQL
    • 第一节:if 条件
    • 第二节:choose,when 和 otherwise 条件
    • 第三节:where 条件
    • 第四节:trim 条件(一般不会用到)
    • 第五节:foreach 循环
    • 第六节:set 条件
  • 第六章 Mybatis杂项
    • 第一节:处理 CLOB、BLOB 类型数据
    • 第二节:传入多个输入参数
    • 第三节:Mybatis 分页
  • 第四节:Mybatis 缓存
  • 第七章 使用注解配置 SQL 映射器
    • 第一节:基本映射语句
    • 第三节:关系映射
    • 第四节:动态 SQL

第一章 mybatis简单示例

需要添加一个mybatis的jar包和jdbc的jar包,首先创建一个java项目
mybatis原理:

工作原理解析

mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)来构建SqlSessionFactory(SqlSessionFactory是线程安全的);

然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

public class SqlSessionFactoryUtil {private static SqlSessionFactory sqlSessionFactory;public static SqlSessionFactory getSqlSessionFactory(){if(sqlSessionFactory==null){InputStream inputStream=null;try{inputStream=Resources.getResourceAsStream("mybatis-config.xml");sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);}catch(Exception e){e.printStackTrace();}}return sqlSessionFactory;}public static SqlSession openSession(){return getSqlSessionFactory().openSession();}
}

详细流程如下:

1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。

e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

mybatis层次图:

示例:
mybatis-config.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><properties resource="jdbc.properties"/><typeAliases><typeAlias alias="Student" type="com.gdut.model.Student"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><mappers><mapper resource="com/gdut/mappers/StudentMapper.xml" /></mappers>
</configuration>

jdbc.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=123456

StudentMapper:

package com.gdut.mappers;import com.gdut.model.Student;public interface StudentMapper {public int add(Student student);
}

StudentMapper.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.gdut.mappers.StudentMapper"><insert id="add" parameterType="Student"  >insert into t_student values(null,#{name},#{age})</insert></mapper>

StudentService.java:

package com.gdut.service;import org.apache.ibatis.session.SqlSession;import com.gdut.mappers.StudentMapper;
import com.gdut.model.Student;
import com.gdut.util.SqlSessionFactoryUtil;public class StudentService {public static void main(String[] args) {SqlSession sqlSession=SqlSessionFactoryUtil.openSession();StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);Student student=new Student("李四",11);int result=studentMapper.add(student);sqlSession.commit();if(result>0){System.out.println("添加成功!");}}
}

第二章 mybatis项目配置

下面的配置是mybatis-config.xml文件中配置

第一节 environments

MyBatis 支持多个环境,可以任意配置,一般有开发环境、测试环境、正式环境

第二节 transactionManager

MyBatis 支持两种类型的事务管理器:JDBC 和 MANAGED(托管);
JDBC:应用程序负责管理数据库连接的生命周期;
MANAGED:由应用服务器负责管理数据库连接的生命周期;(一般商业服务器才有此功能,如 JBOSS,WebLogic)(tomcat是没有这个功能的)

第三节 dataSource

用来配置数据源;类型有:UNPOOLED,POOLED,JNDI; UNPOOLED,没有连接池,每次数据库操作,MyBatis 都会创建一个新的连接,用完后,关闭;适合小并发 项目;
POOLED,用上了连接池;
JNDI,使用应用服务器配置 JNDI 数据源获取数据库连接

第四节 properties

配置属性,可以外部配置,也可以内部配置(使用标签)

第五节 typeAliases(类型别名)

给类的完成限定名取别名,方便使用

 <typeAliases><!-- <typeAlias alias="Student" type="com.gdut.model.Student"/> -->//上面这种是适合小项目开发<package name="com.gdut.model"/>//扫描整个包,自动取类名</typeAliases>

第六节 mappers

引入映射文件

<!--      <mapper resource="com/gdut/mappers/StudentMapper.xml" /> -->
<!--             <mapper class="com.gdut.mappers.StudentMapper" /> --><package name="com.gdut.mappers"/>

第七节 Log4j日志

前面是主配置文件,这里是配置日志文件

StudentService.java中代替system.out.print

 private static Logger logger=Logger.getLogger(StudentService.class);public static void main(String[] args) {SqlSession sqlSession=SqlSessionFactoryUtil.openSession();StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);Student student=new Student("李四",11);int result=studentMapper.add(student);sqlSession.commit();if(result>0){//System.out.println("添加成功!");logger.info("添加成功");}}

log4j.properties:

log4j.rootLogger=info,appender1,appender2log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender2=org.apache.log4j.FileAppender
log4j.appender.appender2.File=C:/eclipse/logFile.txtlog4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout

第三章 使用 XML 配置 SQL 映射器

mapper类是写映射接口,mapper是dao层sql语句

第一节:INSERT 映射语句

第二节:UPDATE 映射语句

第三节:DELETE 映射语句

第四节:SELECT 映射语句

查询操作不需要提交事务,如果select结果是过个对象,则需要自己用resultMap标签搞集合

示例:
StudentMapper.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.gdut.mappers.StudentMapper"><insert id="add" parameterType="Student"  >insert into t_student values(null,#{name},#{age})</insert><update id="update" parameterType="Student">update t_student set name=#{name},age=#{age} where id=#{id}</update><delete id="delete" parameterType="Integer">delete from t_student where id=#{id}</delete><select id="findById" parameterType="Integer" resultType="Student">select * from t_student where id=#{id}</select><resultMap type="Student" id="StudentResult"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap><select id="find" resultMap="StudentResult">select * from t_student</select>
</mapper>

StudentMapper.java

package com.gdut.mappers;import java.util.List;import com.gdut.model.Student;public interface StudentMapper {public int add(Student student);public int update(Student student);public int delete(Integer id);public Student findById(Integer id);public List<Student> find();}

StudentTest.java:

package com.gdut.service;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import com.gdut.mappers.StudentMapper;
import com.gdut.model.Student;
import com.gdut.util.SqlSessionFactoryUtil;public class StudentTest {private static Logger logger=Logger.getLogger(StudentService.class);private SqlSession sqlSession;private StudentMapper studentMapper;@Beforepublic void setUp() throws Exception {sqlSession=SqlSessionFactoryUtil.openSession();studentMapper=sqlSession.getMapper(StudentMapper.class);}@Afterpublic void tearDown() throws Exception {sqlSession.close();}@Testpublic void add() {logger.info("添加学生");Student student=new Student("小吴",20);studentMapper.add(student);sqlSession.commit();}@Testpublic void update() {logger.info("修改学生");Student student=new Student(9,"吴杰",99);studentMapper.update(student);sqlSession.commit();}@Testpublic void delete() {logger.info("删除学生");studentMapper.delete(8);sqlSession.commit();}@Testpublic void findById() {logger.info("根据id查询学生");Student student=studentMapper.findById(1);sqlSession.commit();System.out.println(student);}@Testpublic void find() {logger.info("查询所有学生");List<Student> studentList=studentMapper.find();for(Student s:studentList) {System.out.println(s);}}
}

第四章 MyBatis 关系映射

第一节:一对一关系实现

根据外键查找外键所在表的记录(结果只能是一条记录)
首先在数据库中建立好外键和外键关联的表,在这个案例中将address属性添加到学生表中作为外键
StudentMapper.java:

package com.gdut.mappers;import java.util.List;import com.gdut.model.Student;public interface StudentMapper {    public Student findStudentWithAddress(Integer id);
}

StudentMapper.xml:

 //这里的StudentResult就是构造出sql语句返回值的正确类型<resultMap type="Student" id="StudentResult"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><!--         下面这个id是 address的id     --><association property="address" column="addressid" select="com.gdut.mappers.AddressMapper.findById"></association></resultMap><select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=#{id}</select>

AddressMapper.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.gdut.mappers.AddressMapper"><select id="findById" parameterType="Integer" resultType="Address">select * from t_address where id=#{id}</select>
</mapper>

StudentTest.java:

 @Testpublic void testFindStudentWithAddress() {logger.info("查询学生(带地址)");Student student=studentMapper.findStudentWithAddress(2);System.out.println(student);}

第二节:一对多关系实现

根据主键查找自己被应用的记录(结果是多条记录)

GradeTest.java

 @Testpublic void findById() {logger.info("根据id查询年级(带学生)");Grade grade=gradeMapper.findById(1);System.out.println(grade);}

GradeMapper.java

package com.gdut.mappers;import com.gdut.model.Grade;public interface GradeMapper {public Grade findById(Integer id);
}

GradeMapper.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.gdut.mappers.GradeMapper"><resultMap type="Grade" id="GradeResult"><result property="id" column="id"/><result property="gradeName" column="gradeName"/>//传的是自己的主键来查主表的记录<collection property="students" column="id" select="com.gdut.mappers.StudentMapper.findByGradeId"></collection></resultMap><select id="findById" parameterType="Integer" resultMap="GradeResult">select * from t_grade where id=#{id}</select></mapper>

StudentMapper.java:
新增一个接口:

public Student findByGradeId(Integer gradeId);
 <select id="findByGradeId" resultMap="StudentResult" parameterType="Integer">select * from t_student where gradeId=#{gradeId}</select>

多对多实现,可以通过两个一对多关系来实现

第五章 动态 SQL

第一节:if 条件

 <resultMap type="Student" id="StudentResult"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap><select id="searchStudents1" parameterType="Map" resultMap="StudentResult">select * from t_student where gradeId=#{gradeId}<if test="name!=null">and name like #{name}</if><if test="age!=nulll">and age=#{age}</if></select>
 @Testpublic void testSearchStudents1() {logger.info("添加学生(带条件)");Map<String,Object> map=new HashMap<String,Object>();map.put("gradeId", 2);map.put("name", "%李%");
//       map.put("age", 11);List<Student> studentList=studentMapper.searchStudents1(map);for(Student student:studentList){System.out.println(student);}}

第二节:choose,when 和 otherwise 条件

根据选择条件来查询

 <select id="searchStudents2" parameterType="Map" resultMap="StudentResult">select * from t_student <choose><when test="searchBy=='gradeId'">where gradeId=#{gradeId}</when><when test="searchBy=='name'">where name like #{name}</when><otherwise>where age=#{age}</otherwise></choose></select>
 @Testpublic void testSearchStudents2() {logger.info("添加学生(带条件)");Map<String,Object> map=new HashMap<String,Object>();map.put("searchBy", "gradeId");map.put("gradeId", 2);map.put("name", "%李%");map.put("age", 11);List<Student> studentList=studentMapper.searchStudents2(map);for(Student student:studentList){System.out.println(student);}}

第三节:where 条件

1,自动加上 where; 2,如果 where 子句以 and 或者 or 开头,则自动删除第一个 and 或者 or

 <resultMap type="Student" id="StudentResult"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap><select id="searchStudents3" parameterType="Map" resultMap="StudentResult">select * from t_student <where><if test="gradeId!=null">gradeId=#{gradeId}</if><if test="name!=null">and name like #{name}</if><if test="age!=nulll">and age=#{age}</if></where></select>
 @Testpublic void testSearchStudents3() {logger.info("添加学生(带条件)");Map<String,Object> map=new HashMap<String,Object>();map.put("gradeId", 2);map.put("name", "%李%");map.put("age", 11);List<Student> studentList=studentMapper.searchStudents3(map);for(Student student:studentList){System.out.println(student);}}

第四节:trim 条件(一般不会用到)

功能和 where 元素类似,提供了前缀,后缀功能,更加灵活;

 <select id="searchStudents4" parameterType="Map" resultMap="StudentResult">select * from t_student <trim prefix="where" prefixOverrides="and|or"><if test="gradeId!=null">gradeId=#{gradeId}</if><if test="name!=null">and name like #{name}</if><if test="age!=nulll">and age=#{age}</if></trim></select>
 public void testSearchStudents4() {logger.info("添加学生(带条件)");Map<String,Object> map=new HashMap<String,Object>();map.put("gradeId", 2);// map.put("name", "%李%");// map.put("age", 11);List<Student> studentList=studentMapper.searchStudents4(map);for(Student student:studentList){System.out.println(student);}}

第五节:foreach 循环

 <select id="searchStudents5" parameterType="Map" resultMap="StudentResult">select * from t_student <if test="gradeIds!=null"><where>gradeId in <foreach item="gradeId" collection="gradeIds" open="(" separator="," close=")">#{gradeId}</foreach></where></if></select>
 @Testpublic void testSearchStudents5() {logger.info("添加学生(带条件)");Map<String,Object> map=new HashMap<String,Object>();List<Integer> gradeIds=new ArrayList<Integer>();// gradeIds.add(1);gradeIds.add(2);map.put("gradeIds", gradeIds);List<Student> studentList=studentMapper.searchStudents5(map);for(Student student:studentList){System.out.println(student);}}

第六节:set 条件

1,自动加上 set; 2,自动剔除最后一个逗号“,”;

 <update id="updateStudent" parameterType="Student">update t_student<set><if test="name!=null">name=#{name},</if><if test="age!=null">age=#{age},</if></set>where id=#{id}</update>
 @Testpublic void testUpdateStudent(){logger.info("更新学生(带条件)");Student student=new Student();student.setId(1);student.setName("张三3");student.setAge(13);studentMapper.updateStudent(student);sqlSession.commit();}

第六章 Mybatis杂项

第一节:处理 CLOB、BLOB 类型数据

CLOB:大文本类型(longtext)映射成 String
BLOB:二进制类型,如图片(longblob) 映射成 字节数组byte[]

package com.java1234.model;public class Student {private Integer id;private String name;private Integer age;private byte[] pic;private String remark;    public Student() {super();// TODO Auto-generated constructor stub}public Student(Integer id, String name, Integer age) {super();this.id = id;this.name = name;this.age = age;}public Student(String name, Integer age) {super();this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public byte[] getPic() {return pic;}public void setPic(byte[] pic) {this.pic = pic;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age+ ", remark=" + remark + "]";}
}
 <resultMap type="Student" id="StudentResult"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap><insert id="insertStudent" parameterType="Student">insert into t_student values(null,#{name},#{age},#{pic},#{remark});</insert><select id="getStudentById" parameterType="Integer" resultType="Student">select * from t_student where id=#{id}</select>
 @Testpublic void testInsertStudent(){logger.info("添加学生");Student student=new Student();student.setName("张三4");student.setAge(14);student.setRemark("很长的本文...");byte []pic=null;try{File file=new File("c://boy.jpg");InputStream inputStream=new FileInputStream(file);pic=new byte[inputStream.available()];inputStream.read(pic);inputStream.close();}catch(Exception e){e.printStackTrace();}student.setPic(pic);studentMapper.insertStudent(student);sqlSession.commit();}@Testpublic void testGetStudentById(){logger.info("通过ID查找学生");Student student=studentMapper.getStudentById(4);System.out.println(student);byte []pic=student.getPic();try{File file=new File("d://boy2.jpg");OutputStream outputStream=new FileOutputStream(file);outputStream.write(pic);outputStream.close();}catch(Exception e){e.printStackTrace();}}

第二节:传入多个输入参数

一般用HashMap或者用map,但是也可以用逐一输入

 <select id="searchStudents6" resultMap="StudentResult">select * from t_student where name like #{param1} and age=#{param2}</select>
public List<Student> searchStudents6(String name,int age);
 @Testpublic void testSearchStudents6() {logger.info("添加学生(带条件)");List<Student> studentList=studentMapper.searchStudents6("%3%",12);for(Student student:studentList){System.out.println(student);}}

第三节:Mybatis 分页

1,逻辑分页;
mybatis底层会将所有结果全部查询放入内存,再根据分页信息把前面的几个展示出来

public List<Student> findStudents(RowBounds rowBounds);
 <select id="findStudents" resultMap="StudentResult" flushCache="false" useCache="true">select * from t_student</select>
 @Testpublic void testFindStudent(){logger.info("查询学生");int offset=0,limit=3;RowBounds rowBounds=new RowBounds(offset,limit);List<Student> studentList=studentMapper.findStudents(rowBounds);for(Student student:studentList){System.out.println(student);}}

2,物理分页(开发的时候用,真正实现分页)
用的是mysql的分页

public List<Student> findStudents2(Map<String,Object> map);
 @Testpublic void testFindStudent2(){logger.info("查询学生");Map<String,Object> map=new HashMap<String,Object>();map.put("start", 3);map.put("size", 3);List<Student> studentList=studentMapper.findStudents2(map);for(Student student:studentList){System.out.println(student);}}
 <select id="findStudents2" parameterType="Map" resultMap="StudentResult">select * from t_student<if test="start!=null and size!=null">limit #{start},#{size}</if></select>

第四节:Mybatis 缓存

一般并发量比较大的项目才会用得到。
Mybatis 默认情况下,MyBatis 启用一级缓存,即同一个 SqlSession 接口对象调用了相同的 select 语句,则直 接会从缓存中返回结果,而不是再查询一次数据库; 开发者可以自己配置二级缓存,二级缓存是全局的;
默认情况下,select 使用缓存的,insert update delete 是不使用缓存的;

在mapper.xml中加入这个标签即可

<!--1,size:表示缓存cache中能容纳的最大元素数。默认是1024;2,flushInterval:定义缓存刷新周期,以毫秒计;3,eviction:定义缓存的移除机制;默认是LRU(least recently userd,最近最少使用),还有FIFO(first in first out,先进先出)4,readOnly:默认值是false,假如是true的话,缓存只能读。-->
<cache size="1024" flushInterval="60000" eviction="LRU" readOnly="false"/><select id="findStudents" resultMap="StudentResult" flushCache="false" useCache="true">select * from t_student</select>

第七章 使用注解配置 SQL 映射器

第一节:基本映射语句

1,@Insert 2,@Update 3,@Delete 4,@Select

package com.java1234.mappers;public interface StudentMapper {@Insert("insert into t_student values(null,#{name},#{age})")public int insertStudent(Student student);@Update("update t_student set name=#{name},age=#{age} where id=#{id}")public int updateStudent(Student student);@Delete("delete from t_student where id=#{id}")public int deleteStudent(int id);@Select("select * from t_student where id=#{id}")public Student getStudentById(Integer id);//结果集映射语句@Select("select * from t_student")@Results({@Result(id=true,column="id",property="id"),@Result(column="name",property="name"),@Result(column="age",property="age")})public List<Student> findStudents();}
package com.java1234.service;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import com.java1234.mappers.StudentMapper;
import com.java1234.model.Student;
import com.java1234.util.SqlSessionFactoryUtil;public class StudentTest {private static Logger logger=Logger.getLogger(StudentTest.class);private SqlSession sqlSession=null;private StudentMapper studentMapper=null;/*** 测试方法前调用* @throws Exception*/@Beforepublic void setUp() throws Exception {sqlSession=SqlSessionFactoryUtil.openSession();studentMapper=sqlSession.getMapper(StudentMapper.class);}/*** 测试方法后调用* @throws Exception*/@Afterpublic void tearDown() throws Exception {sqlSession.close();}@Testpublic void testInsert() {logger.info("添加学生");Student student=new Student("琪琪",11);studentMapper.insertStudent(student);sqlSession.commit();}@Testpublic void testUpdate() {logger.info("更新学生");Student student=new Student(6,"琪琪2",12);studentMapper.updateStudent(student);sqlSession.commit();}@Testpublic void testDelete() {logger.info("删除学生");studentMapper.deleteStudent(6);sqlSession.commit();}@Testpublic void testGetById() {logger.info("通过ID查找学生");Student student=studentMapper.getStudentById(1);System.out.println(student);}@Testpublic void testFindStudents() {logger.info("查找所有学生");List<Student> studentList=studentMapper.findStudents();for(Student student:studentList){System.out.println(student);}}}

第三节:关系映射

1,一对一映射(根据外键查); 2,一对多映射(根据主键查被引用的记录)

package com.java1234.mappers;import org.apache.ibatis.annotations.Select;import com.java1234.model.Address;public interface AddressMapper {@Select("select * from t_address where id=#{id}")public Address findById(Integer id);}
public interface GradeMapper {@Select("select * from t_grade where id=#{id}")@Results({@Result(id=true,column="id",property="id"),@Result(column="gradeName",property="gradeName"),
/*property是对应类的属性,也是select语句返回的结果*/              @Result(column="id",property="students",many=@Many(select="com.java1234.mappers.StudentMapper.selectStudentByGradeId"))})public Grade findById(Integer id);}
public interface StudentMapper {@Select("select * from t_student where id=#{id}")@Results({@Result(id=true,column="id",property="id"),@Result(column="name",property="name"),@Result(column="age",property="age"),@Result(column="addressId",property="address",one=@One(select="com.java1234.mappers.AddressMapper.findById"))})public Student selectStudentWithAddress(int id);@Select("select * from t_student where gradeId=#{gradeId}")@Results({@Result(id=true,column="id",property="id"),@Result(column="name",property="name"),@Result(column="age",property="age"),@Result(column="addressId",property="address",one=@One(select="com.java1234.mappers.AddressMapper.findById"))})public Student selectStudentByGradeId(int gradeId);@Select("select * from t_student where id=#{id}")@Results({@Result(id=true,column="id",property="id"),@Result(column="name",property="name"),@Result(column="age",property="age"),@Result(column="addressId",property="address",one=@One(select="com.java1234.mappers.AddressMapper.findById")),@Result(column="gradeId",property="grade",one=@One(select="com.java1234.mappers.GradeMapper.findById"))})public Student selectStudentWithAddressAndGrade(int id);
}

第四节:动态 SQL

@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider
属于拼接sql

package com.java1234.mappers;import java.util.Map;import org.apache.ibatis.jdbc.SQL;import com.java1234.model.Student;public class StudentDynaSqlProvider {public String insertStudent(final Student student){return new SQL(){{INSERT_INTO("t_student");if(student.getName()!=null){VALUES("name", "#{name}");}if(student.getAge()!=null){VALUES("age", "#{age}");}}}.toString();}public String updateStudent(final Student student){return new SQL(){{UPDATE("t_student");if(student.getName()!=null){SET("name=#{name}");}if(student.getAge()!=null){SET("age=#{age}");}WHERE("id=#{id}");}}.toString();}public String deleteStudent(){return new SQL(){{DELETE_FROM("t_student");WHERE("id=#{id}");}}.toString();}public String getStudentById(){return new SQL(){{SELECT("*");FROM("t_student");WHERE("id=#{id}");}}.toString();}public String findStudents(final Map<String,Object> map){return new SQL(){{SELECT("*");FROM("t_student");StringBuffer sb=new StringBuffer();if(map.get("name")!=null){sb.append(" and name like '"+map.get("name")+"'");}if(map.get("age")!=null){sb.append(" and age="+map.get("age"));}if(!sb.toString().equals("")){WHERE(sb.toString().replaceFirst("and", ""));                   }}}.toString();}
}

StudentMapper.java(接口类):


public interface StudentMapper {@InsertProvider(type=StudentDynaSqlProvider.class,method="insertStudent")public int insertStudent(Student student);@UpdateProvider(type=StudentDynaSqlProvider.class,method="updateStudent")public int updateStudent(Student student);@DeleteProvider(type=StudentDynaSqlProvider.class,method="deleteStudent")public int deleteStudent(int id);@SelectProvider(type=StudentDynaSqlProvider.class,method="getStudentById")public Student getStudentById(Integer id);@SelectProvider(type=StudentDynaSqlProvider.class,method="findStudents")public List<Student> findStudents(Map<String,Object> map);

测试类:

@Testpublic void testInsert() {logger.info("添加学生");Student student=new Student("琪琪",11);studentMapper.insertStudent(student);sqlSession.commit();}@Testpublic void testUpdate() {logger.info("更新学生");Student student=new Student(6,"琪琪2",12);studentMapper.updateStudent(student);sqlSession.commit();}@Testpublic void testDelete() {logger.info("删除学生");studentMapper.deleteStudent(6);sqlSession.commit();}@Testpublic void testGetById() {logger.info("通过ID查找学生");Student student=studentMapper.getStudentById(1);System.out.println(student);}@Testpublic void testFindStudents() {logger.info("查找所有学生");Map<String,Object> map=new HashMap<String,Object>();// map.put("name", "%张%");// map.put("age", 12);List<Student> studentList=studentMapper.findStudents(map);for(Student student:studentList){System.out.println(student);}}

Mybatis3 继续盘!相关推荐

  1. 实用常识 | 一篇文章记录如何轻松清理C盘,C盘又满了,继续盘它

    很久之前使用了一种分盘的方法处理C盘爆红的问题,时间不到一年,C盘它又爆红了,这次我又现学现卖,修炼了一种新的方法来解决这个问题,并且在这里记录一下,相信这篇文章帮你解决C盘爆满问题!!! 文章目录 ...

  2. 透明怎么弄_玻璃球里的花纹是怎么弄进去的?谜终于解开了!

    文 | 狂丸 本文转载自微信公众号"狂丸科学"(ID:kuangwanplay),原文首发于2019年2月3日,标题为<玻璃球里的花纹是怎么弄进去的?看完童年之谜终于解开了& ...

  3. vSAN其实很简单-vSAN盘他之重新部署vCenter

    之前的文章里我们说明重装vSAN节点操作系统以及挪动vSAN磁盘的场景: vSAN其实很简单-vSAN盘他之重新安装主机系统 vSAN其实很简单-vSAN盘他之磁盘"乾坤大挪移" ...

  4. 金刚菩提子开裂自动修复此计算机,教你一招修复开裂的金刚菩提

    原标题:教你一招修复开裂的金刚菩提 文玩市场越来越火热,兴起了一大批文玩发烧友.现在,最受男士欢迎的文玩之一则是金刚菩提.不过,玩文玩的朋友会遇到一个常题,就是金刚开裂. 在文玩界,人们经常说过:&q ...

  5. 迎接爆炸主升浪?(附股)

    [前言]本周市场在迭创新高后,盘中震荡加剧,一度出现高台加速跳水走势,但周四股指在惯性低开后被迅速拉起并刷新历史新高,再度掀起迭创新高行情,市场重心继续上移,市场强势上攻格局未变.短线来看,蓝筹股越走 ...

  6. MOS管-传输特性曲线的细微之处

    大家好,我是硬件微讲堂,这是我在CSDN的第3篇原创文章.为避免错过精彩干货知识,欢迎关注公号(硬件微讲堂)并加入免费技术交流群,共同进步! 今年在杭州过年,新年这几天,大部分时间都在看电视,但是无论 ...

  7. 元芳, 我在 Win10 上用 Docker 肝了个 LNMP , 康康?

    元芳, 我在 Win10 上用 Docker 肝了个 LNMP , 康康? 创建 MySQL 创建 PHP 创建 Nginx 难得难得, 看好咯, 就是我, Speauty, 对, 让你加班的 Bug ...

  8. 选股绝招[如何抓住狂涨的黑马]

    选股第1招:洞悉成交量的变化 [ 成交量的圆弧底 ] 当成交量的底部出现时,往往股价的底部也出现了.成交量底部的研判是根据过去的底部来作标准的.当股价从高位往下滑落后,成交量逐步递减至过去的底部均量后 ...

  9. Python爬取京东回力鞋购买情况看看码数比例

    背景 突然想起前阵子看到一篇爬bar并统计女生罩杯情况的文章,心想.我擦,这么好的题材让别人先写了我风暴哭泣.心想,算了,人家本来就比我优秀.然后随便去京东逛了逛.看到回力旗舰店给我推了,那我也来搞搞 ...

最新文章

  1. K - Candies POJ - 3159(利用了自定义比较操作符)
  2. 106页的《Python进阶》中文版(附下载)!
  3. 中国移动开发者社区专访:学习Android的两大法宝
  4. 多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
  5. css规则可以放在云上,CSS中!important规则的使用方法
  6. requirejs(shim)处理加载非AMD规范的js库
  7. html代码type,HTML中type是什么意思
  8. Js实现动态插入删除文本框
  9. 这些数据分析方法你都掌握了么
  10. essential-phone的相关体验
  11. html5 retina 1像素,走向视网膜(Retina)的Web时代
  12. 中国内窥镜检漏装置行业市场供需与战略研究报告
  13. 框架学习之Spring 第四节 Spring集成JDBC组件开发
  14. 04. 替换空格(C++版本)
  15. VS2012 打开项目后无法编辑
  16. 2020年阴历三月初九投资理财~从牛人那里吸取能量,让自己更加强大
  17. Unity CommandBuffer实现毛玻璃特效
  18. day52 css选择器和特性
  19. javax.el.PropertyNotFoundException——属性未找到
  20. ZSTU2019校赛 Problem D Lis(线性基dp)

热门文章

  1. 阿里面试必备:100个高频Spring面试题,助你一臂之力!
  2. OpenVAS Failed to find config ‘daba56c8-73ec-11df-a475-002264764cea‘
  3. 新型付费服务能否在IT领域异军突起?
  4. [转载] 财经郎眼20120623:房地产松绑疑云
  5. 浮云绘图编辑器之文字、图片基础图元操作及源码,用于文本描述及拓扑图、平面布局图开发
  6. Feelings on Life
  7. Processing互动编程开发实践之动态文字打乱功能(别嫌长,代码多,图片多)
  8. C++年月日时分秒与秒数互相转换
  9. 手机桌面隐藏大师_隐藏大师app下载-隐藏大师安卓版下载-ROM之家
  10. 6s测试信号软件,手机信号强度测试:苹果iPhone6s不敌三星S6