1.mybatis简介
mybatis 是一个ORM 框架。是一个对持久化框架。
Hibernate 与 Mybatis 对比请点击链接跳转:
2.快速开始
演示项目为springboot + mybatis。脚手架为官网https://start.spring.io/ 生成的boot项目。持久化用的mysql数据库。本文中的父pom为
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>复制代码
2.1 包依赖
主要依赖的包如下,无版本号的包为parent的dependencyManagement依赖项目
spring-boot-starter-jdbc
mysql-connector-java
druid-spring-boot-starter:1.1.10
mybatis-spring-boot-starter
spring-boot-starter-test
lombok
复制代码
2.2 数据库准备
CREATE TABLE `sale_order` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'is',
`order_code` varchar(45) NOT NULL COMMENT '订单编码',
`status` int(11) DEFAULT '0' COMMENT '状态编码 0:默认 10:待支付 20进行中 30已完成 40已取消',
`amount` int(11) DEFAULT '0' COMMENT '价格总价',
`create_user` varchar(45) DEFAULT '' COMMENT '创建人账号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建人',
`is_delete` int(11) DEFAULT '0' COMMENT '是否删除 0:不删除 1:删除',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `order_code_UNIQUE` (`order_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='销售订单';
CREATE TABLE `sale_order_products` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`order_code` varchar(45) NOT NULL COMMENT '订单号',
`variant_code` varchar(45) NOT NULL COMMENT 'sku编码',
`attributes` varchar(256) DEFAULT '' COMMENT '属性描述',
`quantity` int(11) DEFAULT '0' COMMENT '数量',
`price` int(11) DEFAULT '0' COMMENT '单价',
PRIMARY KEY (`id`),
KEY `idx_order_code` (`order_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单商品';
复制代码
2.3 springboot配置
springboot的配置文件此处采用yml文件格式。但是一定要注意,一定要注意缩进格式和节点。
server:
port: 10125
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&serverTimezone=UTC
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: 123456
druid:
initialSize: 5
logging:
level:
io.xuehao: debug
## NOTE: 该配置节点为独立的节点,无缩进。容易误放在spring的节点下,导致配置无法被识别
mybatis:
mapper-locations: classpath:{你的相对于classpath的路径}/*.xml
type-aliases-package: {你的domain实体类包路径} 复制代码
此处我们生成了三个包:
- domain 存放实体类
- mapper 存放java映射文件
- resources 目录下 mapping 存放xml的映射文件
2.4 创建实体类
@Builder
@Data
public class SaleOrder {
private Long id;
private String orderCode;
private Integer status;
private Integer amount;
private String createUser;
private Date createTime;
private Integer isDelete;
}复制代码
@Data
@Builder
public class SaleOrderProducts {
private Long id;
private String orderCode;
private String variantCode;
private String attributes;
private Integer quantity;
private Integer price;
}复制代码
2.5 定义java Api文件,命名为 XxxMapper.java
/**
* 插入方法
*
* @param saleOrder
*/
void insert(SaleOrder1 saleOrder);
/**
* 插入方法 insertSelective
*
* @param saleOrder
*/
void insertSelective(SaleOrder1 saleOrder);
/**
* 查询方法
*
* @param saleOrderExample
* @return
*/
List<SaleOrder1> query(SaleOrderExample1 saleOrderExample);
/**
* 更新
* @param saleOrder
* @param saleOrderExample
* @return
*/
int update(@Param(value = "saleOrder") SaleOrder1 saleOrder, @Param(value = "example") SaleOrderExample1 saleOrderExample);
复制代码
2.6 创建mapper的xml映射文件
2.6.1. 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="{你的java api mapper文件的完整路径}" >
<insert id="insert">
INSERT INTO `demo`.`sale_order` (`order_code`, `status`, `amount`, `create_user`)
VALUES (#{orderCode}, #{status}, #{amount}, #{createUser});
</insert>
<insert id="insertSelective">
INSERT INTO `demo`.`sale_order`
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="orderCode!=null">
`order_code`,
</if>
<if test="status!=null">
`status`,
</if>
<if test="amount!=null">
`amount`,
</if>
<if test="createUser!=null">
`create_user`,
</if>
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="orderCode!=null">
#{orderCode},
</if>
<if test="status!=null">
#{status},
</if>
<if test="amount!=null">
#{amount},
</if>
<if test="createUser!=null">
#{createUser},
</if>
</trim>
</insert>
<resultMap id="BaseResultMap" type="io.xuehao.domain.SaleOrder1">
<id column="id" property="id" />
<result column="order_code" property="orderCode" />
<result column="status" property="status" />
<result column="amount" property="amount" />
<result column="create_user" property="createUser" />
<result column="create_time" property="createTime" />
<result column="is_delete" property="isDelete" />
</resultMap>
<select id="query" resultMap="BaseResultMap">
SELECT * FROM sale_order
<where>
<if test="isDelete != null">
and is_delete = #{isDelete}
</if>
<if test="codes != null and codes.size != 0">
and order_code in
<foreach collection="codes" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</if>
</where>
</select>
<update id="update">
UPDATE sale_order
<set>
<if test="saleOrder.status!=null">
status = #{saleOrder.status},
</if>
<if test="saleOrder.amount!=null">
amount = #{saleOrder.amount},
</if>
</set>
<where>
<if test="example.isDelete != null">
and is_delete = #{example.isDelete}
</if>
<if test="example.codes != null and example.codes.size != 0">
and order_code in
<foreach collection="example.codes" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</if>
</where>
</update></mapper>复制代码
2.6.2. 可以在xml里边定义一个结果对象,其作用是把对象和sql生成的结果列名对照起来。
<resultMap id="BaseResultMap" type="xuehao.io.domain.SaleOrder" >
<id column="id" property="id" />
<result column="order_code" property="orderCode" />
<result column="status" property="status" />
<result column="amount" property="amount" />
<result column="create_user" property="createUser" />
<result column="create_time" property="createTime" />
<result column="is_delete" property="isDelete"/>
</resultMap>复制代码
你的返回值如果是对象或者对象数组,就可以直接使用这个resultMap的Id。
2.6.3 @param 注解解决多个入参问题
3. 逆向工程
1. pom配置文件,加入plugin
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 自动生成的配置,${basedir}表示项目根目录 ,configurationFile默认在resource目录下-->
<!--<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>-->
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>复制代码
2. 加入配置文件 generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="application.yml" />
<context id="Tables" targetRuntime="MyBatis3">
<!-- 注释 -->
<commentGenerator>
<!-- 是否生成注释代时间戳 -->
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- JDBC连接 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/demo"
userId="root"
password="123456">
</jdbcConnection>
<!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成实体类地址 -->
<javaModelGenerator targetPackage="io.xuehao.domain" targetProject="src/main/java">
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaModelGenerator>
<!-- 生成mapper xml文件 -->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成mapper xml对应Client-->
<javaClientGenerator targetPackage="io.xuehao.mapper" targetProject="src/main/java" type="XMLMAPPER">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 配置表信息 -->
<table tableName="sale%"></table>
</context>
</generatorConfiguration>复制代码
3. 直接在插件点击生成,这一切就大功告成
4. 扩展
TKmybatis
mybatis plus
PageHelper
更方便的使用mybatis和分页查询