mybatis__生命周期和作用域
### 8、生命周期和作用域

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

这里面的每一个Mapper,就代表一个具体的业务!
## 5、解决属性名和字段名不一致的问题
### 1、 问题
数据库中的字段

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

```xml
// select * from mybatis.user where id = #{id}
//类型处理器
// select id,name,pwd from mybatis.user where id = #{id}
```
解决方法:
- 起别名
```xml
<select id="getUserById" resultType="com.kuang.pojo.User">
select id,name,pwd as password from mybatis.user where id = #{id}
</select>
```
### 2、resultMap
结果集映射
```
id name pwd
id name password
```
```xml
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--column数据库中的字段,property实体类中的属性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id = #{id}
</select>
```
- `resultMap` 元素是 MyBatis 中最重要最强大的元素
- ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
- `ResultMap` 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。
- 如果世界总是这么简单就好了。
浙公网安备 33010602011771号