mybatis

一、搭建mybatis

1、创建maven项目

2、添加相关依赖

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.easy</groupId>
    <artifactId>EasySpringMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-parent</artifactId>
        <version>2.6.6</version>
    </parent>

    <properties>
        <spring-boot-version>2.6.6</spring-boot-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.16</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>${spring-boot-version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.14</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

    </dependencies>

</project>

该文件添加了

  • Spring Boot Starter Web (spring-boot-starter-web):
    这个依赖包含了构建Web应用所需的所有Spring MVC和Tomcat的依赖。它支持RESTful风格的Web服务。
  • Spring Boot Starter Thymeleaf (spring-boot-starter-thymeleaf):
    提供了对Thymeleaf模板引擎的支持,Thymeleaf是一个用于Web和独立环境的现代服务器端Java模板引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。
  • MyBatis Spring Boot Starter (mybatis-spring-boot-starter):
    MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis Spring Boot Starter简化了MyBatis在Spring Boot项目中的集成。
  • Spring Boot DevTools (spring-boot-devtools):
    Spring Boot DevTools提供了一系列有用的开发时功能,如自动重启应用以快速迭代更改,以及LiveReload支持以实时刷新浏览器中的更改。
  • SLF4J API (slf4j-api):
    SLF4J(简单日志门面)是一个用于Java的日志门面(Facade),为各种日志框架提供了一个简单的日志记录API。这个依赖仅提供了API,你需要一个实现(如Logback或log4j)来实际记录日志。
  • MySQL Connector/J (mysql-connector-java):
    MySQL Connector/J是一个JDBC驱动程序,它实现了Java数据库的连接(JDBC)API,用于连接MySQL服务器。这个依赖允许你的Java应用与MySQL数据库交互。
  • Spring Aspects (spring-aspects):
    Spring Aspects提供了对面向切面编程(AOP)的支持,允许你定义横切关注点(如日志、事务管理等)作为可重用的模块。

 3、配置mybatis的数据源  指定映射配置文件的位置

application.yml文件

#注释   Springboot主配置文件
#yml基本语法
#student:
#  name: zhangsan
#  sex: nan
#配置mybatis的数据源
spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/easydata

#设置MyBatis xml保存路径,xml 文件中保存是对数据库的具体操作SQL
mybatis:
  mapper-locations: classpath:mapper/*.xml

#设置日志级别
logging:
  level:
    com.easy.dao: debug

空2格表示下属属性

设置日志级别

        指定了com.easy.dao包(及其子包)下的所有类在运行时产生的日志信息的级别为DEBUG。这意味着,如果MyBatis在执行这些DAO(Data Access Object)层的操作时,有任何DEBUG级别或更高级别(如INFOWARNERROR)的日志信息,它们都将被记录下来。

        日志级别从低到高依次为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。默认情况下,很多框架(包括Spring Boot和MyBatis)可能不会输出DEBUG及以下级别的日志,因为它们可能包含大量的细节信息,对于日常开发和调试很有帮助,但在生产环境中可能会产生大量的日志数据,影响系统性能。

二、ORM 

1、什么是ORM

        ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象,Relational表示的是关系型数据库,Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系,这样就可以用面向对象的方式,方便快捷地操作数据。

        ORM 框架是一种数据持久化技术,即在对象模型和关系型数据库之间建立起对应关系,并且提供一种机制,可通过 JavaBean 对象操作数据库表中的数据。

        ORM 可以在对象模型和关系型数据库的表之间建立一座桥梁,程序员使用 API 直接操作 JavaBean 对象就可以实现数据的存储、查询、更改和删除等操作。

        MyBatis 框架通过简单的 XML 或注解进行配置和原始映射,将实体类和 SQL 语句之间建立起映射关系,是一种半自动化的 ORM 实现。

 数据从Mapper->Dao->Controller->前端    前端通过Controller->Dao->Mapper操纵数据库中的数据

 2、ORM VS SQL

三、具体操作 

1、增删改查

实体类 

package com.easy.bean;

public class Department {
	private int id;
	private String code;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

Controller

package com.easy.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

import com.easy.bean.Department;
import com.easy.dao.IDepartmentDao;

@RestController
public class DepartmentController {
	@Autowired
	IDepartmentDao dao;
	
	@PostMapping("department")
	public String addDepartment(Department department) {
		dao.addDepartment(department);
		return "success";
	}
	
	@DeleteMapping("department/{id}")
	public String delDepartment(@PathVariable int id) {
		dao.delDepartment(id);
		return "success";
	}
	
	@PutMapping("department")
	public String editDepartment(Department department) {
		dao.editDepartment(department);
		return "success";
	}
	
	@GetMapping("department/{id}")
	public String getName(@PathVariable int id) {
		String name= dao.getName(id);
		return name;
	}
}

Dao

package com.easy.dao;

import org.apache.ibatis.annotations.Mapper;

import com.easy.bean.Department;

@Mapper
public interface IDepartmentDao {
	int addDepartment(Department department);
	int delDepartment(int id);
	int editDepartment(Department department);
	String getName(int id);
}

Mapper

<?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">

<mapper namespace="com.easy.dao.IDepartmentDao">
	<insert id="addDepartment">
        insert into department(id,code,name)
        value(#{id},#{code},#{name})
    </insert>
	
	<delete id="delDepartment">
		delete from department where id=#{id}
	</delete>
	
	<update id="editDepartment"> 
		update department set name=#{name},code=#{code}
		where id=#{id}
	</update>
	
	<select id="getName" resultType="string">
		select name from department where id=#{id}
	</select>
</mapper>

 2、#{}和 ${}的区别

在 MyBatis 中,#{}和 ${}是两种不同的参数注入方式,主要区别在于参数的预处理和安全性。

(1)#{}:预处理参数

#{}用于预处理参数,会将参数值以预编译的形式传递给 SQL 引擎,防止 SQL 注入攻击

<!-- 示例:使用#{}预处理参数 -->
<select id="getUserById" resultType="User">
    SELECT * FROM user WHERE id = #{userId}
</select>

 在上面的例子中,#{userId} 会被 MyBatis 替换成 ?,然后在执行 SQL 语句时,将真正的参数值传递给 ? 进行预编译,这有助于防止 SQL 注入。

(2)${}:直接拼接参数 

${} 用于直接拼接参数,将参数值直接替换到 SQL 语句中,不进行预处理。这样做可能会存在 SQL 注入的风险,因此要慎用。

<!-- 示例:使用${}直接拼接参数 -->
<select id="getUserByName" resultType="User">
    SELECT * FROM user WHERE name = '${userName}'
</select>
(3)区别总结
  • #{} 用于预处理参数,安全性更高,可以防止 SQL 注入。
  • ${} 用于直接拼接参数,慎用,可能存在 SQL 注入的风险。

四、映射文件常用标签 

1、select标签

        为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。

(1)常用属性

 (2)参数传递 
  • 使用注解传递参数

  • 使用Map传递参数

  •  使用JavaBean传递参数

  •  区别

            使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。

            使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。

            当参数个数大于 5 个时,建议使用 JavaBean 方式。

2、insert标签

(1)主键(自动递增)回填

        MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。

        一些特殊情况下,我们可能需要将这个刚刚生成的主键回填到请求对象(原本不包含主键信息的请求对象)中,供其他业务使用。此时,我们就可以通过在 insert 标签中添加  keyProperty 和 useGeneratedKeys 属性,来实现该功能。

 (2)自定义主键

        实际项目中,若数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,我们可以使用 MyBatis 的 <selectKey> 标签自定义生成主键 

3、update标签和delete标签

        与select和insert基本相同

 五、动态SQL

        动态 SQL 只有几个基本元素,与 JSTL 或 XML 文本处理器相似,十分简单明了,大量的判断都可以在 MyBatis 的映射 XML 文件里配置,以达到许多需要大量代码才能实现的功能。

        动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

 1、if标签

        MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句。使用 if 标签可以节省许多拼接 SQL 的工作,把精力集中在 XML 的维护上。

        <if test="判断条件">SQL语句</if>

        当判断条件为 true 时,才会执行所包含的 SQL 语句。

2、choose、when和otherwise标签

        MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到<if>...<else>...</else> </if> 的效果,可以借助 <choose>、<when>、<otherwise> 来实现。 

    <select id="getStaffBySalary" resultType="com.easy.bean.Staff">
    	select * from staff
    	<where>
    		<!-- 参数名  salarytext -->
    		<choose>
    				<!-- 小于号&gt; 小于等于&gt;=   大于号&gt;  大于等于&gt;=  -->
    			<when test='salarytext == "低"'>
    				salary &lt;= 5000
    			</when>
    			<when test='salarytext == "中"'>
    				salary &gt; 5000 and salary &lt;= 8000
    			</when>
    			<otherwise>
    				salary &gt; 8000
    			</otherwise>
    		</choose>
    	</where>
    </select>

3、where标签

        where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件

<!-- 查询出来的结果中的每一行都要映射成该类型的对象 -->
	<select id="getStaff" resultType="com.easy.bean.Staff">
		select * from Staff 
		<!-- 根据参数不同组合出不同的SQL语句    动态SQL语句  标签 -->
		<where>
			<!-- 编写条件语句  如果where标签中有内容  会自动添加where关键字 -->
			<if test="checktext !=null and checktext !='' ">
				<!-- 重新定义参数内容 -->
				<bind value="'%'+checktext+'%'" name="liketext"></bind>
				name like #{liketext}
			</if>
		</where>
	</select>

4、set标签

        在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

    <update id="editStaffItem">
    	update staff
    	<set>
    		<if test='name!=null and name!=""'>
    			name=#{name},
    		</if>
    		<if test="salary!=null">
    			salary=#{salary},
    		</if>
    	</set>	
    	<where>
    		id=#{id}
    	</where>
    </update>

5、foreach标签

        foreach 标签用于循环语句,它很好的支持了数组和 List、set 接口的集合,并对此提供遍历的功能。

    <insert id="addList">
		insert into staff(code,name,salary,username,userpass)
		values
		<foreach collection="list" item="it" separator=",">
			(#{it.code},#{it.name},#{it.salary},#{it.username},#{it.userpass})
		</foreach>
	</insert>

 foreach 标签主要有以下属性

  •     item:表示集合中每一个元素进行迭代时的别名。
  •     index:指定一个名字,表示在迭代过程中每次迭代到的位置。
  •     open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
  •     separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
  •     close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。

注意

  •     使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
  •     如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
  •     如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
  •     如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

6、bind标签

        bind 标签可以通过 OGNL [对象导航图语言(Object Graph Navigation Language)]表达式自定义一个上下文变量。

7、trim标签

        trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。 

 六、resultMap元素

        resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。

1、一对一关联查询

        通过 <resultMap> 元素的子元素 <association> 处理一对一级联关系

<association> 元素中通常使用以下属性:

  •     property:指定映射到实体类的对象属性。
  •     column:指定表中对应的字段(即查询返回的列名)。
  •     javaType:指定映射到实体对象属性的类型。
  •     select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。
<!-- 一对一或一对多查询需要指定映射方式  resultMap -->
    <resultMap id="staffAndDep" type="com.easy.bean.Staff">
    	<association column="dep_id" select="getStaffDep" property="dep">
        </association>
    </resultMap>
    <select id="getStaffDep" resultType="com.easy.bean.Department">
    	select * from department where id=#{dep_id}
    </select>
    
    <select id="getStaffAndDep" resultMap="staffAndDep">
    	select * from staff
    </select>

        一个员工只有一个部门 

2、一对多关联查询

        通过 <resultMap> 元素的子元素 <collection> 处理一对多级联关系,collection 可以将关联查询的多条记录映射到一个 list 集合属性中。

<collection> 元素中通常使用以下属性。

  •     property:指定映射到实体类的对象属性。
  •     column:指定表中对应的字段(即查询返回的列名)。
  •     javaType:指定映射到实体对象属性的类型。
  •     select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。
    <resultMap type="com.easy.bean.Department" id="departmentAndStaff">
		<!-- <id column="id" property="depid"></id> 
		<result column="name" property="depname"></result>-->
		
		<result column="id" property="id"></result>
		<collection column="id" select="getDepStaff" property="staffList">  
        </collection>
	</resultMap>
	<select id="getDepStaff" resultType="com.easy.bean.Staff">
		select * from staff where dep_id=#{id}
	</select>
	
	<select id="getDep" resultMap="departmentAndStaff">
		select * from department
	</select>

 一个部门有多个员工

3、resultType和resultMap的区别

         MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。        

七、MyBatis缓存(一级缓存和二级缓存)

        MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存 

1、一级缓存 

        一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 SQLSession 域内。当 session flush(刷新)或者 close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。默认开启

        在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

        由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

controller 中注解一个方法在同一会话中

    @GetMapping("dep")
	@Transactional
	public CommonResult getDep() {
		List<Department> list=dao.getDep();
		System.out.println("---------------");
		list=dao.getDep();
		return CommonResult.success();
	}

 注解启动类

@SpringBootApplication
@EnableTransactionManagement
public class EasySpringApplication {
	public static void main(String[] args) {
		SpringApplication.run(EasySpringApplication.class, args);
	}
}

2、二级缓存

         二级缓存是Mapper全局缓存,作用域超出 SQLsession 范围之外,基于mapper文件的namespace,也就是说多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace 相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中。手动开启。失效:①当Mapper中执行增删改操作时 ②刷新时间到

(1)二级缓存的配置

        <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" /> 

 (4)属性说明

 八、懒加载

        Mybatis的延迟加载又叫懒加载,也可以叫按需加载,是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来。Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来。

        一对多、多对多通常情况下采用延迟加载,多对一、一对一通常情况下采用立即加载。 

开启方式 

(1)在对应的<collection>或<association>标签上指定fetchType属性值为“lazy”

(2) 开启全局的延迟加载

或者在mybatis核心配置文件(mybatis-config.xml)中配置 

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值