Mybatis注意的知识点

博客主要介绍JavaBean中属性名和字段名不一致的处理方式,包括SQL用别名和使用resultMap配置对应关系。还讲解了SqlMapConfig.xml核心配置文件、类型别名、映射器等内容,以及SQL动态拼接标签。此外,阐述了多表关系和多表查询语句的技巧与语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaBean中属性名和字段名不一致的情况处理

1.处理方式:SQL语句中使用别名,别名和JavaBean属性名保持一致(用的少)

2.处理方式:使用resultMap配置字段名和属性名的对应关系(推荐)

SqlMapConfig.xml核心配置文件

properties属性(了解)

可以在SqlMapConfig.xml中引入properties文件的配置信息,实现配置的热插拔效果。

例如:

有jdbc.properties配置文件在resource下

SqlMapConfig.xml配置如下:

注意加载顺序

typeAlias类型的别名

类型别名:是Mybatis为java类型设置的一个短名称的,目的仅仅是为了减少沉余

注意:类型别名不区分大小写

Mybatis提供的别名有:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

自定义类型别名:

例如:自定义的javaBean,全限定类名太长,可以自定义类型的别名

给一个类指定别名

在映射器里面使用类型别名

指定一个包名

在SqlMapConfig.xml中为一个package下所有类注册别名:类名即别名

注意这个别名是:javaBean的类名

在映射器里面使用类型的别名

mappers映射器

用来配置映射器的接口的配置文件的位置,或者映射器接口的权限定的类名

使用最好的是package的使用方式。

SQL的动态拼接

<if>标签

需求实现

注意:

1.<where>标签代替了where 1=1

2.<where>标签内拼接的SQL没有变化,每个if的SQL中的都有and

3.使用<where>标签时,Mybatis会自动处理掉条件中的第一个and以保证SQL语法的正确

<foreach>标签

语法

需求描述

  QueryVO中有一个属性ids, 是id值的集合。根据QueryVO中的ids查询用户列表。

QueryVO类如下:

public class QueryVO {
    
    private Integer[] ids;

    public Integer[] getIds() {
        return ids;
    }

    public void setIds(Integer[] ids) {
        this.ids = ids;
    }
}

3.3.3 需求实现

1) 在映射器接口UserDao中增加方法

List<User> findByIds(QueryVO vo);

2) 在映射配置文件UserDao.xml中添加statement

<!--在核心配置文件中已经使用package配置了类型别名-->
<select id="findByIds" resultType="user" parameterType="queryvo">
    select * from user 
    <where>
        <foreach collection="ids" open="and id in (" item="id" separator="," close=")">
            #{id}
        </foreach>
    </where>
</select>

3) 在单元测试类中编写测试代码

    @Test
    public void testFindUserByIdsQueryVO(){
        QueryVO vo = new QueryVO();
        vo.setIds(new Integer[]{41, 42});
​
        List<User> userList = dao.findByIds(vo);
        for (User user : userList) {
            System.out.println(user);
        }
    }
​

<sql>标签

在映射配置文件中,我们发现有很多SQL片段是重复的,比如:select * from user。Mybatis提供了一个<sql>标签,把重复的SQL片段抽取出来,可以重复使用。

语法介绍

多表查询

1. 多表关系

1.1 多表之间的关系

  • 一对一:少,通常可以合并成一张表

    • 为了效率考虑:

      • 有一张大表,100个字段。80%的概率,只要使用它的20个字段;

      • 可以把表拆分成两张表:常用字段一张表,不常用字段一张表

    • 为了业务区分:

      • 有一张大表,表里有用户本身的数据,有用户帐号信息(只考虑一个用户对一个帐号的情况)

        • 有大表如下:

        • 拆分成两张小表如下:

  • 一对多:用户和订单,分类和商品。通过外键维护一对多关系

    • 一个用户对应多个订单

    • 一个订单对应一个用户

  • 多对多:老师和学生,学生和课程,订单和商品。通过一张中间关系表,维护多对多关系

