• mybatis-03


    mybatis-03

    1、mybatis的别名【两种】
    在MyBatis中可以为变量类型定义别名。简化映射文件的定义,在核心配置文件中定义的别名。
    别名应用:MyBatis框架先将resultType定义忽略大小写,作为类型的完全命名,查找类型,如果类型不存在,则检索别名定义, 如果别名定义不存在,抛出异常。
    mybatis的别名使用步骤
    ①mybatis总体配置文件里配置别名标签 typeAliases
    <!-- 配置别名 -->
    <typeAliases>
      <!-- <typeAlias type="com.boom.pojo.User" alias="user"/> -->
      <package name="com.boom.pojo"/>
    </typeAliases>
    ②mapper映射文件里resultType需要注意写法
    typeAlias配置别名,resultType需要跟alias对应
    package配置别名,扫描的是包,resultType需要些对应的实体类的类名
    <select id="selectById" parameterType="int" resultType="User">
      select * from user where userid=#{userid}
    </select>
    2、mybatis返回值类型
    就是查询语法处理结果集行数据的方式,就是select标签的resultType属性.
    2.1 简单类型
    八种基本类型,包装类型,String。代表只处理结果集行数据中的第一个字段。常用于处理数据量查询语法: select username from student
    2.2 自定义类型
    自定义的java对象类型.将结果集中的行数据,封装成对应对象,并返回。最常用的返回结果类型.
    <!-- 返回的结果集只对姓名做映射 -->
    <select id="selectById2" parameterType="int" resultType="string">
      select username from user where userid=#{userid}
    </select>
    2.3 map集合类型
      Map集合对象:将结果集的行数据封装为一个Map类型的对象,字段名作为key,字段值作为value。最通用的返回结果类型。可以处理部分字段查询,多表联合查询,符合查询等,对应复杂查询语法。
    <!-- map -->
    <select id="selectByAll" parameterType="int" resultType="map">
      select * from user
    </select>
    3、【mapper动态构建】
      只定义接口和SQL映射文件,不编写DAO实现类型。通过遵循MyBatis定义规范,实现动态的DAO接口实现类构建。MyBatis在定义数据访问接口的时候, 在包的命名上有特有习惯.习惯是: xxx.mapper。
    必要规范:
    ①mybatis做动态绑定的时要求接口的名称要和被绑定的映射文件名称必须一致

    ②要求映射文件的命名空间(namespace)与接口的全限定名完全一致

    ③要求标签的ID值,和对应的接口方法命名完全一致

    ④总体配置文件里管理映射用package【核心配置文件中一次性读取所有的SQL映射文件】
    <mappers>
      <package name="com.boom.mapper"/>
    </mappers>
    ⑤调用的API发生了变化拿到session调用getMapper
    SqlSession session = MybatisUtil.openSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    System.out.println(mapper.selectById(1));
    4、mybatis动态SQL
    1)if标签(用于判断的标签)
    语法:<if test=”布尔表达式”>
    应用限制:布尔表达式中使用的变量命名,必须是自定义类型属性或Map的key
    if条件判断的运算符写法:
    大于 gt     小于lt     等于eq
    大于等于gte  小于等于lte   不等于neq 
    也可直接写:>、<、>=、<=、 !=

     1 <!-- 根据不同条件进行不同的查询 -->
     2 <select id="selectByproPerties" resultType="User">
     3     select * from user where 1=1
     4     <if test="userid !=null">
     5         and userid = #{userid}
     6     </if>
     7     <if test="username != null and username.length() > 0">
     8         and username = #{username}
     9     </if>
    10     <if test="userage != null">
    11         and userage = #{userage}
    12     </if>
    13 </select>
    mapper.xml
    1 //根据不同条件进行不同的查询
    2 User user = new User();
    3 user.setUserage(18);
    4 user.setUsername("小红");
    5 List<User> list = mapper.selectByproPerties(user );
    6 for (User users : list) {
    7     System.out.println(users);
    8 }
    TestMapper.java

    动态SQL主要看控制台打印的日志记录

    2)where标签
    用于定义where条件查询子句的标签
    语法:<where>定义标签或SQL语法</where>
    应用特性:会根据标签体内容,决定是否增加where子句, 如果标签体中有内容,增加where查询子句。如果标签体无内容,不增加where查询子句。 在where标签拼接查询子句条件的时候,,会检查第一个查询条件,且只检查第一个查询条件。检查查询条件前是否有and或or关键字,如果有关键字,删除.。如果没有关键字,不做任何操作。
    特点:如果在mapper.xml中不写where 1=1,查询语句也会自动拼接where 1=1,如果给定条件,where标签会在SQL语句中拼接成大写的WHERE

     1 <select id="selectByproPerties_where" resultType="User">
     2     select * from user
     3         <where>
     4         <if test="userid !=null">
     5             and userid = #{userid}
     6         </if>
     7         <if test="username != null and username.length() > 0">
     8             and username = #{username}
     9         </if>
    10         <if test="userage != null">
    11             and userage = #{userage}
    12         </if>
    13     </where>
    14 </select>    
    mapper.xml
    1 //根据不同条件进行不同的查询
    2 User user = new User();
    3 user.setUserage(18);
    4 //user.setUsername("小红");
    5 List<User> list = mapper.selectByproPerties_where(user );
    6 for (User users : list) {
    7     System.out.println(users);
    8 }
    TestMapper.java


    3)choose标签(二选一的结果)
    补充if标签的判断逻辑标签。 可以实现类似java中的if  else  if else的判断标签
    语法: <choose> <when test=”布尔表达式”></when><otherwise></otherwise></choose>
    含义: <when>标签相当于if或else if. <otherwise>标签相当于是else

     1 <select id="selectByproPerties_choose" resultType="User">
     2     select * from user
     3     <where>
     4         <choose>
     5             <when test="username != null and username.length() > 0">
     6                 username = #{username}
     7             </when>
     8             <otherwise>
     9                 userage = 18
    10             </otherwise>
    11         </choose>
    12     </where>
    13 </select>
    mapper.xml
    1 SqlSession session = MybatisUtil.openSession();
    2 UserMapper mapper = session.getMapper(UserMapper.class);
    3         
    4 User user = new User();
    5 //user.setUsername("小红");
    6 List<User> list = mapper.selectByproPerties_choose(user );
    7 for (User users : list) {
    8     System.out.println(users);
    9 }
    TestMapper.java


    4)foreach标签
    循环迭代标签,常用于处理集合条件.如:批量新增, 范围条件查询.
    当循环的集合为Map的时候, 默认循环遍历value数据集合. 可以通过表达式调用java方法,实现key数据集合的遍历.

    1 <insert id="insertuser_batch">
    2     insert into user(username,userage) values
    3     <foreach collection="list" separator="," item="user">
    4         (#{user.username},#{user.userage})
    5     </foreach>
    6 </insert>
    mapper.xml写法一

    定义接口:void insertuser_batch(List<User> list);

    1 SqlSession session = MybatisUtil.openSession();
    2 UserMapper mapper = session.getMapper(UserMapper.class);
    3 User user = new User();
    4 List<User> list = new ArrayList<>();
    5 list.add(new User("a1", 21));
    6 list.add(new User("a2", 22));
    7 list.add(new User("a3", 23));
    8 mapper.insertuser_batch(list);
    TsetMapepr.java


    查看数据库是否批量添加成功:【测试避免麻烦:开启mybatis事物自动提交】

    循环迭代标签参数的详解
    标签可以循环数组, Collection, Map
    属性:
    collection - 参数对象的property或field, 以及Map集合的key. 要循环的集合
    open - 循环数据的前缀
    close - 循环数据的后缀
    item - 每次循环的变量命名
    separator- 以什么符号分割
    mapper.xml写法二

    5)trim标签
    在标签内容数据的前后,增加或减少一个字符串.
    先删除前后缀,再增加前后缀.
    prefix 给sql语句拼接的前缀 先去后加
    suffix 给sql语句拼接的后缀
    prefixesToOverride 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixesToOverride属性指定,
    假设该属性指定为”AND”,当sql语句的开头为”AND”,trim标签将会去除该”AND”
    suffixesToOverride 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixesToOverride属性指定
    6)set标签
    用于动态拼接更新语句中set子句的标签.
    更新数据:根据参数的属性决定更新什么字段,自动去掉set语句最后的那个逗号
    如果有属性值,则更新字段。 如果没有属性值,则不更新字段

     1 <!-- 根据id进行更新 -->
     2 <update id="updateById">
     3     update user 
     4     <set>
     5         <if test="username != null and username.length() > 0">
     6         username = #{username},
     7             </if>
     8         <if test="userage != null">
     9             userage = #{userage},
    10         </if>
    11     </set>
    12     <where>
    13         userid =#{userid}
    14         </where>
    15 </update>    
    mapper.xml

    定义接口:void updateById(User user);

    1 SqlSession session = MybatisUtil.openSession();
    2 UserMapper mapper = session.getMapper(UserMapper.class);
    3 User user = new User();
    4 user.setUserid(1);
    5 user.setUserage(20);
    6 user.setUsername("更新");
    7 mapper.updateById(user);
    TestMapper


    7)sql标签
    定义SQL语法片段的标签,可以简化配置文件, 提供SQL语法的通用性.
    5、mybatis事物和filter过滤器
    事物处理:实现javax.servlet.Filter;
    web.xml配置

    用ThreadLocal去完成事物的一致性

  • 相关阅读:
    【318】C# 学习笔记
    【317】python 指定浏览器打开网页 / 文件
    【316】python.requests 读取网页信息
    【315】Windows 之间代码自动传文件
    多线程经典问题-----乘客做公交车问题解答3
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    [课堂实践与项目]手机QQ客户端--4期(SQLite的加入,注册,找回,登录界面的修改):建立关于QQ注册类,使用SQLite进行存储,
    《Effective C++》学习笔记条款13 以对象管理资源
    抛弃编程语言的偏见——对话百度架构师
    IOS开发之UINavigationBar
  • 原文地址:https://www.cnblogs.com/cao-yin/p/10505901.html
Copyright © 2020-2023  润新知