springboot + mybatis + mybatisGenerator使用教程

1.mybatis簡介

mybatis 是一個ORM 框架。是一個對持久化框架。



Hibernate 與 Mybatis 對比請點擊連接跳轉:java

www.zhihu.com/question/21…
mysql

2.快速開始

演示項目爲springboot + mybatis。腳手架爲官網https://start.spring.io/ 生成的boot項目。持久化用的mysql數據庫。本文中的父pom爲
spring

<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依賴項目sql

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實體類包路徑}  複製代碼

此處咱們生成了三個包:api

  • 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生成的結果列名對照起來。springboot

<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。bash

2.6.3 @param 註解解決多個入參問題mybatis

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和分頁查詢

相關文章
相關標籤/搜索