MyBatis - 基础学习4 - xml的核心配文件(优化)

一.别名

  • 类型别名可为 Java 类型设置一个缩写名字。
  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写

1.利用typealiases来实现

   <typeAliases>
       <typeAlias type="top.lostyou.pojo.User" alias="user"/>
   </typeAliases>

 

2.利用page

指定一个包名,MyBatis会在包名下面搜索需要的Javabean,比如:

扫描实体类的包,它默认别名就是这个类名,首字母要小写

   <typeAliases>
       <package name="top.lostyou.pojo"/>
   </typeAliases>

 

使用范围:

  • 在实体类比较少的时候,使用第一种方式
  • 在实体类十分多的时候使用第二种
  • 第一种可以DIY,第二种不可以自己设置,如果非要改,需要在实体类上面增加注解

二.设置(setting)

mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。

这是自动开启数据库的驼峰命名:

数据库:last_Name

Java:lastName

拓展:数据库用下划线命名是因为最早的数据库oracle会把命名全部转换为大写

命名:lastName

oracle:LASTNAME

辨识度十分低,所以后来的数据库命名默认使用下划线分割,oracle:LAST_NAME

三.映射器(mappers)

1.使用资源路径进行引用

每一个mapper.xml都需要在mybatis的核心配置文件中注册!

<mappers>
<mapper resource="top/lostyou/dao/UserMapper.xml"/>
</mappers>

 

2.使用Class文件绑定注册

代码1

<mappers>
<mapper class="top.lostyou.dao.UserMapper"/>
</mappers>

 

代码2

<mappers>
<mapper class="top.lostyou.dao.UserDao"/>
</mappers>

 

注意点:

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

如果想代码2那样,就会找不到接口

3.使用扫描包进行注册

<mappers>
<package name="top.lostyou.dao"/>
</mappers>

 

注意点:

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

三.作用域(Scope)和生命周期

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

1.SqlSessionFactoryBuilder:

一旦创建了 SqlSessionFactory,就不再需要它了

2.SqlSessionFactory:可以理解为数据库连接池

一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例

因此 SqlSessionFactory 的最佳作用域是应用作用域。(全局作用域)

3.SqlSession:连接到连接池的请求

SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域

用完就需要关闭,如果不关闭,就会一直占用资源,SqlSessionFactory的可用数越来月少

 

 

 

这里面的mapper都代表着一个业务

四.解决(Java类)属性名和(数据库)字段名不一致的问题

问题产生:

 

 

 我们Java的实体类和数据库对应的字段名不同,导致的结果是

 

 我们的查询结果为空

解决方式一:给我们的password在sql语句中取别名:password  AS pwd

这种方式老套,操作不好看,不建议使用

解决方式二:利用resultMap结果集映射

<mapper namespace="top.lostyou.dao.UserMapper">
    <!--id = 映射的结果集名   type =  映射给谁,一般是Java中的实体类-->
    <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="getList" resultMap="usermap">
        select * from mybatis.user WHERE id =#{id}
    </select>
</mapper>

 

  • resultMap 元素是 MyBatis 中最重要最强大的元素
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了(上面那个例子可以只映射 password,因为其它的都字段和属性都是对应的)

 

posted @ 2022-11-16 20:37  回忆也交给时间  阅读(42)  评论(0编辑  收藏  举报