ORM 框架是什么
对象关系映射(Object Relational Mapping,简称 ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象技术。简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
为什么需要 ORM
当开发一个应用程序的时候(不使用 O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存、删除、读取对象信息等。在 DAL 中写了很多的方法来读取对象数据、改变状态对象等任务,而这些代码写起来总是重复的。 针对这些问题 ORM 提供了解决方案,简化了将程序中的对象持久化到关系数据库中的操作。
ORM 框架的本质是简化编程中操作数据库的编码,在 Java 江湖中发展到现在基本上就剩两家,一个是宣称可以不用写一句 SQL 的 Hibernate,一个是以动态 SQL 见长的 MyBatis,两者各有特点。在企业级系统开发中可以根据需求灵活使用,发现一个有趣的现象:传统企业大都喜欢使用 Hibernate,而互联网行业通常使用 MyBatis。
MyBatis 介绍
MyBatis 就是一款标准的 ORM 框架,被广泛的应用于各企业开发中。MyBatis 本是 Apache 的一个开源项目 IBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis,2013 年 11 月又迁移到 Github 上。从 MyBatis 的迁移史,也可以看出源码托管平台的发展史,GitHub 目前已经成为世界上最大的开源软件托管平台,建议大家多多关注这个最大的社交网站。
MyBatis 支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。MaBatis 可以使用简单的 XML 或注解用于配置和原始映射。将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
作为一款使用广泛的开源软件,它的特点有哪些?
优点:
- SQL 被统一提取出来,便于统一管理和优化
- SQL 和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射
- 提供对象关系映射标签,支持对象关系组件维护
- 灵活书写动态 SQL,支持各种条件来动态生成不同的 SQL
缺点:
- 编写 SQL 语句时工作量很大,尤其是字段多、关联表多时,更是如此
- SQL 语句依赖于数据库,导致数据库移植性差
MyBatis 几个重要的概念
Mapper 配置: Mapper 配置可以使用基于 XML 的 Mapper 配置文件来实现,也可以使用基于 Java 注解的 MyBatis 注解来实现,甚至可以直接使用 MyBatis 提供的 API 来实现。
Mapper 接口: Mapper 接口是指自行定义的一个数据操做接口,类似于通常所说的 DAO 接口。早期的 Mapper 接口需要自定义去实现,现在 MyBatis 会自动为 Mapper 接口创建动态代理对象。Mapper 接口的方法通常与 Mapper 配置文件中的 select、insert、update、delete 等 XML 结点存在一一对应关系。
Executor: MyBatis 中所有的 Mapper 语句的执行都是通过 Executor 进行的,Executor 是 MyBatis 的一个核心接口。
SqlSession: SqlSession 是 MyBatis 的关键对象,是执行持久化操作的独享,类似于 JDBC 中的 Connection,SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法,它的底层封装了 JDBC 连接,可以用 SqlSession 实例来直接执行被映射的 SQL 语句。
SqlSessionFactory: SqlSessionFactory 是 MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象类获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出。
MyBatis 的工作流程如下:

- 首先加载 Mapper 配置的 SQL 映射文件,或者是注解的相关 SQL 内容。
- 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
- 创建会话。根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession)。会话对象是一个接口,该接口中包含了对数据库操作的增删改查方法。
- 创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
- 封装 SQL 对象。在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
- 操作数据库。拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。
在具体的使用过程中,按照上述的流程来执行。
什么是 MyBatis-Spring-Boot-Starter
MyBatis-Spring-Boot-Starter 是 MyBatis 帮助我们快速集成 Spring Boot 提供的一个组件包。
使用这个组件可以做到以下几点:
- 构建独立的应用
- 几乎可以零配置
- 需要很少的 XML 配置
注意:MyBatis-Spring-Boot-Starter 依赖于 MyBatis-Spring 和 Spring Boot,最新版 1.3.1 需要 MyBatis-Spring 1.3 以上,Spring Boot 版本 1.5 以上。
其实就是 MyBatis 看 Spring Boot 这么火热也开发出一套解决方案主动来集成, 但这一集成确实解决了很多问题,使用起来比以前简单顺畅了许多。mybatis-spring-boot-starter主要提供了两种解决方案,一种是简化后的 XML 配置版,一种是使用注解解决一切问题。
MyBatis 以前只有 XML 配置这种使用的形式,到了后来注解使用特别广泛,MyBatis 也顺应潮流提供了注解的支持,从这里可以看出 MyBatis 一直都跟随着主流技术的变化来完善自己。接下来介绍一下如何使用 XML 版本。
注:第一部分为代码,第二部分为增删改查操作的截图,完整代码可在github下载。
github地址:https://github.com/zjh746140129/Spring-Boot2.0
项目结构截图:

一、代码片段
1、编写学生类、成绩类、分页类
package com.boot.model;
import java.io.Serializable;
import java.util.List;
/**
* @Description: 学生类
* @Author: zhoujh
* @CreateDate: 2018/6/20$ 下午9:27$
* @Version: 1.0
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private Integer age;
private String email;
private String address;
private List<Score> scoreList;
public Student() {
}
public Student(Long id, String name, Integer age, String email, String address) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
this.address = address;
}
public Long getId() {
return id;
}
public void setId(Long 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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Score> getScoreList() {
return scoreList;
}
public void setScoreList(List<Score> scoreList) {
this.scoreList = scoreList;
}
}
package com.boot.model;
import java.io.Serializable;
/**
* @Description: 成绩类
* @Author: zhoujh
* @CreateDate: 2018/6/20$ 下午9:27$
* @Version: 1.0
*/
public class Score implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private Long sid;
private Double chineseScore;
private Double mathScore;
private Double englishScore;
public Score() {
}
public Score(String id, Long sid, Double chineseScore, Double mathScore, Double englishScore) {
this.id = id;
this.sid = sid;
this.chineseScore = chineseScore;
this.mathScore = mathScore;
this.englishScore = englishScore;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public Double getChineseScore() {
return chineseScore;
}
public void setChineseScore(Double chineseScore) {
this.chineseScore = chineseScore;
}
public Double getMathScore() {
return mathScore;
}
public void setMathScore(Double mathScore) {
this.mathScore = mathScore;
}
public Double getEnglishScore() {
return englishScore;
}
public void setEnglishScore(Double englishScore) {
this.englishScore = englishScore;
}
}
package com.boot.model;
import com.boot.common.PageParam;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 分页封装数据
* @Author: zhoujh
* @CreateDate: 2018/6/20$ 下午10:11$
* @Version: 1.0
*/
public class Page<E> implements Serializable {
private static final long serialVersionUID = -2020350783443768083L;
private int currentPage = 1; //当前页数
private long totalPage; //总页数
private long totalNumber; //总记录数
private List<E> list; //数据集
public static Page NULL = new Page(0, 0, 15, new ArrayList());
public Page() {
super();
}
/**
* @param beginLine 当前页数
* @param totalNumber 总记录数
* @param pageSize 页大小
* @param list 页数据
*/
public Page(int beginLine, long totalNumber, int pageSize, List<E> list) {
super();
this.currentPage = beginLine / pageSize + 1;
this.totalNumber = totalNumber;
this.list = list;
this.totalPage = totalNumber % pageSize == 0 ? totalNumber
/ pageSize : totalNumber / pageSize + 1;
}
public Page(PageParam pageParam, long totalNumber, List<E> list){
super();
this.currentPage = pageParam.getCurrentPage();
this.totalNumber = totalNumber;
this.list = list;
this.totalPage = totalNumber % pageParam.getPageSize() == 0 ? totalNumber
/ pageParam.getPageSize() : totalNumber / pageParam.getPageSize() + 1;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public long getTotalPage() {
return totalPage;
}
public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}
public long getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(long totalNumber) {
this.totalNumber = totalNumber;
}
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
2、编写mapper.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.boot.mapper.ScoreMapper" >
<resultMap id="BaseResultMap" type="com.boot.model.Score" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="chinese_score" property="chineseScore" jdbcType="DOUBLE" />
<result column="english_score" property="englishScore" jdbcType="DOUBLE" />
<result column="math_score" property="mathScore" jdbcType="DOUBLE" />
<result column="sid" property="sid" jdbcType="BIGINT" />
</resultMap>
<sql id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Update_By_Example_Where_Clause" >
<where >
<foreach collection="example.oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Base_Column_List" >
id, chinese_score, english_score, math_score, sid
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
<include refid="Base_Column_List" />
from score
where id = #{id,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
delete from score
where id = #{id,jdbcType=VARCHAR}
</delete>
<insert id="insert" parameterType="com.boot.model.Score" >
insert into score (id, chinese_score, english_score,
math_score, sid)
values (#{id,jdbcType=VARCHAR}, #{chineseScore,jdbcType=DOUBLE}, #{englishScore,jdbcType=DOUBLE},
#{mathScore,jdbcType=DOUBLE}, #{sid,jdbcType=BIGINT})
</insert>
<insert id="insertSelective" parameterType="com.boot.model.Score" >
insert into score
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="chineseScore != null" >
chinese_score,
</if>
<if test="englishScore != null" >
english_score,
</if>
<if test="mathScore != null" >
math_score,
</if>
<if test="sid != null" >
sid,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=VARCHAR},
</if>
<if test="chineseScore != null" >
#{chineseScore,jdbcType=DOUBLE},
</if>
<if test="englishScore != null" >
#{englishScore,jdbcType=DOUBLE},
</if>
<if test="mathScore != null" >
#{mathScore,jdbcType=DOUBLE},
</if>
<if test="sid != null" >
#{sid,jdbcType=BIGINT},
</if>
</trim>
</insert>
<update id="updateByExampleSelective" parameterType="map" >
update score
<set >
<if test="record.id != null" >
id = #{record.id,jdbcType=VARCHAR},
</if>
<if test="record.chineseScore != null" >
chinese_score = #{record.chineseScore,jdbcType=DOUBLE},
</if>
<if test="record.englishScore != null" >
english_score = #{record.englishScore,jdbcType=DOUBLE},
</if>
<if test="record.mathScore != null" >
math_score = #{record.mathScore,jdbcType=DOUBLE},
</if>
<if test="record.sid != null" >
sid = #{record.sid,jdbcType=BIGINT},
</if>
</set>
<if test="_parameter != null" >
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByExample" parameterType="map" >
update score
set id = #{record.id,jdbcType=VARCHAR},
chinese_score = #{record.chineseScore,jdbcType=DOUBLE},
english_score = #{record.englishScore,jdbcType=DOUBLE},
math_score = #{record.mathScore,jdbcType=DOUBLE},
sid = #{record.sid,jdbcType=BIGINT}
<if test="_parameter != null" >
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByPrimaryKeySelective" parameterType="com.boot.model.Score" >
update score
<set >
<if test="chineseScore != null" >
chinese_score = #{chineseScore,jdbcType=DOUBLE},
</if>
<if test="englishScore != null" >
english_score = #{englishScore,jdbcType=DOUBLE},
</if>
<if test="mathScore != null" >
math_score = #{mathScore,jdbcType=DOUBLE},
</if>
<if test="sid != null" >
sid = #{sid,jdbcType=BIGINT},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.boot.model.Score" >
update score
set chinese_score = #{chineseScore,jdbcType=DOUBLE},
english_score = #{englishScore,jdbcType=DOUBLE},
math_score = #{mathScore,jdbcType=DOUBLE},
sid = #{sid,jdbcType=BIGINT}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>
<?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.boot.mapper.StudentMapper" >
<resultMap id="BaseResultMap" type="com.boot.model.Student" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="address" property="address" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<!--<collection column="sid" property="scoreList" javaType="java.util.List" resultMap="scoreResultMap" />-->
<collection column="sid" property="scoreList" ofType="com.boot.model.Score">
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="chinese_score" property="chineseScore" jdbcType="DOUBLE" />
<result column="english_score" property="englishScore" jdbcType="DOUBLE" />
<result column="math_score" property="mathScore" jdbcType="DOUBLE" />
<result column="sid" property="sid" jdbcType="BIGINT" />
</collection>
</resultMap>
<select id="selectStudentScore" resultMap="BaseResultMap">
SELECT
student.address AS address,
student.age AS age,
student.`name` AS `name`,
student.email AS email,
score.chinese_score AS chinese_score,
score.english_score AS english_score,
score.math_score AS math_score,
student.id,
score.sid
FROM
score ,
student
WHERE
score.sid = student.id
</select>
<!-- <resultMap id="scoreResultMap" type="com.boot.model.Score" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="chinese_score" property="chineseScore" jdbcType="DOUBLE" />
<result column="english_score" property="englishScore" jdbcType="DOUBLE" />
<result column="math_score" property="mathScore" jdbcType="DOUBLE" />
<result column="sid" property="sid" jdbcType="BIGINT" />
</resultMap>-->
<sql id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Update_By_Example_Where_Clause" >
<where >
<foreach collection="example.oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Base_Column_List" >
id, address, age, email, name
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
<include refid="Base_Column_List" />
from student
where id = #{id,jdbcType=BIGINT}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
delete from student
where id = #{id,jdbcType=BIGINT}
</delete>
<insert id="insert" parameterType="com.boot.model.Student" >
insert into student (id, address, age,
email, name)
values (#{id,jdbcType=BIGINT}, #{address,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER},
#{email,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="com.boot.model.Student" >
insert into student
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="address != null" >
address,
</if>
<if test="age != null" >
age,
</if>
<if test="email != null" >
email,
</if>
<if test="name != null" >
name,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=BIGINT},
</if>
<if test="address != null" >
#{address,jdbcType=VARCHAR},
</if>
<if test="age != null" >
#{age,jdbcType=INTEGER},
</if>
<if test="email != null" >
#{email,jdbcType=VARCHAR},
</if>
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByExampleSelective" parameterType="map" >
update student
<set >
<if test="record.id != null" >
id = #{record.id,jdbcType=BIGINT},
</if>
<if test="record.address != null" >
address = #{record.address,jdbcType=VARCHAR},
</if>
<if test="record.age != null" >
age = #{record.age,jdbcType=INTEGER},
</if>
<if test="record.email != null" >
email = #{record.email,jdbcType=VARCHAR},
</if>
<if test="record.name != null" >
name = #{record.name,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null" >
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByExample" parameterType="map" >
update student
set id = #{record.id,jdbcType=BIGINT},
address = #{record.address,jdbcType=VARCHAR},
age = #{record.age,jdbcType=INTEGER},
email = #{record.email,jdbcType=VARCHAR},
name = #{record.name,jdbcType=VARCHAR}
<if test="_parameter != null" >
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByPrimaryKeySelective" parameterType="com.boot.model.Student" >
update student
<set >
<if test="address != null" >
address = #{address,jdbcType=VARCHAR},
</if>
<if test="age != null" >
age = #{age,jdbcType=INTEGER},
</if>
<if test="email != null" >
email = #{email,jdbcType=VARCHAR},
</if>
<if test="name != null" >
name = #{name,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<update id="updateByPrimaryKey" parameterType="com.boot.model.Student" >
update student
set address = #{address,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER},
email = #{email,jdbcType=VARCHAR},
name = #{name,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT}
</update>
<select id="getList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from student
where 1=1
order by id desc
</select>
<select id="getCount" resultType="Integer">
select
count(1)
from student
where 1=1
</select>
</mapper>
3、编写mapper
package com.boot.mapper;
import com.boot.model.Score;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface ScoreMapper {
int deleteByPrimaryKey(String id);
int insert(Score record);
int insertSelective(Score record);
Score selectByPrimaryKey(String id);
int updateByPrimaryKeySelective(Score record);
int updateByPrimaryKey(Score record);
}
package com.boot.mapper;
import com.boot.model.Student;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface StudentMapper {
int deleteByPrimaryKey(Long id);
int insert(Student record);
int insertSelective(Student record);
Student selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
List<Student> getList();
int getCount();
List<Student> selectStudentScore();
}
4、编写service
package com.boot.service;
import com.boot.mapper.StudentMapper;
import com.boot.model.Student;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* 学生类service
* Created by zhoujh on 2018/6/25.
*/
@Service
public class StudentService {
@Resource
private StudentMapper studentMapper;
/**
* 新增学生
* @param student
* @return
*/
public int addStudent(Student student){
return this.studentMapper.insert(student);
}
/**
* 删除学生
* @param id
* @return
*/
public int deleteStudent(Long id){
return this.studentMapper.deleteByPrimaryKey(id);
}
/**
* 修改学生信息
* @param student
* @return
*/
public int updateStudent(Student student){
return this.studentMapper.updateByPrimaryKey(student);
}
/**
* 查询学生信息
* @param id
* @return
*/
public Student selectStudentById(Long id){
return this.studentMapper.selectByPrimaryKey(id);
}
/**
* 查询所有学生(分页)
* @return
*/
public PageInfo<Student> selectAllStudent(int pageNum, int pageSize){
PageHelper.startPage(pageNum, pageSize);
List<Student> studentList = this.studentMapper.getList();
PageInfo result = new PageInfo(studentList);
return result;
}
/**
* 查询所有学生成绩(分页)
* @return
*/
public PageInfo<Student> findAllStudentScore(int pageNum, int pageSize){
PageHelper.startPage(pageNum, pageSize);
List<Student> studentList = this.studentMapper.selectStudentScore();
PageInfo result = new PageInfo(studentList);
return result;
}
/**
* 查询所有学生总数(用于分页)
* @return
*/
public int selectStudentCount(){
return this.studentMapper.getCount();
}
}
5、分页工具类
package com.boot.common;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* @Description: 分页工具类
* @Author: zhoujh
* @CreateDate: 2018/6/20$ 下午10:15$
* @Version: 1.0
*/
public class PageParam {
private int beginLine; //起始行
private Integer pageSize = 3;
private Integer currentPage=0; // 当前页
public int getBeginLine() {
return pageSize*currentPage;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
6、 编写controller
package com.boot.controller;
import com.boot.model.Page;
import com.boot.model.Student;
import com.boot.service.StudentService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 学生controller
* Created by zhoujh on 2018/6/25.
*/
@RestController
public class StudentController {
@Resource
private StudentService studentService;
/**
* 新增学生
* @param student
* @return
*/
@RequestMapping("/add")
public int saveStudent(Student student){
return this.studentService.addStudent(student);
}
/**
* 删除学生
* @param id
* @return
*/
@RequestMapping("/delete")
public int deleteStudent(Long id){
return this.studentService.deleteStudent(id);
}
/**
* 修改学生信息
* @param student
* @return
*/
@RequestMapping("/update")
public int updateStudent(Student student){
return this.studentService.updateStudent(student);
}
/**
* 查询学生信息
* @param id
* @return
*/
@RequestMapping("/select")
public Student findStudentById(Long id){
return this.studentService.selectStudentById(id);
}
@ResponseBody
@RequestMapping("/getList")
public Object findAllStudent(
@RequestParam(name = "pageNum", required = false, defaultValue = "1")
int pageNum,
@RequestParam(name = "pageSize", required = false, defaultValue = "10")
int pageSize){
return studentService.selectAllStudent(pageNum,pageSize);
}
@ResponseBody
@RequestMapping("/getAllStudentScore")
public Object findAllStudentScore(
@RequestParam(name = "pageNum", required = false, defaultValue = "1")
int pageNum,
@RequestParam(name = "pageSize", required = false, defaultValue = "10")
int pageSize){
return studentService.findAllStudentScore(pageNum,pageSize);
}
// @RequestMapping("/getList")
// public Page<Student> getList(HttpServletRequest request) {
// Map<String,String> map = new HashMap<>();
// map.put("beginLine","0");
// map.put("pageSize","2");
// List<Student> users = studentService.selectAllStudent(map);
// long count = this.studentService.selectStudentCount();
// Page page = new Page(0,count,1,users);
// return page;
// }
}
7、启动类
package com.boot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("com.boot.mapper")
public class BootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(BootMybatisApplication.class, args);
}
}
8、配置文件
mybatis.mapper-locations=classpath:mybatis/*.xml
mybatis.type-aliases-package=com.boot.model
server.port=8099
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/school_score?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
#pagehelper
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
pagehelper.returnPageInfo = check
9、完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>boot-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>boot-mybatis</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、演示增删改查
1、查询(使用postman测试)

好了,到这里 Spring Boot2.0系列教程之 集成MyBatis就完成了,读者在实践过程中有问题,评论私信即可,回第一时间回复。

本文介绍MyBatis框架的基本概念及其与Spring Boot的集成方式,包括学生信息和成绩的增删改查操作示例。
402

被折叠的 条评论
为什么被折叠?



