MyBatis简介
MyBatis是一个持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
- mybatis-config.xml时mybatis的核心配置文件,通过他的配置可以生成SqlSessionFactory工厂对象
- 基于SqlSessionFactory工厂可以生成SqlSession对象
- SqlSession对象可以发送SQL去执行并返回结果
- Executor是SqlSession底层对象用于执行SQL语句
- MapperStatement也是SQLSession低等对象,可以用来接收输入映射(用户输入的参数)和作出输出映射(Sql查询结果)
Mybatis与传统JDBC对比
传统JDBC
- 使用传统JDBC会有大量重复代码
- JDBC本身没有连接池,会频繁创建关闭连接效率低
- Sql写死在程序中
- 查询SQL返回的结果是ResultSet对象,需要手动处理
使用MyBatis - Mybatis对JDBC进行封装,可以简化代码
- Mybatis自身支持连接池,可以提高效率
- MyBatis是将SQL配置在Mapper文件中,修改SQL修改配置文件就可以,不需要重新编译
- MyBatis会将查询结果转换成java对象
MyBatis的编程步骤
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过SqlSession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭事务
MyBatis优缺点
优点
- 易于上手掌握
- Sql写在xml里利于管理和优化
- 减少Sql与代码的耦合
- 提供xml标签,支持动态Sql( )
缺点 - Sql工作量大
- Sql依赖于数据库,数据库移植性差
导入依赖包
<dependencies>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- 整合log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
</dependencies>
Mybatis-config.xml配置文件
Mybatis-config.xml是MyBatis的全局配置文件src/main/resources
- environments : 可以配置多个环境(environment)每种环境可以做不同配置或连接不同数据库开发、测试、生产环境可能需要不同的配置,连接的数据库可能也不相同,因此我们可以配置三个environment,分别对应上面三种不同的环境
- environment配置 :内部可以配置多种配置信息,事务管理配置(`transactionManage)和数据源(dataSource)配置
- transactionManage事务管理器 : Mybatis中有两种事务管理方式(type="[JDBC|MANAGED])JDBC:直接使用JDBC的提交和回滚设置,他依赖数据源的到的连接来管理事务范围;MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。需要自己手动添加并管理 不经常使用
- dataSource 数据源 即连接池配置 使用type指定数据源类型
JNDI:已过时,不推荐使用!
POOLED:使用连接池,mybatis会创建连接池,并从连接池中获取连接访问数据库,在操作完成后,将会把连接返回连池。
UNPOOLED:不使用连接池,该方式适用于只有小规模数量并发用户的简单应用程序上 - Mapper: 用于导入Mapper文件位置,可以配置多个
<?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">
<!-- MyBatis的全局配置文件 -->
<configuration >
</configuration>
Mybatis详细配置
<!-- MyBatis的全局配置文件 -->
<configuration >
<!-- 1.配置环境,可配置多个环境(比如:develop开发、test测试) -->
<environments default="develop">
<environment id="develop">
<!-- 1.1.配置事务管理方式:JDBC/MANAGED
JDBC:将事务交给JDBC管理(推荐)
MANAGED:自己管理事务
-->
<transactionManager type="JDBC"></transactionManager>
<!-- 1.2.配置数据源,即连接池 JNDI/POOLED/UNPOOLED
JNDI:已过时
POOLED:使用连接池(推荐)
UNPOOLED:不使用连接池
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yonghedb?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 2.导入Mapper配置文件,如果mapper文件有多个,可以通过多个mapper标签导入 -->
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
添加Mapper.xml
- (1)第1行是xml的文档声明,用于声明xml的版本和编码
- (2)第2、3、4行,引入了xml约束文档,当前xml文档将会按照mybatis-3-mapper.dtd文件所要求的规则进行书写。
- (3)Mapper标签:根标签,其中namespace(名称空间,也叫命名空间),要求不能重复。在程序中通过【namespace + id 】定位到要执行哪一条SQL语句
位置src/main/resource - (4)select标签 用于制定执行的各种SQL语句包括id , resultType,resultMap
<?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值应该保证唯一
在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句
-->
<mapper namespace="EmpMapper">
<!-- 通过select、insert、update、delete标签声明要执行的SQL -->
<select id="findAll" resultType="com.tedu.pojo.Emp">
select * from emp
</select>
</mapper>
测试
- 1.读取Mybatis核心配置文件(mybatis-config.xml)
InputStream in = Resources.getResourceAsStream(“mybatis-config.xml”); - 2.通过配置信息获取SQLSessionFactory工厂对象
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build( in ); - 3.通过工厂对象获取SqlSession对象
SqlSession session = fac.openSession(); - 4.通过namespace+id找到要执行的sql语句并执行sql语句
List list = session.selectList(“EmpMapper.findAll”);
@Test
public void findAll() throws IOException {
//1.读取mybatis的核心配置文件(mybatis-config.xml)
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.通过配置信息获取一个SqlSessionFactory工厂对象
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build( in );
//3.通过工厂获取一个SqlSession对象
SqlSession session = fac.openSession();
//4.通过namespace+id找到要执行的sql语句并执行sql语句
List<Emp> list = session.selectList("EmpMapper.findAll");
//5.输出结果
for(Emp e : list) {
System.out.println( e );
}
}