前言
在Mybatis dao层实现基础增删改查,这里对 mybatis 配置进行说明和优化。
XML 配置(configuration)
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
配置之环境配置
在我之前的博客中有写过,这里将不再赘述;
- Mybatis 可以配置多个环境,但每个sqlSessionFactory 实例只能选择一种环境;
- Mybatis 默认的事务管理器是 JDBC ,默认连接池是 POOLED;
转载于:Mybatis中文链接:https://mybatis.net.cn/getting-started.html
配置之属性优化(properties)
我们可以通过 properties 属性来实现引用配置文件。这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
- 编写一个数据库配置文件:db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT
username=root
password=021001
- 优化 mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入外部配置文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/hb/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意事项:
- mybatis 配置文件,标签是有顺序的,必须按照其顺序排列;
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"
//上述括号中的标签顺序就是xml配置文件中标签的顺序;
- 在 xml 配置文件中的 properties 标签下可以增加一些属性配置,但如果两个文件有同一个字段,优先使用外部文件的配置(外部的优先级更高,会覆盖内部属性配置)
配置之别名优化(typeAliases)
- 类型别名可为 Java 类型设置一个缩写名字
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写
例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog
可以用在任何使用 domain.blog.Blog
的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一个在包 domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author
的别名为 author
;若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
...
}
这里对我们的 进行优化:
- 第一种:直接在标签中对我们的实体类起别名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入外部配置文件-->
<properties resource="db.properties"/>
<!--给实体类起别名-->
<typeAliases>
<typeAlias alias="User" type="com.hb.pojo.User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/hb/dao/UserMapper.xml"/>
</mappers>
</configuration>
然后修改 UserMapper.xml
中的 resultType
,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hb.dao.UserMapper">
<!--id 是namespace的方法名;resyultType 是sql语句的返回值-->
<select id="getUserList" resultType="User">
select * from mybatis.user;
</select>
<select id="getUserById" resultType="User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
<insert id="addUserInfo">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
<update id="updateUserInfo">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
<delete id="deleteUserInfo">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
- 第二种:指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
在实体类没有注解的情况下,扫描实体类的包,它的默认别名就为这个类的类名首字母小写;
<typeAliases>
<package name="com.hb.pojo"/>
</typeAliases>
在实体类有注解的情况下,即为实体类的注解中的别名;
@Alias("User")
public class User {
private int id;
private String name;
private String pwd;
...
...
}
<备注:在实体类比较少的情况下,使用第一种方式;如果实体类比较多,则考虑使用第二种>
设置(setting)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
Mybatis 中的 setting 描述了设置中各项设置的含义、默认值等的表:https://mybatis.net.cn/configuration.html#settings
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
mapper 映射器
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。
在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:///
形式的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL)不建议使用 -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
MapperRegistry:注册绑定我们的Mapper文件;
- 方式一、使用相对于类路径的资源引用【常用】:
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/hb/dao/UserMapper.xml"/>
</mappers>
-
方式二、使用 class 文件绑定注册:
<mappers> <mapper class="com.hb.dao.UserMapper"/> </mappers>
注意点:
- 接口和它的 Mapper 配置文件必须同名;
- 接口和它的 Mapper 配置文件必须在同一个包下;
-
方式三、将包内的映射器接口实现全部注册为映射器:
<mappers> <package name="com.hb.dao"/> </mappers>
注意点
- 接口和它的 Mapper 配置文件必须同名;
- 接口和它的 Mapper 配置文件必须在同一个包下;
其他配置
- typeHandlers(类型处理器)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
mybatis中文文档:typeHandlers(类型处理器)https://mybatis.net.cn/configuration.html#typeHandlers
- objectFactory(对象工厂)
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
mybatis中文文档:objectFactory(对象工厂)https://mybatis.net.cn/configuration.html#objectFactory
-
plugins(插件)
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。
mybatis中文文档:plugins(插件)https://mybatis.net.cn/configuration.html#plugins
- mybatis-generator-core
- mybatis-plus(更简化的 mybatis)
- 通用 mapper