• 11.18MyBatis 学习2


    1 #和$的区别

    #{}表示一个占位符号 

    • 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
    • #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。
    • 可以自动对值添加 ’ ’ 单引号

    ${}表示拼接 sql 串

    • 通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,
    • ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
    • 比如order by id  这种的,以id排序  那么这个id 是没有单引号的,就是简单的SQL拼接,所以我们应该使用${} 而不是#{}

    多个参数

    当我涉及到多个参数传参的时候,这个时候,我们直接使用变量名会发现控制台有错误提示

     Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]说

    这个使用我们也需要通过@Param的注解来解决这个问题  

      int update(@Param("addr") String addr, @Param("id")int id);

    2 paramerterType 和 resultType

    paramerterType  参数类型

    之所以我们可以直接写类名的原因就是因为这些这些常用类型,mybatis已经帮我们配置好了别名。下图是类型对照说明。

    针对于实体类,我们如果也想用简写,就需要我们自己去配置别名了。

    resultType 结果集的类型 

    设置包 下所有实体类的别名,别名就是类名

         <package name="com.example.mybatisIone.entity"/>

    resultMap    匹配数据规则

    多个单词往往是用_连接,但是在实体类中的属性往往采用小驼峰的方式命名。这就导致字段名无法对应上,这个时候我们就需要配置resultMap来解决这个问题了。

    通过resultMap,我们可以指定查询结果字段和实体属性字段的映射关系。

    1. <resultMap id="userResult" type="User">
    2. <id column="id" property="id" />
    3. <result property="nickname" column="nickname" />
    4. <result property="schoolName" column="school_name" />
    5. property 对应的是实体类 column 对应的是数据库
    6. </resultMap>

    mybatis-config.xml   中mappers标签中的mapper

    Resource  使用相对于类路径的资源如:一劳永逸

    class  使用 mapper 接口类路径如:

    注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中,这里如果希望能够扫描到包下面的xml文件的话,需要在maven中进行配置。

    • package  注册指定包下的所有 mapper 接口如:

    需要在maven中进行配置如下

    1. src/main/java
    2. **/*.properties
    3. **/*.xml
    4. false
    5. src/main/resources

    动态sql

    if

    1. id= 方法名
    2. parameterType=方法返回的实体类
    3. resultMap=结果集

     where 标签解决了两个问题

    解决了两个问题

    1.去掉第一个遇到的and

     2.当where标签内为空时,会自动去掉自己where

    set标签解决了一个问题带来一个问题

     解决问题

     1.set标签帮咱们去掉了最后一个,

     带来了一个问题

    1.当标签内部为空时,把自己去掉了,带来了语法错误

    1. "updateNickname">
    2. update t_user
    3. <if test="nickname != null and nickname != ''">
    4. nickname = #{nickname},
    5. if>
    6. <if test="username != null and username != ''">
    7. username = #{username},
    8. if>
    9. where id = #{id}

    foreach

    属性说明

    • collection 需要遍历的列表
    • item 每一项的形参名
    • index 每一项索引名
    • separtor 分隔符
    • open 开始符号
    • close 关闭符号
    1. "insertB" parameterType="Address">
    2. insert into t_address(addr,phone,postcode)values
    3. "addressList" item="eve" index="index" separator=",">
    4. (#{eve.addr},#{eve.phone},#{eve.postcode})

    使用foreach批量添加代码如下

    1. "insertB" parameterType="Address">
    2. insert into t_address(addr,phone,postcode)values
    3. "addressList" item="eve" index="index" separator=",">
    4. (#{eve.addr},#{eve.phone},#{eve.postcode})

    in 查询

    联查


    在项目中,某些实体类之间肯定有关联关系,比如一对一,一对多等,在mybatis 中可以通过association和collection,来处理这些关联关系。

    1 对 1  关系
    在实现1对1映射的时候,可以通过association属性进行设置。在这里有三种方式

    在地址表中,每个地址对应有一个创建用户,每次查询地址的时候希望查询到创建用户的内容

    第一种:使用select

    1. <resultMap id="address" type="Address">
    2. <id column="id" property="id" />
    3. <association property="user" column="user_id" javaType="User" select="com.tledu.erp.dao.IUser2Dao.selectById"/>
    4. resultMap>

    第二种:直接进行联查,在association中配置映射字段

    1. <resultMap id="adderandmap" type="AdderAndUser" autoMapping="true">
    2. <id property="id" column="id"/>
    3. <result property="userId" column="user_id"/>
    4. <association property="user" javaType="User" autoMapping="true">
    5. association>
    6. resultMap>

    第三种:嵌套的resultType

    1. <resultMap id="adderandmap2" type="AdderAndUser" autoMapping="true">
    2. <id property="id" column="id"/>
    3. <result property="userId" column="user_id"/>
    4. <association property="user" javaType="User" autoMapping="true" resultMap="qwe"/>
    5. resultMap>
    6. <resultMap id="qwe" type="User" autoMapping="true">
    7. resultMap>

  • 相关阅读:
    DAG 的深度优先搜索标记
    git入门
    Python操作MySQL数据库—pymysql库(可直接使用的模板通用操作)
    spark调优案例分享
    Pintia(拼题A)刷题插件 on VS Code
    【刷题笔记10.5】LeetCode:排序链表
    一文搞定Pandas核心概念之Series
    C++自学精简教程 目录(必读)
    Web 前端基础操作小结
    ctfshow web入门 php特性 web131-web135
  • 原文地址:https://blog.csdn.net/Javaxinshoulllll/article/details/127916636