springboot + mybatis + mybatisGenerator使用教程

1.mybatis简介

mybatis 是一个ORM 框架。是一个对持久化框架。



Hibernate 与 Mybatis 对比请点击链接跳转:

www.zhihu.com/question/21…

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和分页查询


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值