Mybatis框架学习02

mapper文件的创建

虽然我叫它为mapper文件,只是他只是一个有着约束的xml文件,它的约束如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

我们可以在resource条件下去创建这么一个mapper文件,亦可以遵循mybatis代理模式的要求把mapper集中管理起来,甚至你可以从本地或者网络可连接的任何地址创建这么一个mapper文件,这里就不得不说一个在我们使用mybatis时最开始设置的核心配置文件(我习惯写成mybatis-config.xml,以下用mybatis-config指代)中设置mappers标签时如何为它指定资源。
在mybatis-config下:

	<mappers>
		<!--相对位置引用-->
		<mapper resource="与本文件所在的相对位置"/>
		<!--绝对位置引用,那么只要能访问到,都可以引用,但是现在通用非分布式项目估计跨盘区都不可能-->
		<mapper resource="绝对路径"/>
		<!--既然所有的操作都对应着类,那么通过类的位置自然也可以确定mapper位置,
		所以这种方式需要mapper文件必须和class在一个包下,同时命名一致-->
		<mapper class="包名+class名"/>
		<!--s上面三种方式都是单个文件引入,但在实际开发时不可能只有一个mapper文件,这需要我们把所有mapper都丢到dao层,然后通过dao层下和mapper同名的class自动映射-->
        <package name="com.elvis.dao"/>
    </mappers>

以上即是mapper文件创建和mybatis-config引用mapper时的配置。

mapper文件内部标签

1.cache – 该命名空间的缓存配置。虽然缓存有很多知识点,但对于这个标签却没什么讲的,放在之后缓存里来说。
2.cache-ref – 引用其它命名空间的缓存配置。
3.resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。这是mybatis mapper文件配置的重中之重,因为一般我们查询对象不永远只是简单基本数据类型和String,或者单一的HashMap,List,对于数据库我们知道有着三种对应关系,即:一对一、一对多、多对多,比如一个班级必然有不止一个的学生,而一个学生很难同时属于多个班级,这就是一对多,那么我们输出一个班级的信息时,我们的作为承接数据的实体类就很可能会包含学生的信息,那么这个pojo对象里面很可能就会有一个List或者Set类型的属性来承接他所有的学生信息,那么这种情况下<select resultType=“xxx.xxx.ClassInfo”>是不能成功接收数据的,那么则需要更改使用resultMap=“自定义的resultMap标签id”;
以下就是resultMap标签下的属性和子标签的内容:

  • id 属性:唯一标识resultMap
  • type 属性:用来指明返回为哪一个pojo对象,例如返回班级信息,那么就指明type=“com.elvis.pojo.ClassInfo”,当然mybatis-config配置了别名可以省略包名
  • autoMapper 属性:查询结果是否自动映射到pojo的相对应的属性中,默认为true,如果设为false那么则需要以下两个标签手动设置
  • id 子标签:主要形式为 <id property=“pojo里面的属性” column=“查询结果里的列名(不是表格的列名)”>,这是用来表名你的查询结果的主键,一(多)对多踩过的大坑,必写之!
  • result 子标签:形式 <result property=“pojo里面的属性” column=“查询结果里的列名(不是表格的列名)”>,非主键设置映射
  • association 子标签:形式 <association property=“pojo里面的属性” javaType=“pojo”>,主要用于1对1的关系,例如一个班级只能有一个班主任,一个班主任一般也只任职一个班级,班主任是一个Teacher的对象,那么班级信息承接的类可能就会有班主任的信息 即paivate Teacher chargerTeacher;所以javaType=“com.elvis.pojo.Teacher”;除此之外,这个标签是允许套娃的,那么像上述标签也有可能适用于Teacher这个类。
  • collection 子标签:适用于1对多的关系,基本和association一样,不同的是它不是在JavaType中指明pojo,而是在ofType这个属性中,新版mybatis,还要求加入JavaType来指明集合的类型,比如班级信息下我写的是 List<Student> students,那么必须写上javaType=“java.util.List”,同样支持套娃;除此之外,多对多没有单独的标签,其实多对多也无非可以理解为是用着共通的一对多,之后单独贴源码讲一对多和多对多

4.sql – 抽取出可被其它语句引用的可重用语句块。
5.insert – 映射插入语句。

  • id 属性:唯一标识(和方法名一致)
  • parameterType 属性:设置参数类型,多参数且非注解下需要按照指定格式填写
  • resultType 属性:插入这个无所谓,直接不写或者int(Integer),当然mysql脏读的话得设置

6.update – 映射更新语句,基本和insert 一样
7.delete – 映射删除语句。
8.select – 映射查询语句。

${}和#{}的区别

例如这么一个select标签:

<select id="getStudentById" resultType="Student">
	select * from Student where StudentID=${id}
</select >
<select id="getStudentById" resultType="Student">
	select * from Student where StudentID=#{id}
</select >

当把一个学生学号(2016032082)作为参数传过来的时候,这两条语句都可以查询出结果(其实不能,因为我的学士学号在数据库中类型是varchar2,如果是number则可以查询出来),不同的是在控制台输出的sql有所差异:
${id}时:select * from Student where StudentID=2016032082
#{id}时:select * from Student where StudentID=?
那么区别就很明显了,当使用#{}时,mybatis把它当做了一个占位符来处理,而${}时则把它当成了拼接符,很类似于前端中的el表达式,所以不提倡${},因为不防侧漏,咳咳,不防注入啊!

动态sql

十分类似于前端使用的C标签,具体使用请转 https://blog.csdn.net/qq_41910359/article/details/116870419.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值