前言:

本文内容:Map和模糊查询、配置属性优化、配置别名优化

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

可能遇到的错误

  • 标签不要匹配错
  • resource地址用/
  • 程序配置文件错误
  • 输出xml乱码报错
  • 空指针异常
  • maven资源异常

Map和模糊查询

假设,我们的实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

练习

UserMapper.java

1
2
// 使用map添加
int addMap(Map<String,Object> map);

UserMaper.xml

1
2
3
4
<!--    使用map添加-->
<insert id="addMap" parameterType="map">
insert into user(id,name,pwd) values (#{uid},#{username},#{password})
</insert>

UserMapperTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//    使用map添加
@Test
public void addMap(){
// 获取sqlsession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 执行
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 使用map添加
Map<String,Object> userMap = new HashMap<String, Object>();
userMap.put("uid",6);
userMap.put("username","小笨蛋");
userMap.put("password","xbd123");
int flag=mapper.addMap(userMap);
if(flag>0){
System.out.println("添加成功");
// 提交事务
sqlSession.commit();
}else{
System.out.println("添加失败");
}
// 关闭
sqlSession.close();
}

运行结果

1
2
3
添加成功

Process finished with exit code 0

Map传递参数,直接在sql中取出可以即可,不需要与表完全对应,更灵活

对象则必须与表的字段对应

不是很规范,但很实用

多个参数用Map或者注解

小拓展

使用MyBatis实现模糊查询

  • 方法一,在传参的时候拼接通配符,例(%value%),但是不安全,容易发生SQL注入
  • (推荐)方法二,在xml文件中直接拼接通配符%#{value}%,防止SQL注入

配置属性优化

核心配置文件

MyBatis 的配置文件包含了会深深影响它行为的设置和属性信息。

  • mybatis-config.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    配置文档的顶层结构如下:
    configuration(配置)
    properties(属性)*
    settings(设置)*
    typeAliases(类型别名)*
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)*
    environment(环境变量)*
    transactionManager(事务管理器)*
    dataSource(数据源)*
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)*

environments(环境配置)

MyBatis 可以配置成适应多种环境,尽管如此,每个 SqlSessionFactory 实例只能选择一种环境。

配置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>

注意一些关键点:

  • 默认使用的环境 ID(比如:default=“development”)。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
  • 事务管理器的配置(比如:type=“JDBC”)。
  • 数据源的配置(比如:type=“POOLED”)。

事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)

  • JDBC (默认)这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

  • MANAGED 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

    1
    2
    3
    <transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
    </transactionManager>

如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

数据源(dataSource)

有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”)

有池的处理方式很流行,能使并发 Web 应用快速响应请求

  • UNPOOLED 没有连接池
  • POOLED 默认 有连接池
  • JNDI

属性(properties)

可以通过properties来引用配置文件

设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值,例如核心配置文件中的连接池部分

1
2
3
4
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>

编写一个配置文件

db.properties

1
2
3
4
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
username=root
password=123456

在核心配置文件下引入(注意:xml中标签位置需按照官方要求的顺序来配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>
<!-- 引入db.properties-->
<!-- 也可以在标签里传值,但优先使用外部配置-->
<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.xml-->
<mapper resource="com/jokerdig/mapper/UserMapper.xml"/>
</mappers>
</configuration>

测试查询结果

1
2
3
4
5
6
id:1 name:admin 密码:123
id:2 name:abc 密码:123
id:3 name:def 密码:123
id:6 name:小笨蛋 密码:xbd123

Process finished with exit code 0

配置别名优化

类型别名(typeAliases)

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

写法一(具体的类)

1
2
3
4
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>

写法二(扫描包)

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。

1
2
3
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
1
2
3
4
@Alias("author")
public class Author {
...
}

例子

mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
.....
<!-- 配置别名 一-->
<typeAliases>
<typeAlias type="com.jokerdig.pojo.User" alias="User"/>
</typeAliases>
<!-- 配置别名 二-->
<typeAliases>
<package name="com.jokerdig.pojo"/>
</typeAliases>
.....

UserMapper.xml

1
2
3
4
5
6
.....
<!-- 查询语句 id对应接口方法名-->
<select id="getUserList" resultType="User">
select * from user
</select>
.....

测试运行

1
2
3
4
5
6
id:1 name:admin 密码:123
id:2 name:abc 密码:123
id:3 name:def 密码:123
id:6 name:小笨蛋 密码:xbd123

Process finished with exit code 0

Mybatis默认的别名

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte

设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true\false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true \false false
useColumnLabel 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 true \false true
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true \false False
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true\false False
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J / LOG4J / LOG4J2 / JDK_LOGGING / COMMONS_LOGGING / STDOUT_LOGGING / NO_LOGGING 未设置