MyBatis
1、什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL(所以是一个半自动的ORM框架,要编写SQL语句)、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来将原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)配置和映射为数据库中的记录。MyBatis 直到语句被执行时才清楚数据类型
2、配置文件 application.yml
三种类型的配置文件:
- bootstrap.yml(bootstrap.properties)
- application.yml(application.properties)
- application-dev(prod).yml(application-dev(prod).properties)
bootstrap:用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等;
server:
port: 1234
undertow:
io-threads: 16
worker-threads: 256
buffer-size: 1024
direct-buffers: true
spring:
application:
name: first-project
cloud:
nacos:
discovery:
metadata:
version: shinian
aop:
auto: true
#inetutils:
#preferred-networks: 172.0.71
application.yml:应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等
spring:
datasource:url: jdbc:mysql://localhost:3306/dcn?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:/mapper/*Mapper.xml
加载顺序:bootstrap.yml > application.yml > application-dev(prod).yml
3、编写实体类
4、编写mapper.java
5、编写mapper.xml
5.1 XML映射器
cache
该命名空间的缓存配置
cache-ref
引用其他命名空间的缓存配置
sql
可被其他语句引用的可重用语句块
<sql id="userColumns">
${alias}.id,
${alias}.username,
${alias}.password
</sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns">
< property name="alias" value="t1"/>
</include>,
<include refid="userColumns">
<property name="alias" value="t2"/>
</include>
from some_table t1
cross join some_table t2
</select>
parameterType
入参类型
resultType
出参类型
resultMap
描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素
crud
select 映射查询语句
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT *
FROM PERSON
WHERE ID = #{id}
</select>
select标签参数
flushCache="false"
#将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false
useCache="true"
#将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true
timeout="10"
#这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)
fetchSize="256"
#这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)
statementType="PREPARED"
#可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED
系统缓存
系统缓存分为本地缓存
和全局缓存
本地缓存:又称一级缓存
- 相同sqlsession以相同查询条件查询,第二次查询会使用第一次查询的,已加入缓存的结果;
- 所以,如果希望使用一级缓存,首先必须保证,两次查询是在同一个事务内完成的,查询条件完全相同,并且两次查询之间,没有穿插增删改方法。
- 但是这样一来,不同的session之间是隔离的,为了消除这个隔离,有了二级缓存,但也只是消除了同一张表的隔离。
全局缓存:又称二级缓存
- 一个nameSpace(同一个mapper.xml)对应一个二级缓存。所以这个mapper内只能单表操作,而且默认是不开启的,需要使用属性
useCache="true"
开启二级缓存; - 一级缓存失效后会将数据存入二级缓存。一级缓存查不到,会去查二级缓存;
- 不同mapper(不同二级缓存)缓存相互独立;
- 所以一张表在多个mapper内操作,或者一个mapper内操作多个表,都会导致缓存失效。要使用二级缓存,那么一个mapper里只能有一张表,这张表的所有操作,也只能在这个mapper中。
insert 映射插入语句
<insert id="insertAuthor">
insert into Author (
id,
username,
password,
email,
bio
)
values (
#{id},
#{username},
#{password},
#{email},
#{bio}
)
</insert>
<insert id="insertAuthor">
insert into Author (
username,
password,
email,
bio
)
values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach>
</insert>
update 映射更新语句
<update id="updateAuthor">
update
Author
set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
delete 映射删除语句
<delete id="deleteAuthor">
delete
from Author
where id = #{id}
</delete>
5.2 转义符
1、 '<'不能直接用,要转义为 '<'
2、 ‘&’ 不能直接用,要转义为 '&'
5.3 常用函数
1、INET_ATON(‘209.207.224.40’)
按照网络字节顺序产生数字:209×2563 + 207×2562 + 224×256 + 40
2、INET_NTOA(3520061480)
按数字转换得出网络字节:209.207.224.40
3、case函数
Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略
`CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他'
END as chineseSex`
5.4 选择语句
if语句
<if test="title != null">
title like #{title}
</if>
choose(when、otherxise)语句
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
5.5 where标签
将where换为<where>
。where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除
6、POM
- properties:指定版本号
- dependencies:定义一些公有的maven坐标
- dependencyManagement:定义一些maven坐标,子类需要再次定义才能使用那些maven坐标,但无需再加version
- build:引入插件,但这个子类也要再次引入自己需要的
- respositories:引入仓库地址url
- distributionManagement:引入仓库地址url
- modules:添加微服务模块,总POM中是把微服务模块加入到maven中