admin 管理员组

文章数量: 887021

【MyBatis】

文章目录

    • MyBatis的简介:
    • 测试类:xml工厂
    • 表名报红的解决办法:
    • Mapper代理开发
    • MyBatis主配置文件:
    • MyBatisX(小鸟标识)的插件:
    • 优化mapper.xml文件
    • 一、配置文件完成增删改查的操作
      • 查询-查看详情:
          • 关于#{}、${}:
          • sql中关于特殊字符处理:>、<
          • sql片段:
      • 条件查询:
        • 1.多条件查询
        • -----test测试类(三种)------
        • 2.多条件-动态条件查询(动态sql)
        • 3.单条件-动态条件查询(下拉框选择条件)
      • 添加功能
        • 1.添加:
        • 2.主键返回:
      • 修改
        • 修改全部字段:
        • 修改动态字段<set>(只修改部分字段):
      • 删除
        • 删除单个:
        • 批量删除<foreach>:
      • MyBatis参数传递
        • 1.分析参数在MyBatis底层的封装结构:
        • 2.分析单个参数:
    • 二、注解完成增删改查

MyBatis的简介:

myatis中文版官网:.html
图1:

图2:

测试类:xml工厂

  • 1.加载mybatis的核心配置文件,获取SqlSessionFactory
  • 2.获取Sqlsession对象,用它来执行sql
  • 3.执行sql
  • 4.关闭资源

表名报红的解决办法:

解决一下mapper.xml里面sql,表名报红的解决办法(报红原因是不识别数据库,没有表名):

大图:

Mapper代理开发


MyBatis主配置文件:

  • environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的数据源environment
  • 别名typeAliases

    在映射文件那里的返回数据类型就可以简化(不区分大小写):看官网

    注意:核心配置文件是有顶层结构的,配置各个标签时,遵循前后顺序

MyBatisX(小鸟标识)的插件:

  • MybatisX是一款基于IDEA的快速开发插件,为效率而生
  • 主要功能:
    - XML和接口方法 相互跳转
    - 根据接口方法生成statement(mapper里面的sql叫做statement)
  • 安装:

增删改查两种方式:1.配置文件完成增删改查 2.注解完成增删改查

优化mapper.xml文件

▶不一样的列名起别名,别名和实体类的名字一样就可以

▶使用sql片段

▶使用映射resultMap

  • id:唯一标识
  • type:映射的类型,支持别名

resultMap有两种:

  • id:完成主键字段的映射
  • result:完成一般字段映射
  • 它们的column:数据库对应字段;property:实体类属性

一、配置文件完成增删改查的操作

查询-查看详情:

  • 查询所有信息返回 List<实体类>
  • 查询单个信息的详情返回对象
关于#{}、${}:
  1. #{}:会将执行的sql中的#{}为?,为了防止sql注入
    • #{}里面的参数一般和接口里面的方法参数保持一致即可
  2. ${}:拼接sql,会存在SQL注入问题
  3. 使用时机:
    • 参数传递的时候用#{}
    • 表名或者列名不确实的情况下${}
sql中关于特殊字符处理:>、<


sql片段:
<!--建立sql片段:id命名-->
<sql id="query_user">name,sex,age……
</sql>
<!--使用include标签插入片段,refid与id命名一致-->
SELECT <include refid="query_user"/>
FROM 表名 
where 条件(条件过多,重复使用也可以用sql片段)

条件查询:

1.多条件查询

SQL语句设置多个参数有几种方式?
1)散装参数:需要使用@Param(“sQL中的参数占位符名称”)
2)实体类封装参数:只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
3) map集合:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功

-----test测试类(三种)------

方法一:

方法二:放入一个对象中

方法三:Map集合,put(“xxx”, xxx)的键值与sql中的#{}中的对应

三个方法的执行结果:

2.多条件-动态条件查询(动态sql)

动态sql:
在sql中加 执行用于判断参数是否有值;注意test属性里面用 逻辑运算符and 连接多个条件,符号&&不可用。

问题解决:

  • 1.恒等式解决:
  • 2.标签

3.单条件-动态条件查询(下拉框选择条件)


问题:
当一个条件都不选择,对象里面传的空的,会报错,使用otherwise解决,如图:

方法一:when后面在添加otherwise标签

方法二:使用where标签包裹choose

添加功能

1.添加:


MyBatis事务:
数据库没有添加成功数据,数据回滚,数据库没添加上。

处理:

2.主键返回:

上个例子,brand.add(对象); 在通过对象获取数据getXxx(); 打印syso(),主要是返回id,上面的添加完成并不能获取新添加数据的id。一些场景:一个订单对应多个订单项,订单主键是订单项的外键。

修改

修改全部字段:

修改动态字段(只修改部分字段):

如果只修改部分字段,上个方法会将其他未修改字段变为null,解决:
加判断,并且使用标签,不再使用set关键字:避免末尾逗号的控制和都没修改的时候多余关键字set。

删除

删除单个:

删除要接收参数id

批量删除:

  • 提交多个id到后台到数据库去删除,将id们封装成一个数组,方法不需要返回值

  • 使用标签遍历数组中有几个id,每个id直接要用逗号隔开,使用关键字 separator
    注意1:

  • mybatis会将数组参数,封装为一个Map集合

    • 默认:key=array,值=数组,即array=数组,所以collection的值默认为array
    • 如果想改变,则接口处用@Param注解命名,在collection处使用
//接口
//public void deleteById(int[] ids);
public void deleteById(@Param("ids") int[] ids);
//mapper.xml
<delete>delete from 表名 where idin(//<foreach collection = "array" items="id">#{id}</foreach ><foreach collection = "ids" items="id">#{id}</foreach >);
</delete>

正确显示:

<delete id="deleteByIds">delete from tb_brand where idin<foreach collection="ids" item="id" separator=","  open=" ("  close=")" >#{id}</foreach>
</delete>

MyBatis参数传递

MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式

  • 单个参数:POJO类型、Map集合、Collection、List、Array……
  • 多个参数:要使用@Param注解去定义名称与占位符名称保持一致。
    例如:

1.分析参数在MyBatis底层的封装结构:

★多个参数:MyBatis将参数封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。
内部:

map.put("arg0",参数值1);
map.put("param1",参数值1);
map.put("param2",参数值2);
map.put("arg1",参数值2);

直接使用:


若不使用@Param注解,也不使用内部参数,会报错提示:可用参数是……如图

在此是因为MyBatis提供了一个ParamNameResolver.java类来进行参数封装
ParamNameResolver类有getNameParams()的方法:

内部执行结果(此时例子中是有两个参数String username= “zhangsan”, String userpwd = “123”):

@Param的作用:

2.分析单个参数:

★单个参数:

  • POJ0类型::直接使用,实体类属性名 和 sql中参数占位符 名称一致
  • Map集合:直接使用,键名 和 参数占位符 名称一致
  • Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。
map.put("arg0", collection()集合);
map.put("collection", collection集合);
  • List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。
map.put("arg0", list()集合);
map.put("collection", list集合);
map.put("list", list集合);
  • Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。
map.put("arg0", 数组);
map.put("array", 数组);
  • 其他类型:直接使用

    总结:

二、注解完成增删改查

  • 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句, Java 注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此, 如果你需要做一些很复杂的操作,最好用XML来映射语句。
  • 选择何种方式来配映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说, 永远不要拘泥于一种方式, 你可以很轻松的在基于注解和XML的语句映射方式间自由移植和切换。

本文标签: Mybatis