MyBatis

MyBatis简介

MyBatis是一个持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
MyBatis_第1张图片

  • 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 );
	}
}

你可能感兴趣的:(mybatis,java)