Java开发SSM框架-SQL映射文件详解

本文详细解析了MyBatis框架中的SQL映射文件,包括mapper、cache、reslutMap和四大CRUD操作。介绍了基于映射文件+SqlSession与Mapper接口的两种CURD实现方式。接着讲解了MyBatis的条件查询,如模糊查询,以及如何通过Map和@Param处理多参数。接着讨论了MySQL框架的结果映射,包括一对一、一对多、多对一、多对多的关联映射,以及resultMap与resultType的区别。最后,阐述了MyBatis的一级缓存和二级缓存机制,包括缓存配置、回收策略和只读属性。

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

SQL映射文件

SQL映射文件中的几个顶级元素介绍如下:

  • mapper:SQL映射文件的根元素。只有一个namespace,用于区分不同的mapper,必须全局唯一。
  • cache:为给定命名空间配置缓存。
  • cache-ref:引用其他命名空间中的缓存配置。
  • resuitMap:用来描述查询结果集中的字段和Java实体类属性的对应关系。
  • sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高代码编写和维护SQL语句的效率。
  • insert:映射insert语句。
  • select:映射select语句。
  • update:映射update语句。
  • delete:映射delete语句。

MyBatis进行CURD:

方式1: 基于映射文件+SqlSession
特点: 依赖SqlSession对象方法,实现CURD.比如selectList(),selectOne(),insert()…

方式2: 基于映射文件+Mapper接口
特点: 在Mapper接口中定义关于CURD操作的接口方法,然后由MyBatis通过JDK动态代理生成接口的实现类.
因此,在使用时,直接通过Mapper接口对象,调用相关方法即可实现CURD.
备注:
Mapper接口方式底层依然是基于SqlSession。

CURD方案区别
在这里插入图片描述
Mapper接口与业务标签的关系:
在这里插入图片描述

Mapper接口定义要求:
1.Mapper接口的类全名必须与映射文件的namespace值相同.
2.Mapper接口的方法名必须与映射文件中业务标签的id值相同.
3.Mapper接口的方法的参数类型必须与映射文件中业务标签的parameterType相同
4.Mapper接口的方法的返回值类型必须与映射文件中业务标签的resultType相同.
简化: Mapper接口与映射文件的内容一一对应。

注意:
习惯上,SQL映射文件与该Mapper接口放置在同一包路径下。
在不同的SQL映射文件中,子元素的ID可以相同。

MyBatis框架的条件查询

模糊查询:
在UserMapper中添加查询方法:

 public List<User> getUserByName(String name);

