MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。它避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
一、环境搭建
1.1全局环境配置
1.transacionManager
type=”[JDBC|MANAGED]”
两种类型:
- JDBC 使用原生JDBC管理事务
- MANAGER 将事务的管理权移交给容器
在MyBatis中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):JDBC– 这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED–这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将
closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
1. <transactionManager type="MANAGED">
2. <property name="closeConnection" value="false"/>
3. </transactionManager>
提示如果你正在使用Spring+MyBatis,则没有必要配置事务管理器,因为Spring 模块会使用自带的管理器
来覆盖前面的配置。
2.dataSource
type=”[UNPOOLED|POOLED|JNDI]”
- UNPOOLED 不适用数据库连接池
- POOLED 使用数据链接池
- JNDI java命名目录接口技术
UNPOOLED具有如下属性:
driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
defaultNetworkTimeout – The default network timeout value in milliseconds to wait
for the database operation to complete. See the API documentation of
java.sql.Connection#setNetworkTimeout() for details.作为可选项,你也可以传递属性给数据
库驱动。只需在属性名加上“driver.”前缀即可,例如:
driver.encoding=UTF8这将通过DriverManager.getConnection(url,driverProperties) 方法
传递值为 UTF8 的 encoding 属性给数据库驱动。
POOLED需要更多的属性:
poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:
10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:
20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新
尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一
个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试
重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与
poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO
PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL
语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时
时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled
为 true 时适用)。
二、mybatis.xml文件配置
mybatis能自动映射数据库列名与po类属性名,要求查询时列名和属性名要一致。同时他又提供了一个数据库字段下划线映射到java对象的驼峰式命名属性的功能,默认关闭,需要自行在 settings中设置,environments中则进行设置数据库连接信息,mappers中设置映射器
<?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>
<settings>
<!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="development">
<!-- 声明可使用的环境 -->
<environment id="development">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_orm?useSSL=false&serverTimezone=UTC&characterEncording=utf-8&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xxbb/mapper/UserMapper.xml"/>
</mappers>
</configuration>
三、查询方式测试
Test.java
扫描二维码关注公众号,回复:
10084040 查看本文章
public class Test {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// 工厂模式生产Session对象 ,实例化工厂对象时使用构建者模式
//构建者模式存在的意义:简化实例构造的过程
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 生产SqlSession,封装了CRUD方法
SqlSession session = factory.openSession();
//集合数据
List<User> users = session.selectList("com.xxbb.mapper.UserMapper.queryUser", null);
System.out.println(users);
//一行一列
String username=session.selectOne("com.xxbb.mapper.UserMapper.queryById",1);
System.out.println(username);
//map数据
Map<Object, Object> res=session.selectMap("com.xxbb.mapper.UserMapper.queryMap", "username");
System.out.println(res);
session.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
UserMapper.xml
<?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">
<!-- namespace理解为实现类的全路径 包加类名 -->
<mapper namespace="com.xxbb.mapper.UserMapper">
<!-- id对应java代码中填入的方法名
如果方法的返回值是List,在resultType写List的泛型,
因为mybatis是对JDBC封装,一行一行读取数据
-->
<select id="queryUser" resultType="com.xxbb.pojo.User">
select * from t_user
</select>
<select id="queryById" resultType="String">
select username from t_user where id=#{id}
</select>
<select id="queryMap" resultType="com.xxbb.pojo.User">
select * from t_user
</select>
</mapper>
User属性
/**
* @ClassName: User
* @Description: TODO(这里用一句话描述这个类的作用)
* @author AlwaysXu
*
*/
package com.xxbb.po;
public class User{
private int id;
private String username;
private String password;
private int ifFreeze;
}
1.selectList(),返回值为List<resultType 属性控制>,适用于查询结果都需要遍历的需求
Java代码:
SqlSession session = factory.openSession();
List<User> users =session.selectList("com.xxbb.mapper.UserMapper.queryUser", null);
System.out.println(users);
对应xml:
<select id="queryUser" resultType="com.xxbb.pojo.User">
select * from t_user
</select>
2.selectOne() ,返回值Object,适用于返回结果为一个变量或一行数据
Java代码:
String username=session.selectOne("com.xxbb.mapper.UserMapper.queryById",1);
System.out.println(username);
对应xml:
<select id="queryById" resultType="String">
select username from t_user where id=#{id}
</select>
3selectMap() ,返回值Map,适用于需求需要在查询结果中通过某列的值获取到这行数据的需求。Map<key,resultType 属性控制>,
Java代码:
Map<Object, Object> res=session.selectMap("com.xxbb.mapper.UserMapper.queryMap", "username");
System.out.println(res);
对应xml:
<select id="queryMap" resultType="com.xxbb.pojo.User">
select * from t_user
</select>
三种结果查询方式的运行结果: