【MyBatis】MyBatis基础教程(3)
前言:
本文内容:配置映射器说明、生命周期和作用域、ResultMap结果集映射
推荐免费MyBatis基础教程视频:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili
配置映射器说明
映射器(mappers)
MapperRegistry:注册绑定我们的Mapper文件
方式一(推荐使用)
1 | <mappers> |
方式二(不推荐使用)
1 | <!-- 使用完全限定资源定位符(URL) 不推荐使用 --> |
方式三
1 | <!-- 使用映射器接口实现类的完全限定类名 --> |
使用注意点:
- 接口和它的Mapper配置文件必须同名
- 接口和它的Mapper配置文件必须在同一个包下
方式四
1 | <!-- 将包内的映射器接口实现全部注册为映射器 --> |
使用注意点:
- 接口和它的Mapper配置文件必须同名
- 接口和它的Mapper配置文件必须在同一个包下
声明周期和作用域
生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题
SQLSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了。(局部变量)
SQLSessionFactory
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
- SqlSessionFactory 的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession
- 每个线程都应该有它自己的 SqlSession 实例
- SqlSession 的实例不是线程安全的,因此不能被共享
- 它的最佳的作用域是请求或方法作用域
- 使用完毕后应立即管理,防止资源占用
ResultMap结果集映射
解决数据库字段与实体类不一致问题
修改pojo中实体类字段,是的与数据库中不对应;
1 | ...... |
直接运行发现,修改后不对应的值查询结果为null
1 | User{id=1, username='null', password='null'} |
映射不匹配解决办法
-
起别名
1
2
3<select id="getUserById" parameterType="int" resultType="User">
select id,`name` as username,pwd as password from user where id=#{id}
</select>结果
1
2
3User{id=1, username='admin', password='123'}
Process finished with exit code 0 -
使用resultMap
resultMap:结果集映射
1
2id name pwd // (字段)
id username password // (实体类)UserMapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13<!--根据id查询用户-->
<select id="getUserById" parameterType="int" resultMap="userMap">
select * from user where id=#{id}
</select>
<!-- 设置resultMap-->
<!-- id 对应上方的userMap type 对应实体类,这里我们使用实体类别名User-->
<resultMap id="userMap" type="User">
<!-- column 对应数据库字段 property 对应实体类 -->
<!-- id 就是数据库的id result 就是除id外的其他-->
<id column="id" property="id"/>
<result column="name" property="username"/>
<result column="pwd" property="password"/>
</resultMap>运行结果(可以查询到)
1
2
3User{id=1, username='admin', password='123'}
Process finished with exit code 0
resultMap
-
resultMap
元素是 MyBatis 中最重要最强大的元素。 -
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
-
ResultMap
的优秀之处——你完全可以不用显式地配置它们。1
2
3
4
5<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>然后在引用它的语句中设置
resultMap
属性就行了(注意我们去掉了resultType
属性)1
2
3
4
5<select id="selectUsers" resultMap="userResultMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>如果这个世界总是这么简单就好了。
不简单
更复杂的使用情况请看一对多和多对一部分
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hey,Joker!
评论
ValineTwikoo