mybatis

1. MyBatis是什么?它的优点是什么?

MyBatis是一个持久层框架,它可以将Java对象和SQL语句进行映射,使得开发人员可以使用面向对象的方式操作数据库。它的优点包括:SQL语句与代码分离,易于维护;动态SQL支持,灵活性高;多种结果集的处理方式,方便开发;缓存机制,提高性能;插件机制,扩展性强。

2. MyBatis的工作流程是什么?

MyBatis的工作流程如下:首先,开发人员需要编写Mapper.xml文件,定义SQL语句和映射关系。然后,通过SqlSessionFactoryBuilder创建SqlSessionFactory,SqlSessionFactory是MyBatis的核心类,它负责创建SqlSession。SqlSession是MyBatis的一个接口,它提供了对数据库的操作方法。当需要进行数据库操作时,开发人员可以通过SqlSession获取Mapper对象,调用Mapper的方法进行数据库操作。在执行Mapper方法时,MyBatis会根据Mapper.xml文件中的配置生成对应的SQL语句,并执行SQL语句。最后,MyBatis将结果映射为Java对象并返回给开发人员。

3. # , $区别

#对传入的参数视为字符串,也就是它会预编译,被解析为一个参数占位符 。对数据加上单引号,优势可以防止sql 注入。
$ 相当于直接显示数据,进行变量替换 ,order by 动态传递时可以用 $ , 不可以防止sql 注入传递一个sql 语句 ,比如后面加上password =1 or 1=1. .形成sql 注入。

MyBatis的缓存机制是什么?有哪些缓存级别?

MyBatis的缓存机制可以分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,它的作用域是同一个SqlSession,当进行相同的查询时,MyBatis会先从缓存中查找,如果找到了就直接返回结果,没有找到则进行数据库查询,并将查询结果存入缓存中。
二级缓存是Mapper级别的缓存,它的作用域是同一个Mapper下的所有SqlSession。当进行相同的查询时,MyBatis会先从二级缓存中查找,如果找到了就直接返回结果,没有找到则进行数据库查询,并将查询结果存入二级缓存中。

  1. . mybaties 默认只开启一级缓存, 二级缓存需要手动开启,可以通过在Mapper.xml中添加标签启用,并设置相应的属性。
    .
    也可以简写成

springboot 引入依赖后是默认开始二级缓存的,

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0

需要在各个Mapper 命名空间中进行进一步设置。
1、映射语句文件中的所有 select 语句将会被缓存。
2、映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
3、缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
4、根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序来刷新。
5、缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
6、缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
可用的清除策略有:

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

2)对于sql语句存在与接口注解中,需要在该接口类中添加如下注解:
@CacheNamespace Mapper 接口类上

3)需要注意的是,二级缓存的使用需要满足以下条件:
映射语句的返回值必须是可序列化的。
查询语句不能包含动态SQL。
在映射语句中不能使用ResultMap的继承。
在映射语句中不能使用嵌套查询。
在映射语句中不能使用存储过程。
4)
MyBatis的缓存机制是先查一级缓存再查二级缓存的。再查数据库,并将结果存放一级二级缓存。需要注意的是,如果我们在执行数据库更新操作(例如insert、update、delete)时,就会清空当前SqlSession的一级缓存和二级缓存,避免脏数据的产生。

MyBatis的动态SQL是什么?有哪些动态SQL标签?
MyBatis的动态SQL可以根据条件动态生成SQL语句,在不同的条件下生成不同的SQL语句,从而实现灵活的查询和更新操作。MyBatis的动态SQL标签包括:if、choose、when、otherwise、trim、where、set、foreach。

MyBatis的插件机制是什么?如何编写自定义插件?
MyBatis的插件机制可以在MyBatis的执行过程中拦截方法调用,并对方法进行增强。开发人员可以通过MyBatis提供的Interceptor接口编写自定义插件,并通过在MyBatis配置文件中添加插件配置来启用自定义插件。自定义插件需要实现Interceptor接口,并重写intercept方法来对方法进行增强。在intercept方法中,可以通过Invocation对象获取当前方法的信息,然后根据需要对方法进行增强。

语法:

