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类)属性名和(数据库)字段名不一致的问题
问题产生:
l
我们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,因为其它的都字段和属性都是对应的)