1.2 Mybatis操作多表

  • 对一:一个订单对应一个用户,一个商品对应一个分类

    • 一对一和多对一,都属于对一

    • 创建实体JavaBean的时候,在JavaBean里有一的一方的JavaBean引用

      • 比如:一个订单对应一个用户,创建的JavaBean:

      class Orders{
          private Integer oid;
          private Double money;
          private Integer uid;
          
          //一个订单对应一个用户,那么在Orders对象里就有一个User对象的引用
          private User user;
      }
      ​
      class User{
          private Integer id;
          private String username;
          //...
      }
  • 对多:一个用户对应多个订单,一个分类对应多个商品

    • 一对多和多对多,都属于对多

    • 创建实现JavaBean的时候,在JavaBean里有多的一方的JavaBean集合

      • 比如:一个用户对应多个订单,创建的JavaBean:

      class User{
          private Integer id;
          private String username;
          //...
          
          //一个用户对应多个订单,那么在User对象里就有一个Orders的集合
          private List<Orders> orderList;
      }
      ​
      class Orders{
          private Integer oid;
          private Double money;
          //...
      }

2. 多表查询语句

  • 查询的技巧

    • 找数据所在的表,有哪些

    • 找这些表之间的关联条件

    • 使用关联条件,把多表合并成一张大表

    • 从合并后的大表里,进行单表查询筛选

  • 查询的语法

    • 内连接:查询表之间必定有关联的数据

    • 外连接:查询一张表的全部数据,及另外一张表的关联数据

    • 子查询:是查询技巧,没有固定语法。查询嵌套

 

内容回顾

  1. 能够解决:查询时,JavaBean的属性名和表字段名不一致的问题

    1. 方案一:SQL语句里,给字段起别名,别名等于属性名(用的少)

    2. 方案二:使用resultMap手动设置字段名和属性名的对应关系

      • 在映射配置文件的statement里

      <select id="" parameterType="" resultMap="resultMap的唯一标识">
         sql语句
      </select>
      ​
      <resultMap id="唯一标识" type="JavaBean对象">
          <!-- id:用于配置主键字段映射;result用于配置普通字段映射 -->
          <id property="属性名" column="字段名"/>
          <result property="属性名" column="字段名"/>
      </resultMap>
  2. 能够使用传统方式,实现CURD功能

    1. 相关类:

      1. 操作数据库:SqlSession

        1. 随用随取,用完就关,一定要关

        2. 方法:

          1. selectList:查询多个

          2. selectOne:查询一个

          3. insert

          4. update

          5. delete

      2. 获取SqlSession:SqlSessionFactory

        1. 通常是单例模式,一个项目里只要有一个工厂即可

      3. 获取SqlSessionFactory:SqlSessionFactoryBuilder

        1. 只要构造者已经构造成功了工厂对象,构造者就可以垃圾回收了

    2. 使用的模式:

      1. 映射器接口:必须提供

      2. 映射配置文件:必须提供

      3. 映射器接口的实现类对象:

        class XXXDaoImpl implements XXXDao{
            private SqlSessionFactory factory;
            public XXXDaoImpl(SqlSessionFactory factory){
                this.factory = factory;
            }
            
            //...其它方法
        }
  3. 核心配置文件里:

    1. 配置类型别名:

      <typeAliases>
          <!-- 指定包里的所有类都注册别名,类名即别名。别名不区分大小写 -->
          <package name="com.itheima.domain"></package>
      </typeAliases>
    2. 配置映射器:

      <mappers>
          <!-- 指定包里所有的映射器都自动注册 -->
          <package name="com.itheima.dao"/>
      </mappers>
  4. 数据源和事务:了解原理和源码

  5. SQL深入:

    <select id="search2" parameterType="queryVo" resultType="user">
        <include refid="selectUser"/>
        <where>
            <if test="idArray != null and idArray.length > 0">
                <foreach collection="idArray" open=" and id in(" item="id" separator="," close=")">
                    #{id}
                </foreach>
            </if>
            <if test="user.username != null and user.username != ''">
                and username like #{user.username}
            </if>
            <if test="user.sex != null and user.sex != ''">
                and sex = #{user.sex}
            </if>
        </where>
    </select>

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值