MyBatis中的mapper执行时会新建SqlSession吗?

为什么会有这个问题?

昨天看了会儿Mysql的八股文,发现Mysql服务端用的是BIO模式,再一想:诶,难道一个web应用会建立多个连接吗?我咋在SpringBoot中从来没用过关于数据库连接的代码呢?
看了一下JDBC,发现JDBC中确实是手动来写管理Connection的代码的,那MyBatis又是咋做的呢?

MyBatis

在原生的MyBatis里面,SqlSession都是手动控制的,比如官网的例子就是这样:
在这里插入图片描述
在这里插入图片描述
同时官网也说了建议一个线程对应一个SqlSession。这个比较好理解,如果多个事务共用一个SqlSession的话,那就做不到相互隔离了。同时,因为tomcat将一个http请求对应一个线程,所以一个http请求对应一个SqlSession。

MyBatis-Plus

使用mp时,可以发现没有手动创建SqlSession的过程了,都是直接注入一个Mapper就开干,那么SqlSession什么时候会创建呢?
参考这个文章:https://www.zhihu.com/question/57568941
总结概括一下就是:Mapper中的方法都被代理了,执行前会先调用getSqlSession方法,执行后调用closeSqlSession方法。
getSqlSession会查看当前线程的ThreadLocal中有没有SqlSession,有的话就直接用,没有的话就新建一个;closeSqlSession也会查看当前线程的ThreadLocal中有没有SqlSession,有的话就啥也不干,没有的话就关闭当前session。
那么什么时候当前线程的ThreadLocal中会有SqlSession呢?当方法开启@Transactional注解时,方法会被代理,此时Spring就会自动创建一个SqlSession保存起来。

MyBatis中配置mapper接口和XML文件的关联,通常需要遵循以下步骤: 1. 创建Mapper接口:首先,你需要创建一个普通的Java接口,这个接口中定义了各种你需要执行的数据库操作方法。例如,如果你要操作用户表,可以定义一个名为UserMapper的接口。 2. 编写XML映射文件:接着,你需要编写一个与Mapper接口同名的XML文件,通常放在与Mapper接口相同的包路径下。在这个XML文件中,你需要配置具体的SQL语句,并通过`<select>`、`<insert>`、`<update>`、`<delete>`等标签来定义各个方法对应的SQL操作。例如,如果UserMapper接口中有一个方法是获取用户信息,那么在UserMapper.xml中就会有一个`<select>`标签对应的SQL查询语句。 3. 配置文件关联:为了让MyBatis知道mapper接口和XML文件之间的关系,你需要在MyBatis的全局配置文件(通常是mybatis-config.xml)中,使用`<mappers>`标签来注册mapper接口的位置。可以通过`<mapper resource="完整路径/UserMapper.xml"/>`来指定XML文件的位置。 4. 使用SqlSessionFactoryBuilder构建SqlSessionFactory:MyBatis使用SqlSessionFactory来构建SqlSession,而SqlSession负责实际的数据库操作。你需要使用SqlSessionFactoryBuilder来根据MyBatis全局配置文件构建SqlSessionFactory。 5. 通过SqlSession获取Mapper代理:通过SqlSession对象,你可以调用getMapper()方法,并传入Mapper接口的Class对象,从而获取到这个接口的动态代理对象。之后就可以直接调用接口方法,MyBatis会根据提供的信息完成SQL的执行。 示例代码如下: **UserMapper.java** ```java public interface UserMapper { User selectUserById(int id); int insertUser(User user); // 其他方法... } ``` **UserMapper.xml** ```xml <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.model.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO users(name, age) VALUES (#{name}, #{age}) </insert> <!-- 其他SQL配置... --> </mapper> ``` **mybatis-config.xml** ```xml <configuration> <!-- 其他配置... --> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> <!-- 其他mapper配置... --> </mappers> </configuration> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值