ORM
在 MyBatis 中,ORM 指的就是 MyBatis 在操作数据库时,将数据库中的表和行与 Java 对象之间进行映射的过程。具体体现在以下几个方面:
1.表到类的映射:MyBatis 会将数据库表中的字段映射到 Java 类的属性上。
2.结果集到对象的映射:MyBatis 会将 SQL 查询返回的结果集自动映射到 Java 对象上。
3.参数到 SQL 的映射:MyBatis 会将 Java 对象的属性值映射到 SQL 语句的占位符上。
这样,开发人员就可以利用面向对象的思维方式来操作关系型数据库,而不需要关注底层的数据库细节。MyBatis 的 ORM 功能大大降低了开发人员的工作量,提高了开发效率。
配置数据源
#配置mybits的数据源DataSourse
spring:
datasource:
username: root
password: *********
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/easydata
mybatis:
mapper-locations: classpath:mapper/*.xml
logging:
level:
com.easy.dao: debug
SpringBoot 应用程序的数据源和 MyBatis 相关设置:
数据源配置
spring.datasource 部分定义了数据源的相关配置,包括数据库用户名、密码、驱动类名和 JDBC URL。
这些配置项用于让 SpringBoot 创建并管理数据库连接池。
MyBatis 配置
mybatis.mapper-locations 配置了 MyBatis 的 Mapper XML 文件的路径,指定了 classpath:mapper/*.xml 下的所有 XML 文件。
日志配置
logging.level.com.easy.dao: debug 配置了 com.easy.dao 包下的日志级别为 debug。这可以用于调试 MyBatis 相关的 SQL 语句。
$#的区别
#占位符
用于替换 SQL 语句中的参数值。
使用#占位符时,MyBatis 会自动为参数值添加适当的引号,并转义特殊字符,以确保参数值的安全性。
<select id="selectUserById" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
$占位符
用于替换 SQL 语句中的列名或表名等标识符。
使用$占位符时,MyBatis 不会对参数值进行任何转义或加引号处理。
因此,$占位符更适用于需要动态生成 SQL 语句的场景,例如排序字段、分组字段等。
<select id="selectUserOrderBy" resultType="com.example.User">
SELECT * FROM users ORDER BY ${orderByColumn}
</select>
总的来说,#占位符更安全,因为它会自动处理参数值,防止 SQL 注入攻击。而$占位符更灵活,适用于需要动态生成 SQL 语句的场景,但使用时需要格外小心,避免 SQL 注入的风险。
Mybatis查询操作
<!-- resultType查询出来的每一行都映射称该类型的对象 -->
<select id="getStaff" resultType="com.easy.bean.Staff">
select * from staff
-- 根据参数不同组合出不同的SQl语句 动态SQL语句
<where>
-- 编写条件语句 如果where标签有内容 会自动添加where关键字
<if test="checktext !=null and checktext !=''">
-- 重新定义参数内容
<bind name="liketext" value="'%'+checktext+'%'"></bind>
name like #{liketext}
</if>
</where>
</select>
Controller操作
@GetMapping("staff")
public CommonResult getStaff(String checktext){
List<Staff> list=dao.getStaff(checktext);
return CommonResult.success(list);
}
一对一查询:需要指定映射方式(依赖resultMap<association>)
<!-- 一对一或一对多查询需要指定映射方式-->
<resultMap id="staffAndDep" type="com.easy.bean.Staff">
<association select="" column="dep_id" property="">
</association>
</resultMap>
<select id="getStaffDep" resultType="com.easy.bean.Department">
select * from department where id=#{dep_id}
</select>
controller操作
//一对一查询
@GetMapping("staff")
public CommonResult getStraff(String checktext) {
List<Staff> list=dao.getStaffAndDep();
return CommonResult.success(list);
}
一对多查询(依赖resultMap<collection>)
<resultMap id="departmentAndStaff" type="com.easy.bean.Department">
<!-- <id column="id" property="depid"></id>-->
<!-- <result column="name" property="depname"></result>-->
<result column="id" property="id"></result>
<collection column="id" select="getDepartmentStaff" property="staffList"></collection>
</resultMap>
<select id="getDepartmentStaff" resultType="com.easy.bean.Staff">
select * from staff where dep_id=#{id}
</select>
<select id="getDepartment" resultMap="departmentAndStaff">
select * from department
</select>
controller操作
//一对多查询
@GetMapping("department")
//@Transactional
public CommonResult getDepartment(){
List<Department> list = dao.getDepartment();
System.out.println("----------------");
list = dao.getDepartment();
return CommonResult.success(list);
}
Dao:如果Dao中接收两个以上参数就要使用@Param注解给参数起别名
int edit(@Param("id") int id,@Param("staff") Staff staff);
@Insert("insert into staff value ()")
int save(Staff staff);
动态SQL
条件语句(where):如果where标签有内容,会自动添加where关键字
foreach标签属性:用于循环语句,很好的支持了数组和List、Set接口的集合,并对此提供遍历功能
1,item:表示集合中每一个元素进行迭代式的别名
2,index:指定一个名字,表示在迭代过程中每次迭代到的位置
3,open:表示该语句以什么开始
4,separator:表示在每次进行迭代之间以什么符号作为分隔符
5,close:表示该语句以什么结束
set标签:在Mybatis中,update语句可以使用set标签动态更新列,set标签可以为SQL语句动态的添加set关键字,剔除追加到条件末尾多余的逗号
choose,when和otherwise标签:MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到<if>...<else>...</else> </if> 的效果,可以借助 <choose>、<when>、<otherwise> 来实现。
if标签:mybatis if类似于Java中的 if 语句,是mybatis中最常用的判断语句。使用if标签可以节省许多拼接SQL的工作,把精力集中在XML的维护上
resultType和resultMap的区别:MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。
缓存:
一级缓存(默认):一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 SQLession 域内。当 session flush(刷新)或者 close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。
二级缓存:二级缓存是全局缓存,作用域超出 SQLsession 范围之外,可以被所有 SqlSession 共享。手动开启