0


MyBatis的使用

一.Sring项目中关于MyBatis的配置

1.在pom.xml中引入框架依赖

这里手动进行添加,通过在已有的spring项目中的pom.xml文件中引入以下依赖

<!-- 添加 MyBatis 框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 添加 MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

2.配置文件配置相关信息

在application.properties中配置以下内容

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#配置mybatis的xml文件路径
mybatis.mapper-locations=classpath:mapper/**Mapper.xml

这里关于xml文件路径配置的匹配规则是在当前mapper下所有文件名以Mapper.xml结尾的文件。

如下所示:

3.设置mapper中的xml文件内容

其中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="org.example.mapper.UserMapper">

</mapper>

mapper里面就是对于CRUD操作的一些语句,只不过这些语句头需要遵守一些约束和规定,之后才能转化为java对象,并作为返回值返回给java中调用的方法。

4.根据以上配置实现的查询示例

查询前的配置:

(1)添加实体类

(2)添加mapper接口

(3)添加UserMapper.xml

将查询到的结果集会自动装配到配置的resultMap中

(4)server层的调用

mapper里面的指定方法被调用后会通过之前配置的xml和对应的路径会执行xml文件中的方法

(5)controller层的调用

定义service层,然后在该层调用mapper中的方法

(6)前端访问后端路径

通过postman来通过url来访问该资源下的路径

上面就是使用mybatis来对数据库操作的整个流程,接下来就是一些有关xml中关于CRUD语句的具体操作和配置。

二.有关mybatis中xml对于数据库操作的具体使用

1.插入操作

seGeneratedKeys: MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值:false。
keyColumn:设置生成键值在数据库表中的列名;如果生成列不止一个,可以用逗号分隔多个属性名称。
keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。

controller层

service层

mapper层

通过接口插入成功的显示

UserMapper.xml中的sql代码:

    <insert id="insertOne" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert
        into
         user(username, password, nickname)
        values (#{username},#{password},#{nickname})
    </insert>

2.删除操作

基于xml文件配置好的前提下,然后在xml文件中写sql操作

通过构造前端接口,来调用mybatis中的sql来进行验证,执行顺序如下:

3.修改操作

4.查询操作

对于查询操作来说,需要在xml中配置结果集映射,因为需要将查找中的数据映射为一个java对象。

首先在xml文件中使用resultMap,然后设置id,之后的查询语句需要根据该id来进行转化为type中的对象,其中type中为model类的位置(类路径),然后里面就是关于映射关系的指定,其中id是数据库中关于主键的映射,如果不是主键,就使用result,对于属性中的参数,如column是数据库中的字段名,而property是类的成员变量。

<!--    这里是配置有关查询到的结果集转化为哪一个-->
<!--    column代表数据库中的字段-->
    <resultMap id="ResultBaseMap" type="org.example.model.User">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="nickname" property="nickname"></result>
        <result column="github" property="github"></result>
        <result column="head" property="head"></result>
    </resultMap>

三.Mybatis进阶操作

1.参数占位符

#{}是预编译占位符,在处理是,会将该位置的数据先转化为?,然后在执行PreparedStament中的set方法时,将?替换变量值。如果是字符串,会添加""。

${}是直接进行替换为变量的值,存在sql注入问题。

假如传递的数据是sort ,对于#{},最终会处理成"sort",而${}就是sort。

2.like查询

在使用like的时候,一般是模糊查询,在mybatis中需要使用concat函数来将%与#{变量值}来进行拼接。

concat(str1, str2, str3...)是将str1和str2和str3等全部进行拼接起来。

<!--    like查询-->
    <select id="selectLike" resultMap="ResultBaseMap">
        select
        id,
        username,
        password
        from
        user
        where password like concat('%',#{password},'%');
    </select>

3.多表查询

(1)一对一查询

对于多表查询时,都需要使用resultMap来进行配置,在配置前还需要给对象中添加新的属性。例如一个用户登录表和用户信息表之间的关系是一对一,在进行关联查询的时候首先需要给User类中添加一个Message类型的成员变量,然后再在resultMap中除了配置有关User信息的属性外,还需要添加一个<association property="" resultMap="" columnPrefix="">属性.

property是在User中新添加的成员message, resultMap是需要关联的结果集的映射,而columnPrefix是对于查询的结果字段添加前缀,如果两个表中右重复字段,可以通过该字段进行区分,之后在associate中配置的resultMap中会去除掉前缀进行匹配。

<!--    一对一关联自己的message信息-->
    <resultMap id="ResultBaseMap2" type="org.example.model.User">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="nickname" property="nickname"></result>
        <result column="github" property="github"></result>
        <result column="head" property="head"></result>
        <association property="message" resultMap="org.example.mapper.UMMapper.BaseResultMap"
                     columnPrefix="m_"></association>
    </resultMap>
<!--    一对一关联查询-->
    <select id="onebyone" resultMap="ResultBaseMap2">
        select
        u.id,
        u.username,
        m.id_card m_id_card,
        m.id m_id,
        m.user_id m_user_id
        from user u left join message m on u.id=m.user_id;
    </select>

查询和配置关系

(2)一对多查询

对于一个用户表和文章表的关系是一对多,一个用户可以有多篇文章,Mybatis中也是通过resultMap来对查询结果集进行配置,然后再对查询结果中映射的对象中添加一个新的集合属性(因为是一对多关系),和一对一不同的是resultMap中设置的是collection属性,其他的配置规则基本不变。

<!--    这里是配置有关查询到的结果集转化为哪一个-->
<!--    column代表数据库中的字段-->
    <resultMap id="ResultBaseMap" type="org.example.model.User">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="nickname" property="nickname"></result>
        <result column="github" property="github"></result>
        <result column="head" property="head"></result>
        <collection property="articles" resultMap="org.example.mapper.ArticleMapper.ResultBaseMap"
                    columnPrefix="a_"></collection>
    </resultMap>

<!--关联查询,一个用户对应多篇文章-->
<select id="selectUserAndArticle" resultMap="ResultBaseMap">
        select
        u.id,
        u.username,
        u.password,
        u.nickname,
        u.github,
        u.head,
        a.id a_id,
        a.title a_title,
        a.date a_date,
        a.content a_content
         from user u join article a on u.id=a.user_id
</select>

4.动态查询(if,trim,where,set,foreach的使用)

(1)if

标签为:<if test="属性值不为空"> </if>

如果对于一个参数是否传递是不确定的(可能为空或不为空),我们可以使用if来进行判断,如果传了就在sql中显示,没有传就不显示。

如注册用户时,有些信息可以不用传递,如头像等,这时候就可以在mybatis中使用if来进行过滤该参数。

    <insert id="insertSelective">
        insert into user(
        username,
        nickname,
        password
        <if test="head!=null"> ,head </if>
        <if test="github!=null"> ,github </if>
    )
        values (
        #{username},
        #{nickname},
        #{password}
        <if test="head!=null"> ,#{head} </if>
        <if test="github!=null"> ,#{github} </if>
        )
    </insert>

(2)trim

首先trim标签中有多个参数,分别为:

prefix=“” 表示整个语句块以prefix中的内容作为前缀

suffix=“” 表示整个语句块以suffix中的内容作为后缀

prefixOverrides=“” 表示整个语句块要去掉的前缀

suffixOverrides=“” 表示整个语句块要去掉的后缀

以之前的选择插入语句为例,来使用上面的参数:

    <insert id="insertParam">
        insert into user
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="username!=null">
                 username,
             </if>
             <if test="nickname!=null">
                 nickname,
             </if>
             <if test="password!=null">
                 password,
             </if>
             <if test="github!=null">github</if>
         </trim>
        <trim prefix="values(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                #{username},
            </if>
            <if test="nickname">
                #{nickname},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="github!=null">
                #{github},
            </if>
        </trim>
    </insert>

(3)where

<where></where>是用在条件查询中(也可以使用上面的trim),对于where中的<if></if>里面的内容,写成and 属性名=属性值,之后会自动去掉第一个and。

如下所示,如果传递的password和username不为空,就根据这两个条件进行过滤:

    <select id="selectByWhere" resultMap="BaseResultMap">
        select * from user
        <where>
            <if test="password!=null">
                and password=#{password}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
        </where>
    </select>

(4)set

用于sql修改中,会自动去除掉set中的if属性中的.

    <update id="updateSet">
        update user
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="nickname!=null">
                nickname=#{nickname},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
        </set>
        where id=#{id}
    </update>

(5)foreach

可以对于传入的集合进行遍历,里面的参数如下所示:

collection:用于绑定方法参数中的集合

item:遍历时的每一个对象

open:语句块开头的字符串

close:语句块结束的字符串

separator:每次遍历之间的分隔符

示例,根据list中的id号来进行批量删除:

   
 <delete id="deleteByIds">
        delete from user where id in <foreach collection="list" open="(" close=")" separator="," item="item">
        #{item}
    </foreach>
    </delete>

标签: java eureka postman

本文转载自: https://blog.csdn.net/weixin_47651920/article/details/125024955
版权归原作者 筑梦小子 所有, 如有侵权,请联系我们删除。

“MyBatis的使用”的评论:

还没有评论