and numlike CONCAT('%',#{map.num},'%') SQL 中可以传递map parameterType="HashMap" ,Mybaties 语法 if test= 判断是否成立 , CONCAT 拼接字符串 select concat_ws(',','11','22','33'); 第一个参数是其他的分隔号 select concat_ws('NULL','11','22','33'); //=> NULL , 如果分隔符为NULL,那么结果也为NULL,函数会忽略任何分隔符参数后的NULL值 select concat_ws(',','11','22','33',NULL);// =>11,22,33 如果是null 会忽略null

select id,group_concat(name separator ‘;’) from aa group by id; // sql: 以id分组,把name字段的值打印在一行,分号分隔 ,id 相同的, 所有的name 拼接, “,” 分隔。=? 1 name1,name2

- Spring集成MyBatis

引入MyBatis和Spring的依赖,例如:
复制

org.mybatis mybatis 3.5.6 org.springframework spring-core 5.3.9 org.springframework spring-jdbc 5.3.9 配置数据源 在Spring的配置文件中配置数据源,例如: 配置SqlSessionFactory 在Spring的配置文件中配置SqlSessionFactory,例如: 其中,typeAliasesPackage指定实体类所在的包,mapperLocations指定Mapper文件所在的位置。

配置MapperScannerConfigurer
在Spring的配置文件中配置MapperScannerConfigurer,例如:



其中,basePackage指定Mapper接口所在的包。

编写Mapper接口和Mapper.xml
编写Mapper接口和Mapper.xml文件,例如:

public interface UserMapper {
User getUserById(int id);
}

select * from user where id = #{id}

注入Mapper
在需要使用Mapper的地方注入Mapper,例如:
@Autowired
private UserMapper userMapper;
至此,Spring集成MyBatis的配置完成,可以愉快地使用MyBatis了。

Spring Boot集成MyBatis

比起spring 少依赖spring ,jdbc jar ,不需要dataSource ,sqlSessionFactory配置文件, 可以直接在properties 配置db 信息。
添加MyBatis和MyBatis-Spring-Boot-Starter依赖。在pom.xml文件中添加以下依赖:

<dependency>    
	<groupId>org.mybatis.spring.boot</groupId>    
	<artifactId>mybatis-spring-boot-starter</artifactId>  
     <version>${mybatis-spring-boot-starter.version}</version>
  </dependency>

配置数据源。在application.properties文件中添加数据库连接信息,例如

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

创建Mapper接口和XML文件。
在Mapper接口中定义SQL操作,例如:
@Mapperpublic interface UserMapper { @Select(“SELECT * FROM user WHERE id = #{id}”)
User findUserById(@Param(“id”) int id);}
在Mapper XML文件中实现SQL操作,例如:


SELECT * FROM user WHERE id = #{id}

<resultMap id="BaseResultMap" type="com.aia.nbstp.entity.nb.Task" >
     <result column="BatchName" property="batchname" jdbcType="VARCHAR" />
         <result column="TaskStatus" property="taskstatus" jdbcType="INTEGER" />
         <result column="LastUpdateDate" property="lastupdatedate" jdbcType="TIMESTAMP" />
         ....
</resultMap>

<sql id="Base_Column_List" >
     BatchName, TaskNumber, .....LastUpdateDate
</sql>
<select id="selectByInput" resultMap="BaseResultMap" parameterType="HashMap">
</select>
 <update id="rerunTask" parameterType="com.aia.nbstp.entity.nb.Task" >
    <if test="name!= null and name!= '' and  num!= null and num!= ''" >
        update tablename set ProcessRerunable=1 where num=#{num,jdbcType=VARCHAR} 
    </if>
</update>

将Mapper接口注入到Service层中。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findUserById(int id) { return userMapper.findUserById(id); }}

jdbc/mybatis/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?> jdbc/mybatis/mybatis.properties mybatis.mapperLocations = classpath:jdbc/mybatis/mapper/*.xml,jdbc/mybatis/mapper/ods/*.xml mybatis.typeAliasesPackage = com.aia.*.infra.repository.entity mybatis.configLocation = classpath:jdbc/mybatis/mybatis-config.xml

Mybatis四大核心对象及四大内置对象

MyBatis完成一次数据库操作需要经过的步骤,如下:

1、加载配置文件
2、获取SqlSessionFactoryBuiler对象
3、通过SqlSessionFactoryBuiler和配置文件流来获取SqlSessionFactory对象
4、利用SqlSessionFactory对象来打开一个SqlSession
5、通过SqlSession来获得对应的Mapper对象
6、通过Mapper对象调用对应接口来查询数据库
从这些步骤我们可以看到,MyBatic完成一次数据库操作主要有4大核心对象:
SqlSessionFactoryBuiler,SqlSessionFactory,SqlSession、Mapper

原文链接:https://blog.csdn.net/kouguoguo/article/details/128341069
mybatis四大核心对象

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值