springboot整合mybatis
引入mybatis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
增加yml配置
# 数据源
datasource:
url: jdbc:mysql://124.220.8.55:3306/communitymanagement?serverTimezone=Asia/Chongqing&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis配置
mybatis:
# 定义mapper位置
mapper-locations: classpath:/mapper/*.xml
# 定义实体位置
type-aliases-package: com.zhl.base.model.entity
configuration:
cache-enabled: true
use-generated-keys: true
default-executor-type: REUSE
use-actual-param-name: true
使⽤@Mapper注解和@MapperScan注解来将Mapper接⼝类交给Sprinig进⾏管理。
基于xml
id:唯一标识
resultType:返回结果类型
parameterType:请求参数类型
<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="String">
select * from sys_user where id = #{id}
</select>
<!-- 向 user 表插入一条数据 -->
<insert id="insertUser" parameterType="com.zhl.base.model.entity.BaseUser">
insert into sys_user(id,is_del,name,age)
value(#{id},#{isDel},#{name},#{age})
</insert>
<!-- 根据 id 更新 user 表的数据 -->
<update id="updateUserById" parameterType="com.zhl.base.model.entity.BaseUser">
update sys_user set name=#{username} where id=#{id}
</update>
<!-- 根据 id 删除 user 表的数据 -->
<delete id="deleteUserById" parameterType="int">
delete from sys_user where id=#{id}
</delete>
#{}:表示占位符,用来接收输入参数,类型可以是简单类型,pojo,HashMap等等
如果接收简单类型,#{}可以写成 value 或者其他名称
如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值
${}:表示一个拼接符,会引起 sql 注入,不建议使用
用来接收输入参数,类型可以是简单类型,pojo,HashMap等等
如果接收简单类型,${}里面只能是 value
如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值
mybatis 默认支持的别名
动态sql
mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签
通过if来判断是否执行<if>内的sql,通过and和or来添加判断条件
<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="int">
select * from sys_user where id = #{id}
<if test="name !=null and name !=''">
and name = #{name}
</if>
<if test="name !=null and name !=''">
and name like '%${name}%'
</if>
<if test="age !=null and age !=''">
and name like concat('%',#{age},'%')
</if>
</select>
where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="int">
select * from sys_user
<where>
<if test="name !=null and name !=''">
and name = #{name}
</if>
</where>
</select>
set标签
<update id="updateUserById" parameterType="int">
update sys_user u
<set>
<if test="name != null and name != ''">
u.name = #{name},
</if>
<if test="age != null and age != ''">
u.age = #{age}
</if>
</set>
where id=#{id}
</update>
choose(when,otherwise)标签,类似于 Java 的 switch 语句
<select id="selectUserByChoose" resultType="com.zhl.base.model.entity.BaseUser" parameterType="com.zhl.base.model.entity.BaseUser">
select * from sys_user
<where>
<choose>
<when test="id !='' and id != null">
id=#{id}
</when>
<when test="name !='' and name != null">
and name=#{name}
</when>
<otherwise>
and age=#{age}
</otherwise>
</choose>
</where>
</select>
动态SQL: SQL 片段
<sql id="selectUserByUserNameAndSexSQL">
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null and age != ''">
AND age = #{age}
</if>
</sql>
引用sql片段
<select id="selectUserByUsernameAndSex" resultType="com.zhl.base.model.entity.BaseUser" parameterType="com.zhl.base.model.entity.BaseUser">
select * from user
<!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
<include refid="selectUserByUserNameAndSexSQL"></include>
</select>
foreach 语句
<select id="selectUserByListId" parameterType="com.zhl.base.model.entity.BaseUser" resultType="com.zhl.base.model.entity.BaseUser">
select * from user
<where>
<!--
collection:指定输入对象中的集合属性
item:每次遍历生成的对象
open:开始遍历时的拼接字符串
close:结束时拼接的字符串
separator:遍历对象之间需要拼接的字符串
select * from user where 1=1 and (id=1 or id=2 or id=3)
-->
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id=#{id}
</foreach>
</where>
</select>
一对一、一对多、多对多
一对一
<resultMap id="BaseUserMap" type="com.zhl.base.model.vo.BaseUserVo">
<!--id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个id-->
<!--column:数据库对应的列-->
<!--property:实体类对应的属性名-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="isDel" property="isDel"/>
<result column="age" property="age"/>
<result column="deptId" property="deptId"/>
<result column="gmt_creat" property="gmtCreat"/>
<result column="gmt_modified" property="gmtModified"/>
<!--association:用于映射关联查询单个对象的信息
property:实体类对应的属性名
javaType:实体类对应的全类名
-->
<association property="baseDept" javaType="com.zhl.base.model.entity.BaseDept">
<!--
id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个id
column:数据库对应的列
property:实体类对应的属性名
-->
<id column="deptId" property="id"/>
<result column="deptName" property="deptName"/>
</association>
</resultMap>
一对一、一对多 www.cnblogs.com/xiaoyuicom/…