
生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了。
- 局部变量
SqlSessionFactory
- 说白了就是可以想象为:数据库连接池
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- 因此SqlSessionFactory 的最佳作用域是应用作用域。
- 最简单的就是使用单例模式或者静态单例模式。
SqlSession
- 连接到池的一个请求!
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后感觉关闭,否则资源被占用!

一个池子有多个线程,每一个线程都是独享的,不能够共享。每一个SqlSession 都会去连接Mapper,这里面的每一个Mapper,就代表一个具体的业务!(SQL)

参考:
plain
https://mybatis.org/mybatis-3/zh_CN/getting-started.html
问题
数据库中的字段

新建一个项目,拷贝之前的,测试实体类字段不一致的!
java
public class user {
private int id;
private String name;
private String password;
测试出现问题

java
select * from mybatis.user where id=#{id};
//类型处理器
select id,name,pwd from mybatis.user where id=#{id};
解决方法:
- 起别名
UserMapper.xml 中
xml
<select id="getUserById" parameterType="int" resultType="user">
select id,name,pwd as password from mybatis.user where id=#{id};
</select>
resultMap
结果集映射
xml
id name pwd
id name password
UserMapper.xml 中
xml
<!-- 结果集映射
id是属性,用来给应用的,type指定类名-->
<resultMap id="UserMap" type="user">
<!--列column指的是数据库中的字段,属性property指的是实体类中的属性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<!--数据库中的列是pwd,实体类中的属性是password,进行结果集映射-->
<result column="pwd" property="password"/>
</resultMap>
<!--<select id="对应UserMapper的方法" resultType="实体类">-->
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id=#{id};
</select>

<font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">resultMap</font>元素是 MyBatis 中最重要最强大的元素- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
<font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">ResultMap</font>的优秀之处------你完全可以不用显式地配置它们- 如果这个世界总是这么简单就好了。
参考:
plain
官方文档:https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html