前言:

推荐免费MyBatis基础教程视频:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili

配置映射器说明

映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件

方式一(推荐使用)

1
2
3
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>

方式二(不推荐使用)

1
2
3
4
<!-- 使用完全限定资源定位符(URL) 不推荐使用 -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

方式三

1
2
3
4
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>

使用注意点:

  • 接口和它的Mapper配置文件必须同名
  • 接口和它的Mapper配置文件必须在同一个包下

方式四

1
2
3
4
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>

使用注意点:

  • 接口和它的Mapper配置文件必须同名
  • 接口和它的Mapper配置文件必须在同一个包下

声明周期和作用域

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

image-20220427141832027

SQLSessionFactoryBuilder

  • 一旦创建了 SqlSessionFactory,就不再需要它了。(局部变量)

SQLSessionFactory

  • 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
  • SqlSessionFactory 的最佳作用域是应用作用域
  • 最简单的就是使用单例模式或者静态单例模式

SqlSession

  • 每个线程都应该有它自己的 SqlSession 实例
  • SqlSession 的实例不是线程安全的,因此不能被共享
  • 它的最佳的作用域是请求或方法作用域
  • 使用完毕后应立即管理,防止资源占用

ResultMap结果集映射

解决数据库字段与实体类不一致问题

修改pojo中实体类字段,是的与数据库中不对应;

1
2
3
4
5
......
private int id;
private String username;
private String password;
.......

直接运行发现,修改后不对应的值查询结果为null

1
2
3
User{id=1, username='null', password='null'}

Process finished with exit code 0

解决办法

  • 起别名

    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
    3
    User{id=1, username='admin', password='123'}

    Process finished with exit code 0
  • 使用resultMap

    resultMap:结果集映射

    1
    2
    id     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
    3
    User{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>

    如果这个世界总是这么简单就好了。 不简单

更复杂的使用情况请看一对多和多对一部分