mybatis__生命周期和作用域

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

![1569660357745](Mybatis课堂笔记.assets/1569660357745.png)

生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的**并发问题**。

**SqlSessionFactoryBuilder:**

- 一旦创建了 SqlSessionFactory,就不再需要它了
- 局部变量

**SqlSessionFactory:**

- 说白了就是可以想象为 :数据库连接池
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,**没有任何理由丢弃它或重新创建另一个实例。**
- 因此 SqlSessionFactory 的最佳作用域是应用作用域。
- 最简单的就是使用**单例模式**或者静态单例模式。

**SqlSession**

- 连接到连接池的一个请求!
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后需要赶紧关闭,否则资源被占用!

![1569660737088](Mybatis课堂笔记.assets/1569660737088.png)

这里面的每一个Mapper,就代表一个具体的业务!



## 5、解决属性名和字段名不一致的问题

### 1、 问题

数据库中的字段

![1569660831076](Mybatis课堂笔记.assets/1569660831076.png)

新建一个项目,拷贝之前的,测试实体类字段不一致的情况

```java
public class User {
    
    private int id;
    private String name;
    private String password;
}
```

测试出现问题

![1569661145806](Mybatis课堂笔记.assets/1569661145806.png)



```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` 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。
-  如果世界总是这么简单就好了。

posted @ 2021-04-17 21:11  琴湖copy王  阅读(55)  评论(0)    收藏  举报