mybatis 是一個ORM 框架。是一個對持久化框架。
Hibernate 與 Mybatis 對比請點擊連接跳轉:java
www.zhihu.com/question/21…
mysql
演示項目爲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>複製代碼
主要依賴的包以下,無版本號的包爲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
複製代碼
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='訂單商品';
複製代碼
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
@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;
}複製代碼
/**
* 插入方法
*
* @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.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
<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>複製代碼
<?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>複製代碼
TKmybatis
mybatis plus
PageHelper
更方便的使用mybatis和分頁查詢