在UserMapper.xml中添加SQL语句映射:

   <select id="getUserByName" parameterType="string" resultType="user">
        select * from user where name like CONCAT('%', #{name}, '%')
    </select>

在测试类中添加测试方法:

 public void getuserByname(){
        SqlSession session = MyBatisUtils.getSqlSession();
        String name = "张";
        List<User> list  = session.getMapper(UserMapper.class).getUserByName(name);
        System.out.println(list);

        MyBatisUtils.close(session);
    }

将修改条件封装成Java对象作为入参。
在UserMapper接口中添加方法:

   public int editUser(User user);

在UserMapper.xml中添加SQL语句映射:

<update id="editUser" parameterType="user">
        update user set name=#{name} where id=#{id}
    </update>

在测试类添加方法:

public void updateuser(){
        SqlSession session = MyBatisUtils.getSqlSession();
        User user = new User(5,"赵六",'男',22,"北京");
        int re = session.getMapper(UserMapper.class).editUser(user);
        System.out.println(re!=-1?"操作成功":"操作失败");
        session.commit();
        MyBatisUtils.close(session);
    }

将修改条件封装成Map对象入参:
在UserMapper接口中添加方法:

public int editUser(Map<String,Object> usermap)

在UserMapper.xml添加SQL语句映射:

<update id="updatebran" parameterType="map">
        update user set `name`=#{name} where id=#{id}
 </update>

添加测试方法:

public void updateuser(){
        SqlSession session = MyBatisUtils.getSqlSession();
        Map<String,Object> usermap = new HashMap<String,Object>
        usermap.put("id",2)
        usermap.put("name","李四")
        int re = session.getMapper(UserMapper.class).editUser(usermap);
        System.out.println(re!=-1?"操作成功":"操作失败");
        session.commit();
        MyBatisUtils.close(session);
    }

SQL语句使用Map的key来取得参数值

使用@Param注解实现多参数入参:
在UserMapper接口添加查询方法:

 public List<User> getUserByIdAndName(@Param("id") int id, @Param("name") String name);

在UserMapper.xml文件中添加SQL语句映射:

<select id="getUserByIdAndName" resultType="user">
        select * from user where name like CONCAT('%' ,#{name},'%') and id=#{id}
    </select>

在测试类中添加方法:

 public void getUser(){
        SqlSession  session = MyBatisUtils.getSqlSession();
        List<User>  list = session.getMapper(UserMapper.class).getUserByIdAndName(1,"张");
        System.out.println(list);
        session.commit();
        MyBatisUtils.close(session);
    }

MySQL框架的结果映射

认识关联映射:
在以面向对象思想设计程序时,对象之间会产生关联引用.比如学生与班级,学生对象含有班级类型的属性,此时就会引用班级对象.将对象之间的关联关系映射到数据库,称为关联映射。

ORM映射:
对象模型 ----------数据库模型
对象 --------------------》 表
属性--------------------》 字段
引用关系--------------------》 表关系[外键字段]
关联映射的本质: 将对象与对象之间的引用,转为数据表与数据表之间的引用
备注: 无论哪种关联关系,数据表中的外键只能在多端添加。
在这里插入图片描述
映射类型:
一对一(User-IDCard)
一对多(Department-Employee)
多对一(Student-Class)
多对多(Teacher - Student)

实现关联对象的映射:
1.MyBatis自动完成普通属性与表字段的映射: 将字段的值赋给同名的属性.
2.MyBatis无法自动完成关联对象与表字段的映射,需要手动设置映射关系,如下:

<resultMap>
  <id /><!--映射主键 -->
  <result /><!-- 映射普通属性 -->
  <关联标签 /><!-- 映射关联属性 -->
</resultMap>

resultMap与resultType区别:
resultType: 只支持自动映射. 若含有关联字段,无法完成映射,而映射为null.
resultMap: 支持自动映射及手动映射. 自动映射同resultType.

关联映射标签:
association标签,collection标签。
备注:
备注:
无论是哪一种映射关系或查询方案[嵌套结果/查询],编写映射文件时,只需考虑映射的属性的类型.若是映射一个对象,则用association标签. 若是映射多个对象,则用collection标签。

association标签
用来处理“多对一”的关系。
主要属性如下:

  • property:实体类中用来映射查询结果子集的属性。
  • javaType:property指定的属性的数据类型,可以使用java完全限定类名或者别名。

示例:获取学生的信息和所在年级信息
添加接口方法:

 public List<Student> getStudent();

在StudentMapper.xml映射文件中添加SQL映射语句:

<mapper namespace="cn.mydb.dao.student.StudentMapper">
    <resultMap id="studnetmap" type="student">
        <id column="sid" property="id"></id>
        <result column="name" property="name"></result>
        <result column="sex" property="sex"></result>
        <result column="age" property="age"></result>
        <association property="grade" javaType="Grade">
            <id column="id" property="id"></id>
            <result column="gradeName" property="gradeName"></result>
        </association>
    </resultMap>
    <select id="getStudent" resultMap="studnetmap">
        select s.id sid,name,age,sex,g.id gid,gradeName from student s,grade g where s.gradeid=g.id
    </select>
</mapper>

collection标签
用来处理“一对多”的关系 即实体类内部嵌套的是一个集合类型的属性。

示例:获取年级信息及每个年级全部学生的姓名:
添加接口方法

public List<Grade> getGradeStu();

在GradeMapper.xml文件中添加SQL映射语句:

  <resultMap id="grademap" type="grade">
        <id column="id" property="id"></id>
        <result column="gradeName" property="gradeName"></result>
    </resultMap>
      <resultMap id="gradestumap" type="grade" extends="grademap">
        <collection property="students" ofType="student">
            <id column="sid" property="id"></id>
            <result column="name" property="name"></result>
            <result column="sex" property="sex"></result>
            <result column="age" property="age"></result>
        </collection>
    </resultMap>
    <select id="getGradeStu" resultMap="gradestumap">
        select g.id,gradeName,s.id sid,name,sex,age from grade g,student s where s.gradeid=g.id
    </select>

常用属性如下:

  1. property:实体类中用来映射查询结果子集的集合属性。
  2. ofType:property指定的集合属性中的元素的数据类型,可以使用java完全限定类名或别名。

MyBatis框架的缓存

MyBatid框架缓存分为两个级别
1.一级缓存:
MyBatis框架的一级缓存是基于PerpetualCache和HashMap本地缓存,默认是SqlSession级别的缓存,在SqlSession的一个生命周期内有效。当SqlSession关闭后,该SqlSession中的所有一级缓存会被清空。MyBatis框架的一级缓存默认是开启的。

2.二级缓存:
二级缓存是SqlSessionFactory级别的,其作用域超出了一个SqlSession的范围,缓存中的数据可以被所有SqlSession共享。MyBatis框架的二级缓存默认是关闭的,使用时需要在Mybatis框架的核心配置文件中设置开启。

二级缓存使用方法

1.在MyBatis核心配置文件中设置全局开启二级缓存。代码如下

<settings>
	<setting name="cacheEnabled" value="true">
</settings>

2.即使开启了二级缓存,默认情况下也是不使用的,可以根据需要在SQL映射文件中配置缓存,为当前namespace启用二级缓存,代码如下:

<mapper name=cn.mydb.dao.user.UserMapper>
	<!--缓存配置-->
	<cache
		eviction="FIFO"
		flushInterval="60000"
		size="512"
		readOnly="true">
		...
</mapper>

cache元素中属性的作用如下:
eviction:选择缓存回收策略,主要包括以下几种策略:

  • LRU:这是默认选项,最近最少回收,移除最长时间不被使用的缓存对象。
  • FIFO:先进先出,按照对象进入缓存的顺序来移除它们。
  • SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。
  • WEAK:弱引用,更积极的移除基于垃圾回收器和弱引用规则的对象。

flushInterval:设定缓存刷新间隔,以毫秒为单位设定缓存多长时间自动刷新一次,默认不自动刷新。

size:设定缓存中最多存放多少个对象,默认是1024

readOnly:设定缓存数据是否只读,默认是false,表示缓存数据越会用于读写操作,MyBatis框架会返回缓存对象的副本以避免脏读,true表示缓存数据只用于读操作,MyBatis框架会为所有从缓存中获取数据的操作返回缓存对象相同的实例,以获得更好的性能。

3.在SQL映射文件中配置支持二级缓存后,如需对个别查询进行调整,可以在select元素中单独设置,代码如下:

 <select id="getUserByName" parameterType="string" resultType="user" useCache="false">
        
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值