MyBatis入门学习(一)——入门配置和简单查询

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&amp;serverTimezone=UTC&amp;characterEncording=utf-8&amp;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>

三种结果查询方式的运行结果:
在这里插入图片描述

发布了24 篇原创文章 · 获赞 4 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44804750/article/details/104958520