Mybatis小记——使用时的小tips

一、{}和${}的使用:

  • 1、如果想向sql语句中拼接mysql关键字。只能使用${}
  • 因为#{}是以值的形式放到sql语句中,它传入时会自动加一个 ‘’
    案例:
    如果要查询数据库中的User信息,将查询到的信息按照某一个 条件 进行排序输出
    sql 语句:
    select * from t_user group by #{排序条件} ${排序方式}
    java语句:
   * 查询所有用户,并且按照降序或升序排列
     * @param param1 根据什么字段进行排序
     * @param param2 传入的排序类型,升序(asc) 降序(desc)
     *
     * @return 返回排序好的User信息
     */
    List<User> selectAllUserByAgeIsAseOrDesc(String param1,String param2);

这里有一个问题:
详见 csdn: mybatis问题小计——传入参数报错(Not Found)

  • 2、表名拼接
    • 案例:
      • 加入要存储日志信息到数据库中,所有日志信息存储到一个数据表中,
        数据量太大,影响查询效率,并且也不方便查询
        这是时候就需要分表查询,将日期设置为log_日期(log_20230101)
        这时就要用到 ${} 占位符进行拼接表名
  • 3、批量删除:
    • 删除的SQL语句是:
      delete from t_user where id in(${id})
      java语句:
      int deleteButchById(String id);
      如果传入一个字符串:“1,2,3,4,5”
      使用${}后,最终拼接的SQL 语句就是:delete from t_user in (1,2,3,4,5)
      最终删除的就是id为1 2 3 4 5 的这几条记录
      如果使用#{},拼接后的Java语句是: delete from t_user in (?)
      传入id后,结果为: delete from t_user in ('1,2,3,4,5') sql语句加了 ' ' 导致出错
  • 4、模糊查询:
    • like
      使用${}进行模糊查询
      SQL语句:select * from t_user where name like '%${like}%'
      java:
      List<User> users = mapper.selectUserByLike("张");
      最终拼接后:查询姓名中有张这个字的user
      select * from t_user where name like '%张%'
      使用#{} 进行模糊查询:
      SQL语句:使用concat()函数进行拼接
      select * from t_user where name like concat('%',#{like},'%')
      java:
      List<User> users = mapper.selectUserByLike("张");
      最终拼接后:查询姓名中有张这个字的user
        select * from t_user where name like ('%',?,'%')
        select * from t_user where name like ('%',,'%')

使用${}+concat() 进行模糊查询:【鸡肋】
SQL语句:使用concat()函数进行拼接
select * from t_user where name like concat('%','${like}','%')
java:
List<User> users = mapper.selectUserByLike("张");
最终拼接后:查询姓名中有张这个字的user
select * from t_user where name like ('%','张','%')
总结:
就这四种方式:
1、like '%${like}%'
2、like concat('%',#{like},'%')
3、like concat('%','${like}','%')
4、like '%'#{like}'%'

二、 起别名机制

使用<typeAlias>标签【不推荐】
mybatis-config.xml文件:

          <!--起别名机制-->
               <typeAliases>
                   <!--属性 type是设置给那个类型取别名
                            alias是为这个类型起的别名>-->
                   <typeAlias type="mybatis.pojo.User" alias="User"></typeAlias>
                   <typeAlias type="mybatis.pojo.Log" alias="Log"></typeAlias>
               </typeAliases>

XXXMapper.xml文件:
返回类型使用mybatis-config.xml文件中配置的别名

           <select id="selectUserByName" resultType="User">
                    select id,name,age,sex
                    from t_user where name = #{name};
                </select>

别名不区分大小写
注意:namespace不能使用别名
使用<package name = 在这里填要返回类型类所在的包">标签;

  • 如:将com.hyp.pojo包下的所有类自动起别名 别名就是类的简名
    <package name ="com.hyp.pojo>:
          <!--起别名机制-->
               <typeAliases>
                    <package name ="com.hyp.pojo>
               </typeAliases>

三、mybatis-config.xml中的mappers标签

        <mappers>
            <mapper resource="userMapper.xml"/>
            <mapper resource="logMapper.xml"/>
            <mapper class=""/>
            <mapper url=""/>
        </mappers>
  • mapper标签中,
    • resource表示从项目的根路径加载
    • class 可以写接口的全限定名,前提是
      XXXMapper接口要和XXXMapper.xml文件放在同一个包下
      XXXMapper.xml文件的文件名一定要和XXXMapper接口的接口名一致
      • 例如:
        • UserMappermybatis.Mapper包
          那么 UserMapper.xml文件就要放在同一目录下
          在resource目录下创建目录 mybatis/Mapper
          这样就可以在mybatis-config.xml文件中的Mapper使用 class 配置
          在这里插入图片描述

但是有一个问题,如果存在10000个pojo类,那我们要写10000个mapper标签吗?
不是,使用package这个标签只需要给这个标签的name属性赋值为 接口所在包的包名就可自动配置所有接口的XXXMapper.xml文件
如:
<package name = "mybatis.Mapper">

        <mappers>
            <package name = "mybatis.Mapper">
        </mappers>

注意:
使用class 和 package 需要在resources目录下建目录在resources下创建目录时,不能像创建包一样:
com.hyp.mybatis……
而需要这样:
com/hyp/mybatis……

四、创建模板文件

打开IDEA的Serring选项找到editor下的File额 and Templates
在这里插入图片描述

五、获取自动生成的主键

应用场景:

  • 一个人对应多种职位,在插入这个人的同时插入这个人的职位。
  • 在另一张表中,设置外键为人员表的id属性,然后获取插入的人的信息的id,给另一张表的外键属性赋值
    使用:
    在xml文件中:
    属性:userGeneratedKey使用自动生成的主键值
    KeyProperty指定主键值赋值给对象的那个属性,
    这个就是赋值给User对象的id属性
<insert id="insertUserUseGenerateKey" useGeneratedKeys="true" keyProperty="id">
        insert into t_user(id,name,age,sex) value (null,#{name},#{age},#{sex})
</insert>
@Test
    public void testInsertUserUseGenerateKey(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(null, "小韩1", 21, "男");
        mapper.insertUserUseGenerateKey(user);
        System.out.println(user.getId());
        sqlSession.commit();
        MybatisUtils.close(sqlSession);
   }

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值