MyBatis标签及其应用示例

MyBatis标签及其应用示例

1. select

1.1 标签属性

id唯一的标识符
parameterType传给此语句的参数的全路径名或别名如:com.xxx.xxx.demo.entity.User或user
resultType语句返回值类型或别名。如果是集合List,此处填写集合的泛型T,而不是集合本身。同时,resultType 与resultMap 只能用一个。此外,

2.1 应用示例

	<select id="selectUserlist" parameterType="string" resultType="com.xxx.xxx.demo.entity.User">
	        select * from user where name = #{name}
	</select>
2.1.1 resultType到底该填啥

resultType:

基本类型resultType=‘基本类型’
List类型resultType=‘List中元素的类型即List中的T’
Map类型resultType =‘map’

2. insert

2.1 标签属性

id唯一的标识符
parameterType传给此语句的参数如 com.xxx.xxx.demo.entity.User

2.2 应用示例

2.2.1 常规应用
    <insert id="insertUser" parameterType="com.xxxx.xxxx.demo.entity.User">
        insert into user (name, age, email) values (#{name}, #{age}, #{email})
    </insert>
2.2.2 插入后返回主键

增加以下两个可以获取(获取方式:通过对象的get方法)刚刚插入数据库数据的主键如id
useGeneratedKeys=“true” 使用生成的主键
keyProperty="" 查询的主键名,主键字段对应实体类的属性,一般为id

    <insert id="insertUser" parameterType="com.xxxxx.xxx.demo.entity.User" useGeneratedKeys="true" keyProperty="id">
        insert into user (name, age, email)
        values (#{name},#{age},#{email})
    </insert>
2.2.3 插入多条数据

配合foreach标签使用:

<insert id="insertUsers" parameterType="com.xxx.xxx.demo.entity.User">
        insert into user (name, age, email)
        values 
        <foreach collection="list" item="item" separator=",">
        (#{item.name},#{item.age},#{item.email})
        </foreach>

3. delete

3.1 标签属性

id唯一的标识符
parameterType传给此语句的参数如 int

3.2 应用示例

3.2.1 删除一条记录
    <delete id="deleteUser" parameterType="integer">
        delete from user where id = #{id}
    </delete>
3.2.2 删除多条数据(批量删除)
    <delete id="deleteUsers" parameterType="integer">
        delete from user
        where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

4. update

4.1 标签属性

id唯一的标识符
parameterType传给此语句的参数如 com.xxx.xxx.demo.entity.User

4.2 应用示例

    <update id="updateUser" parameterType="com.xxx.xxx.demo.entity.User">
        update user set name=#{name},age=#{age},email=#{email} where id=#{id}
    </update>

resultMap

主要作用是为了建立SQL查询结果字段与实体属性的映射关系信息。查询的结果集转换为java对象,方便进一步操作。

PS:与java对象对应的列不是数据库中表的列名,而是查询后结果集的列名。

<resultMap id="BaseResult" type="com.xxx.xxx.demo.entity.User">
属性描述
id当前命名空间中的一个唯一标识,用于标识一个结果映射。
type类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)如: com.xxx.xxx.demo.entity.User。
autoMapping如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
extends继承其他 resultMap 标签(通常 resultMap 标签都代表了一个实体类,在多表联查时候,如果都需要配置 resultMap 的话,子类的 resultMap 就可以继承父类的 resultMap,然后父类有的那一部分属性标签(id、result标签)就不用在重写了)

id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。

    <resultMap id="BaseResult" type="com.xxx.xxx.demo.entity.User">
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="age" column="age" javaType="Integer"/>
        <result property="email" column="email" javaType="String"/>
    </resultMap>
property对应实体类的属性
column数据库中的列名,或者是列的别名
javaType对应java的数据类型,MyBatis 通常可以推断类型。如果要映射到的是 HashMap,需要明确地指定 javaType

association标签

association 标签:用于一对一、多对一场景使用

标签属性

属性描述
property配置实体类属性名
javaType指定封装结果的类型。当使用 select 属性时,无需指定关联的类型,结果会直接封装到调用的查询语句中
column配置数据库列名,搭配 select 属性使用,从第一条 SQL 中获取当前指定字段的内容,在将该内容传入 select 属性调用的 SQL 中
select使用另一个select查询封装的结果。当使用该属性时,无需配置实体类与数据库之间的映射关系

association需要我们告知MyBatis 如何加载关联。MyBatis 提供2种不同的方式加载关联:

嵌套 Select 查询通过执行另外一个 SQL 映射语句来加载期望的复杂类型
嵌套结果映射使用嵌套的结果映射来处理连接结果的重复子集
    /**
     * 通过id查询商品名记录
     * @param id
     * @return
     */
    String selectShopName(Integer id);
    /**
     * 查询符合条件的数据记录
     * @return
     */
    List<User> selectUser();
    <resultMap id="BaseResult" type="cjw.study.mybatis.demo.entity.User">
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="age" column="age" javaType="Integer"/>
        <result property="email" column="email" javaType="String"/>
        <association property="shopname" column="id" javaType="string" select="selectShopName"/>
    </resultMap>

    <select id="selectShopName" parameterType="integer" resultMap="RecordResult">
        select shopname
        from record
        <where>
            <if test="id != '' and id != null">
                id = #{id}
            </if>
        </where>
    </select>
    @Test
    public void selectUser() { 
        userMapper.selectUser();
    }
JDBC Connection [HikariProxyConnection@1131673199 wrapping com.mysql.cj.jdbc.ConnectionImpl@399ca607] will not be managed by Spring
==>  Preparing: select id, name, age, email from user
==> Parameters: 
<==    Columns: id, name, age, email
<==        Row: 7, Jack, 20, test2@baomidou.com
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 7(Integer)
<====    Columns: shopname
<====        Row: pc
<====      Total: 1
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 7(Long)
<====    Columns: id, shopname, num
<====        Row: 7, pc, 20
<====      Total: 1
<==        Row: 8, Tom, 28, test3@baomidou.com
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 8(Integer)
<====    Columns: shopname
<====        Row: ipad
<====      Total: 1
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 8(Long)
<====    Columns: id, shopname, num
<====        Row: 8, ipad, 28
<====      Total: 1
<==        Row: 9, Sandy, 21, test4@baomidou.com
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 9(Integer)
<====    Columns: shopname
<====        Row: car
<====      Total: 1
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 9(Long)
<====    Columns: id, shopname, num
<====        Row: 9, car, 21
<====      Total: 1
<==        Row: 10, Billie, 24, test5@baomidou.com
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 10(Integer)
<====    Columns: shopname
<====        Row: shoe
<====      Total: 1
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 10(Long)
<====    Columns: id, shopname, num
<====        Row: 10, shoe, 24
<====      Total: 1
<==        Row: 13, zbd, 22, cjw.163
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 13(Integer)
<====      Total: 0
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 13(Long)
<====      Total: 0
<==        Row: 14, cjw, 22, cjw.163
====>  Preparing: select shopname from record WHERE id = ?
====> Parameters: 14(Integer)
<====      Total: 0
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 14(Long)
<====      Total: 0
<==      Total: 6

collection标签

一对多,多对多是使用,即对应多条数据结果如list、map等时使用。

        <collection property="record" column="id" select="selectRecords" ofType="com.xxx.xxx.demo.entity.Record"/>

collection 标签属性:

属性描述
property实体类属性名
select使用另一个select查询封装的结果。当使用该属性时,便不需要在配置实体类与数据库之间的映射关系了
column为数据库中的列名,与select配合使用
ofType指定集合中的泛型信息 ofType = List中的T

比如select查询条件为id = #{id},则设置colunm = ‘id’。找到购买人与商品的关系,查询商品表中对应的购买人id。

    /**
     * 根据id查询对应的记录
     * @return
     */
    List<Record> selectRecords(Integer id);
        /**
     * 查询符合条件的数据记录
     * @return
     */
    List<User> selectUser();
    <resultMap id="BaseResult" type="com.xxx.xxx.demo.entity.User">
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="age" column="age" javaType="Integer"/>
        <result property="email" column="email" javaType="String"/>
        <collection property="record" column="id" select="selectRecords" ofType="com.xxx.xxx.demo.entity.Record"/>
    </resultMap>

    <resultMap id="RecordResult" type="com.xxx.xxx.demo.entity.Record">
        <id property="id" column="id" javaType="Integer"/>
        <result property="shopname" column="name" javaType="String"/>
        <result property="num" column="age" javaType="Integer"/>
    </resultMap>

    <sql id="RecordCol">
        id, shopname, num
    </sql>
    
    <select id="selectRecords" resultMap="RecordResult">
        select <include refid="RecordCol"></include>
        from record
        <where>
            <if test="id != '' and id != null">
                id = #{id}
            </if>
        </where>
    </select>
    @Test
    public void selectUser() { 
        userMapper.selectUser();
    }
JDBC Connection [HikariProxyConnection@1141984159 wrapping com.mysql.cj.jdbc.ConnectionImpl@76bf1bb8] will not be managed by Spring
==>  Preparing: select id, name, age, email from user
==> Parameters: 
<==    Columns: id, name, age, email
<==        Row: 7, Jack, 20, test2@baomidou.com
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 7(Long)
<====    Columns: id, shopname, num
<====        Row: 7, pc, 20
<====      Total: 1
<==        Row: 8, Tom, 28, test3@baomidou.com
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 8(Long)
<====    Columns: id, shopname, num
<====        Row: 8, ipad, 28
<====      Total: 1
<==        Row: 9, Sandy, 21, test4@baomidou.com
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 9(Long)
<====    Columns: id, shopname, num
<====        Row: 9, car, 21
<====      Total: 1
<==        Row: 10, Billie, 24, test5@baomidou.com
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 10(Long)
<====    Columns: id, shopname, num
<====        Row: 10, shoe, 24
<====      Total: 1
<==        Row: 13, zbd, 22, cjw.163
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 13(Long)
<====      Total: 0
<==        Row: 14, cjw, 22, cjw.163
====>  Preparing: select id, shopname, num from record WHERE id = ?
====> Parameters: 14(Long)
<====      Total: 0
<==      Total: 6

foreach

foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。

collectioncollection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合
item表示在迭代过程中每一个元素的别名
index表示在迭代过程中每次迭代到的位置(下标)
open前缀
close后缀
separator分隔符,表示迭代时每个元素之间以什么分隔

foreach 通常可以将之用到批量删除、添加等操作中。

    <insert id="insertUsers" parameterType="com.xxxx.xxx.demo.entity.User">
        insert into user (name, age, email)
        values <foreach collection="list" item="item" separator=",">
        (#{item.name},#{item.age},#{item.email})
    </foreach>

    <delete id="deleteUsers" parameterType="integer">
        delete from user
        where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

sql和include

sql用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。

include表示引用sql标签,作为sql一部分。

	<include refid="sqlvalues"></include>

sql常见的几种用法:

1. 静态写法
    <sql id="userCol">
        id, name, age, email
    </sql>
    
    <select id="selectUser" resultMap="BaseResult">
        select
        <include refid="userCol"></include>
        from user
    </select>
2. 动态加载写法
	<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>
	
	<sql id="sometable">
	  ${prefix}Table
	</sql>
	<sql id="someinclude">
	  from
	    <include refid="${include_target}"/>
	</sql>
	
	<select id="select" resultType="map">
	  select
	    field1, field2, field3
	  <include refid="someinclude">
	    <property name="prefix" value="Some"/>
	    <property name="include_target" value="sometable"/>
	  </include>
	</select>

动态标签

主要搭配顶级标签使用,实现将映射的 SQL 语句动态化。
if、 where、trim、set、 foreach、choose、bind

if 标签

作用:动态拼接
类似 Java 中的 if 语句,符合判断条件的便执行指定内容,否则跳过判断。

/* 
@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),
作为实体层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应
*/
	List<User> selectUsers(@Param("cjw") Integer id);

	<select id="selectUsers" parameterType="integer" resultType="com.xxx.xxx.demo.entity.User">
        select * from user where 1=1
        <if test="cjw > 10 and cjw != ''">
            id = #{cjw}
        </if>
    </select>

where 标签

where标签可以去除多余的 where,作为sql的条件语句。

当使用 if 标签进行动态 SQL 拼接时,如果 if 标签的判断条件不满足的话,便不拼接 if 标签中的内容,这便导致了 SQL 语句的 where 子句缺失,造成 SQL 错误。使用 where 标签便可以解决上述问题,使用 where 标签将 if 标签包裹起来,当 if 标签的判断条件不满足,动态 SQL 不拼接时,便不会向 SQL 语句中插入 where 子句,从而避免该错误。

因为有 where 就必须有查询条件,如果没有便会报错,所以加上 1=1条件。
在这里插入图片描述

    /**
     * 使用mybatis的where标签实现查询select数据
     * @param id
     * @return
     */
    List<User> selectUsersbyWhere(@Param("cjw") Integer id);
	<select id="selectUsersbyWhere" parameterType="integer" resultType="com.xxx.xxx.demo.entity.User">
        select * from user
        <where>
            <if test="cjw > 1 and (cjw != '' or cjw != null)">
                id = #{cjw}
            </if>
        </where>
    </select>
    @Test
    public void selectUsersbyWhere() {
        userMapper.selectUsersbyWhere(9);
    }
JDBC Connection [HikariProxyConnection@1201324747 wrapping com.mysql.cj.jdbc.ConnectionImpl@220c9a63] will not be managed by Spring
==>  Preparing: select * from user WHERE id = ?
==> Parameters: 9(Integer)
<==    Columns: id, name, age, email, creattime, updatetime
<==        Row: 9, Sandy, 21, test4@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==      Total: 1

set标签

用于动态包含需要更新的列,忽略其它不更新的列。该标签会动态地在行首插入 SET 关键字,并会删掉额外的逗号(逗号是使用if标签给列索引赋值时引入的)

     /**
     * 使用mybatis的set标签实现更新update数据
     * @param user
     */
	void updateUserbyUseSet(User user);
    <update id="updateUserbyUseSet" parameterType="com.xxx.xxx.demo.entity.User">
        update user
        <set>
            <if test="name !='' and name != null">name = #{name},</if>
            <if test="age !='' and age != null">age = #{age},</if>
            <if test="email !='' and email != null">email = #{email}</if>
        </set>
        where id = #{id}
    </update>
    @Test
    public void updateUserbyUseSet() {
        User user = new User();
        user.setId(14);
        user.setName("cjw");
        //这里我们不给他传age,看看set能不能实现动态更新数据
//        user.setAge(26);
        user.setEmail("cjw.163");
        userMapper.updateUserbyUseSet(user);
    }
JDBC Connection [HikariProxyConnection@1654228203 wrapping com.mysql.cj.jdbc.ConnectionImpl@7b1e5e55] will not be managed by Spring
==>  Preparing: update user SET name = ?, email = ? where id = ?
==> Parameters: cjw(String), cjw.163(String), 14(Integer)
<==    Updates: 1

age没传,也就是不更新,mybatis的set标签自动识别需要更新的数据,并去除所带的逗号。


trim标签

trim标签可替代where和set标签,也可以在特定业务场景实现一些功能。

	<trim prefix="where | set" prefixOverrides="AND | OR | ,">
	  ...
	</trim>
属性描述
prefix给sql语句拼接的前缀
suffix给sql语句拼接的后缀
prefixOverrides去除sql语句前面的关键字或者字符,该关键字或者字符
suffixOverrides去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

trim实现where标签

    /**
     * 使用mybatis的trim标签实现where标签的功能进而实现查询select数据
     * @param id
     * @param name
     * @return
     */
    List<User> selectUsers(@Param("cjw") Integer id, String name);
    <trim prefix="where" prefixOverrides="and">
        <if test="cjw > 1 and (cjw != '' or cjw != null)">
            id = #{cjw}
        </if>
        <if test="name != null and name != ''">
            and name = #{name}
        </if>
    </trim>

PS:cjw是mapper层设置的@Param(“cjw”)有关

    @Test
    public void selectUsers() {
        userMapper.selectUsers(9, "");
    }
JDBC Connection [HikariProxyConnection@116155384 wrapping com.mysql.cj.jdbc.ConnectionImpl@66223d94] will not be managed by Spring
==>  Preparing: select * from user where id = ?
==> Parameters: 9(Integer)
<==    Columns: id, name, age, email, creattime, updatetime
<==        Row: 9, Sandy, 21, test4@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==      Total: 1

trim实现set标签

     /**
     * 使用mybatis的trim标签实现set标签的功能进而实现更新update数据
     * @param user
     */
    void updateUserbyUseTrim(User user);
    @Test
    public void updateUserbyUseTrim() {
        User user = new User();
        user.setId(13);
        user.setName("zbd");
//        user.setAge(26);
        user.setEmail("cjw.163");
        userMapper.updateUserbyUseTrim(user);
    }
JDBC Connection [HikariProxyConnection@116155384 wrapping com.mysql.cj.jdbc.ConnectionImpl@66223d94] will not be managed by Spring
==>  Preparing: update user set name = ?, email = ? where id = ?
==> Parameters: zbd(String), cjw.163(String), 13(Integer)
<==    Updates: 1

choose、when、otherwise标签

从多个条件中选择一个(即使多个符合也只执行一个)使用。针对这种情况,MyBatis 提供了 choose标签,类似 Java 的 switch 语句。

    /**
     * mybatis的choose标签实现条件查询select数据
     * @param user
     * @return
     */
    List<User> selectUserbyChoose(Userdto user);
    <select id="selectUserbyChoose"  parameterType="com.xxx.xxx.demo.entity.dto.Userdto" resultType="com.xxx.xxx.demo.entity.User">
        select * from user
        <where>
        <choose>
            <when test="age != '' and age != null">
                age <![CDATA[ <= ]]> #{age}
            </when>
            <when test="name != '' and name != null">
                and name like concat('%',#{name},'%')
            </when>
            <otherwise>
                and id <![CDATA[ <= ]]> #{id}
            </otherwise>
        </choose>
        </where>
    </select>
    @Test
    public void selectUserbyChoose() {
        Userdto user = new Userdto();
        user.setName("c");
        user.setAge(26);
        user.setId(10);
        userMapper.selectUserbyChoose(user);
    }
JDBC Connection [HikariProxyConnection@1713520020 wrapping com.mysql.cj.jdbc.ConnectionImpl@2bc7db89] will not be managed by Spring
==>  Preparing: select * from user WHERE age <= ?
==> Parameters: 26(Integer)
<==    Columns: id, name, age, email, creattime, updatetime
<==        Row: 7, Jack, 20, test2@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==        Row: 9, Sandy, 21, test4@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==        Row: 10, Billie, 24, test5@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==        Row: 13, zbd, 22, cjw.163, 2023-01-22 17:42:20, 2023-01-24 13:39:46
<==        Row: 14, cjw, 22, cjw.163, 2023-01-22 17:42:20, 2023-01-24 13:25:09
<==      Total: 5

注意:如果同时符合多个when标签,则穿透执行最后一个符合的when标签,when标签都不符合,则执行otherwise标签;
一般使用choose时,传值较多可采用dto传值的方式。

MyBatis标签实现like模糊查询

    /**
     * mybatis标签实现模糊查询select数据
     * @param name
     * @return
     */
    List<User> selectUserlike(String name);
    <select id="selectUserlike"  resultType="com.先xxx.xxx.demo.entity.User">
    select * from user
    <where>
        <if test="name != '' and name != null">
            name like concat('%',#{userName},'%')
        </if>
    </where>
    </select>
    @Test
    public void selectUserlike() {
        //查询当前数据库中name中包含c的记录
        userMapper.selectUserlike("c");
    }
JDBC Connection [HikariProxyConnection@1276991949 wrapping com.mysql.cj.jdbc.ConnectionImpl@76cf841] will not be managed by Spring
==>  Preparing: select * from user WHERE name like concat('%',?,'%')
==> Parameters: c(String)
<==    Columns: id, name, age, email, creattime, updatetime
<==        Row: 7, Jack, 20, test2@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==        Row: 14, cjw, 22, cjw.163, 2023-01-22 17:42:20, 2023-01-24 13:25:09
<==      Total: 2

MyBatis特殊字符转义

MyBatis在解析XML文件时会将5种特殊字符进行转义,分别是

&<>, “, ‘, 

当不希望语法被转义时就需要进行特殊处理时,使用

<![CDATA[ 特殊字符写这里边 ]]>
如:小于等于 <![CDATA[ <= ]]>

标签来包含特殊字符,也可以使用XML转义序列来表示特殊字符。

直接写 <= 会报错:

Cause: org.xml.sax.SAXParseException; lineNumber: 117; columnNumber: 22; 元素内容必须由格式正确的字符数据或标记组成。
    /**
     * MyBatis特殊字符转义查询年龄小于等于21的数据记录
     * @param age
     * @return
     */
    List<User> selectUserbyage(Integer age);
    <select id="selectUserbyage"  parameterType="integer" resultType="com.xxx.xxx.demo.entity.User">
        select * from user
        <where>
            <if test="age != '' and age != null">
                age <![CDATA[ <= ]]> #{age}
            </if>
        </where>
    </select>
    @Test
    public void selectUserbyage() {
        userMapper.selectUserbyage(21);
    }
JDBC Connection [HikariProxyConnection@1276991949 wrapping com.mysql.cj.jdbc.ConnectionImpl@76cf841] will not be managed by Spring
==>  Preparing: select * from user WHERE age <= ?
==> Parameters: 21(Integer)
<==    Columns: id, name, age, email, creattime, updatetime
<==        Row: 7, Jack, 20, test2@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==        Row: 9, Sandy, 21, test4@baomidou.com, 2023-01-22 15:36:45, 2023-01-22 15:36:45
<==      Total: 2

注意: 在CDATA内部的所有内容都会被解析器忽略,保持原貌。所以在Mybatis配置文件中,要尽量缩小 <![CDATA[ ]]>的作用范围,避免sql标签无法解析的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/276936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣:968. 监控二叉树(贪心,二叉树)

题目&#xff1a; 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&…

Oracle 学习(2)

过滤和排序数据 where条件过滤 日期格式 查询10号部门的员工信息&#xff1a;SQL> select * from emp where deptno10 查询”KING”的信息&#xff1a;SQL> select * from emp where ename KiNg 未选定行。 注意&#xff1a;字符串大小写敏感。 SQL> selec…

Oracle数据库导入csv 文件

Oracle数据库导入csv 文件

锐捷路由小型综合实验

一、实验拓扑 二、实验目的 1、熟练掌握ospf的配置 2、熟练掌握RIP的配置 3、熟练掌握静态路由的配置 4、熟练掌握各种路由协议之间的引入 5、熟练掌握telnet和ssh的配置 三、实验配置 R1 //配置telent username admin password admin123 enable password admin123 enable…

【iOS安全】越狱iOS安装Frida | 安装指定版本Frida

越狱iPhone安装Frida 本文的方法适用于已越狱的iPhone手机 打开Cydia&#xff0c;软件源&#xff0c;编辑&#xff08;右上角&#xff09;&#xff0c;添加&#xff08;左上角&#xff09;&#xff1a;https://build.frida.re 然后搜索Frida&#xff0c;点击安装 参考&#x…

嵌入式Linux:提升VMware虚拟机运行速度的方法

使用虚拟机运行Linux操作系统通常会比在物理机上直接安装系统的运行效率更低&#xff0c;本篇博文将介绍如何优化虚拟机的设置&#xff0c;进而提升虚拟机性能体验。 第1步&#xff1a;选择VMware菜单&#xff1a;编辑–>首选项–>更新&#xff0c;将”启动时检查产品更新…

如何应对人工智能时代下的网络与数据安全威胁

2023&#xff08;第四届&#xff09; 网络法治论坛 ——人工智能时代的网络与数据治理暨公益大讲堂于2023年12月23日在北方工业大学&#xff08;石景山晋元庄路5号院&#xff09;学生服务中心四层报告厅成功举办。网络法治论坛是在北京市法学会指导下的&#xff0c;由北京市网络…

uniapp中uview组件库的Search 搜索 的用法

目录 基本使用 #设置输入框形状 #是否开启清除控件 #是否开启右边控件 #自定义样式 API #Props #Events 基本使用 通过placeholder参数设置占位内容通过v-model双向绑定一个变量值&#xff0c;设置初始化时搜索框的值&#xff0c;如果初始内容为空&#xff0c;那么请绑…

Stage 模型

目录 1. 基本概念2. 应用及组件配置2.1 工程级目录2.2 模块级目录2.3 app.json5 全局配置文件2.4 module.json5 模块配置文件2.5 main_pages.json 页面路径配置文件 3.UIAbility生命周期4.页面及组件生命周期5.UIAbility的启动模式 1. 基本概念 FA模型&#xff1a;HarmonyOS早…

可以打印含图片的Word文件,不能直接打图片,怎么办

昨天在公司&#xff0c;有人问我打印一个图片。我自信满满&#xff1a;绝对可以&#xff01;因为这个打印机是我上周亲手联通&#xff0c;至少两个人安装成功&#xff0c;打印成功。 现实是&#xff0c;图片无法打印。试了几次没用。于是我打开WORD&#xff0c;插入图片后再打印…

Pytest fixture 及 conftest详解!

前言 fixture是在测试函数运行前后&#xff0c;由pytest执行的外壳函数。fixture中的代码可以定制&#xff0c;满足多变的测试需求&#xff0c;包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在&#xff0c;类似u…

Java连接Mysql报错:javax.net.ssl.SSLException: Received fatal alert: internal_error

大致报错日志如下&#xff1a; The last packet successfully received from the server was 11 milliseconds ago. The last packet sent successfully to the server was 10 milliseconds ago.at sun.reflect.GeneratedConstructorAccessor275.newInstance(Unknown Source)…

信息泄露总结

文章目录 一、备份文件下载1.1 网站源码1.2 bak文件泄露1.3 vim缓存1.4 .DS_Store 二、Git泄露2.1 git知识点2.1 log2.2 stash 三、SVN泄露3.1 SVN简介3.2 SVN的文件3.3 SVN利用 四、Hg泄露 一、备份文件下载 1.1 网站源码 常见的网站源码备份文件后缀&#xff1a; tartar.gz…

经典目标检测YOLO系列(一)复现YOLOV1(2)反解边界框及后处理

经典目标检测YOLO系列(一)复现YOLOV1(2)反解边界框及后处理 在上个博客&#xff0c;我们提出了新的YOLOV1架构&#xff0c;这次我们解决前向推理过程中的两个问题。 经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构 1、边界框的计算 1.1 反解边界框公式的改变 1.1.1 原版…

机器学习三要素与拟合问题

1.如何构建机器学习模型&#xff1f; 机器学习工作流程总结 1.获取数据 2.数据基本处理 3.特征工程 4.机器学习(模型训练) 5.模型评估 结果达到要求&#xff0c;上线服务&#xff0c;没有达到要求&#xff0c;重新上面步骤 我们使用机器学习监督学习分类预测模型的工作流…

计算机网络:知识回顾

0 本节主要内容 问题描述 解决思路 1 问题描述 通过一个应用场景来回顾计算机网络涉及到的协议&#xff08;所有层&#xff09;。如下图所示场景&#xff1a; 学生Bob将笔记本电脑用一根以太网电缆连接到学校的以太网交换机&#xff1b;交换机又与学校的路由器相连&#xf…

ubuntu 开机自报IP地址(用于无屏幕小车-远程连接)

目录 1.环境安装2.代码3.打包成可执行文件4.开启开机自启 1.环境安装 sudo apt-get install espeak #先安装这个库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyttsx32.90 #再安装pyttsx3 pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/si…

了解.NET 通用主机

写在前面 .NET 通用主机负责应用启动和生存期管理&#xff0c;主机是封装应用资源和生存期功能的对象&#xff0c;通用主机可用于其他类型的 .NET 应用程序&#xff0c;如控制台应用&#xff1b;.NET 通用主机基于类库Microsoft.Extensions.Hosting 来实现&#xff0c;本文记录…

labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串 LeetCode 83 删除排序链表中的重复元素 2023.12.28 题目链接labuladong讲解[链接] ListNode* deleteDuplicates(ListNode* head) {/*暴力求解ListNode* cur new ListNode();ListNode* prenode cur;cur->next head;cur cur->next;while(cu…

dart 学习 区分好setter,getter和一般的函数

看看代码可以很好的分析 setter &#xff0c;getter 和普通的函数有什么区别 void main() {car a new car("奔驰", 12);print(a.name);a.age 100;print(a.age);a.setname "宝马"; // 调用 setterprint(a.getage); // 调用gettera.setter("雷克萨斯…