2.MyBatis(未完成)

版权声明:沉默の蟋蟀 https://blog.csdn.net/qq_17776439/article/details/84305165

 

目录

 

1. 初识MyBatis

1.1 优点和缺点

1.2 MyBatis主要组成

1.3 持久化与ORM

1.3.1 持久化

1.3.2 ORM(Object Relational Mapping)

2. 简单框架搭建

2.1 核心配置文件配置

2.2 实体类和映射文件

2.3. 核心对象的创建

2.3.1 SqlSessionFactoryBuilder

2.3.2 SqlSessionFactory

2.3.3 SqlSession

2.3.4 SqlSession的两种使用方式


1. 初识MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

官方网站:http://mybatis.org

ORM框架:实体类和SQL语句之间建立映射关系

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目

1.1 优点和缺点

优点

  • 简单的持久化框架,小巧并简单易学
  • 灵活, 不会对应用程序或者数据库的现有设计强加任何影响
  • SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
  • 提供XML标签,支持编写动态SQL
  • 提供映射标签,支持对象与数据库的ORM字段映射
  • 提供对象关系映射标签,支持对象关系组建维护

缺点

  • SQL语句编写工作量大,对开发人员有一定要求
  • 数据库移植性差

1.2 MyBatis主要组成

  • MyBatis的核心对象
    • SqlSessionFactoryBuilder(构造器)
      • SqlSessionFactory(工厂)
      • SqlSession(类似于JDBC的Connection)
      • SqlMapper(映射器)
  • 配置文件
    • mybatis-config.xml  系统核心配置文件
    • mapper.xml  SQL映射文件

1.3 持久化与ORM

1.3.1 持久化

持久化是程序数据在瞬时状态和持久状态间转换的过程

1.3.2 ORM(Object Relational Mapping)

编写程序的时候,以面向对象的方式处理数据

保存数据的时候,却以关系型数据库的方式存储

ORM解决方案包含下面四个部分

  • 在持久化对象上执行基本的增、删、改、查操作
  • 对持久化对象提供一种查询语言或者API
  • 对象关系映射工具
  • 提供与事务对象交互、执行检查、延迟加载以及其他优化功能

2. 简单框架搭建

注:不是最优化方案,只是一个方便学习的实例。

  1. 下载mybatis-3.2.x.jar包并导入工程
  2. 编写MyBatis核心配置文件
  3. 创建实体类-POJO
  4. DAO层-SQL映射文件(XxxMapper.xml)
  5. 创建测试类

2.1 核心配置文件配置

核心文件

<?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>
	<!-- 加载外部配置文件(常用),也可以用properties元素的子元素进行配置(不常用) -->
	<properties resource="datasource.properties"></properties>
	<!-- 设置选项,用于设置和改变MyBatis 运行中的行为 -->
	<settings>
		<!-- 日志配置 -->
		<setting name="logImpl" value="LOG4J" />
		<!-- 设置查询数据库超时时间 (默认值:Not Set (null)) -->
		<setting name="defaultStatementTimeout" value="25000" />
		<!-- 指定 MyBatis 是否以及如何自动将列映 射到字段/属性。 PARTIAL(默认): 只是自动映射简单、非嵌套 的结果集。 FULL: 
			将会自动映射任何复杂的(嵌套 或非嵌套)的结果集 -->
		<setting name="autoMappingBehavior" value="FULL" />

		<!-- 除了需求外,以下属性一般无需特意配置 -->
		<!-- 全局性地启用或禁用所有在mapper配置文件中配置的缓存。(默认值:true) -->
		<setting name="cacheEnabled" value="true" />
		<!-- 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。(默认值:true) -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 允许或禁止从单一的语句返回多个结果集(默认值:true) -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 使用列的标签而不是列的名称(默认值:true) -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允许JDBC自动生成主键(默认值:false) -->
		<setting name="useGeneratedKeys" value="false" />
		<!-- 是否启用字节码增强机制 -->
		<setting name="enhancementEnabled" value="false" />
		<!-- 配置默认的执行器(executor)。 SIMPLE(默认):简单的执行器。 REUSE :重用prepared statements的 
			执行器。 BATCH:重用 statements并且进行批量 更新的执行器。 -->
		<setting name="defaultExecutorType" value="SIMPLE" />
	</settings>
	<!-- 实体类型别名配置,减少输入多余的完整类名 -->
	<typeAliases>
		<!-- <typeAlias alias="Student" type="cn.kgc.pojo.Student"/> 别名匹配,比较繁琐,不推荐使用 -->
		<!-- 包名匹配 -->
		<package name="cn.cs.pojo" />
	</typeAliases>

	<!-- 不常用配置,本实例没有配置 -->
	<!--typeHandlers:重写类型处理器(type handlers)后,在此配置映射 -->
	<!-- objectFactory:重写 ObjectFactory后,在此配置映射 -->

	<!-- 插件配置:需要时配置 -->
	<plugins>
		<!-- 分页插件配置 -->
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			<property name="helperDialect" value="mysql" />
		</plugin>
	</plugins>
	<!-- 运行环境配置。可以配置多个运行环境,但是每个SqlSessionFactory 实例只能选择一个运行环境。 -->
	<environments default="development">
		<environment id="development">
			<!-- 事物管理器 -->
			<transactionManager type="JDBC"></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>
	<!-- SQL映射类配置,减少输入多余的完整类名 -->
	<mappers>
		<!-- <mapper resource="cn/kgc/dao/StudentMapper.xml"/> 全名称匹配,不推荐使用 -->
		<!-- 包名匹配 -->
		<package name="cn.cs.dao" />
	</mappers>
</configuration>

database.properties数据库配置

driverClassName=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8
username=root
password=root

补充:

属性能够被可动态替换(即使用占位符)的属性值引用 如:${driver},引用properties配置文件键后的值

2.2 实体类和映射文件

sql映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.kgc.dao.StudentMapper">
    <select id="getStudents" resultType="Student">
        select * from student
    </select>
    <update id="updateStu" parameterType="Student">
        update student set sName=#{sName} where id = #{id}
    </update>
    <delete id="addStu" parameterType="Student">
        insert into student(sName,age,addres) values(#{sName},#{age},#{addres})
    </delete>
    <insert id="delstu">
        delete from student where id = #{id}
    </insert>
</mapper>

实体类

public class Student {
	private int id;
	private String sName;
	private int age;
	private String addres;
	public Student() {
		super();
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getsName() {
		return sName;
	}
	public void setsName(String sName) {
		this.sName = sName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddres() {
		return addres;
	}
	public void setAddres(String addres) {
		this.addres = addres;
	}
	@Override
	public String toString() {
		return "Strudent [id=" + id + ", sName=" + sName + ", age=" + age + ", addres=" + addres + "]";
	}
	
}

  1. 实体类POJO,按照数据库中对应表的结构编写
  2. 映射文件按照给定模板编写
  3. 根元素mapper,指定namespace
  4. 当属性名与列名不一致时,定义resultMap进行映射
  5. 定义CRUD标签(select、insert、delete、update),编写SQL语句
  6. 每个标签指定id用于查找;parameterType属性指定参数类型;resultMap指定返回值类型

2.3. 核心对象的创建

2.3.1 SqlSessionFactoryBuilder

用过即丢,其生命周期只存在于方法体内

可重用其来创建多个 SqlSessionFactory 实例

负责构建SqlSessionFactory,并提供多个build方法的重载

2.3.2 SqlSessionFactory

SqlSessionFactory是每个MyBatis应用的核心

作用:创建SqlSession实例

作用域:Application

生命周期与应用的生命周期相同

单例:存在于整个应用运行时,并且同时只存在一个对象实例

2.3.3 SqlSession

包含了执行SQL所需的所有方法

对应一次数据库会话,会话结束必须关闭

线程级别,不能共享

MybatisUtils工具类

public class MybatisUtils {
	private static SqlSessionFactory factory;
	// 在static里,factory只会被建立一次
	static {
		try {
			// 获取config.xml的输入流
			InputStream is = Resources.getResourceAsStream("config.xml");
			//工厂建造器build()方法创建sqlSession 工厂
			factory = new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 建立sqlsession
	public static SqlSession createSqlSession() {
		return factory.openSession(true); // true: 自动提交事物
	}

	// 释放资源
	public static void close(SqlSession sqlSession) {
		if (null != sqlSession) {
			sqlSession.close();
		}
	}
}

2.3.4 SqlSession的两种使用方式

StudentMapper接口

public interface StudentMapper {
	  //1.查询学生表的记录数
	  public int count();
}

通过SqlSession实例直接运行映射的SQL语句

@Test
public void test1() throws IOException {
    SqlSession se=null;
    se=MybatisUtils.createSqlSession();
    //通过SqlSession实例直接运行映射的SQL语句
    int count=se.selectOne("cn.kgc.dao.StudentMapper.count");
    System.out.println(count);
    MybatisUtils.close(se);
}

基于Mapper接口方式操作数据

@Test
public void test2() throws IOException {
    SqlSession se=MybatisUtils.createSqlSession();
    //基于Mapper接口方式操作数据
    int count= se.getMapper(StudentMapper.class).count();
    System.out.println(count);
    MybatisUtils.close(se);
}

注意:方式2要求Mapper接口的名称必须和映射文件中mapper元素的namespace属性完全一致,方式1则无此要求;另外Mapper接口中的方法名需和映射文件中相应元素的id属性对应

3. 映射文件详解

3.1 select元素详解

3.2 Insert、 update、 delete 元素详解

3.3 Sql 元素

3.4 参数( Parameters )

3.5 resultMap 元素

3.5.1 高级结果映射

3.5.2 一对一

3.5.3 一对多

3.6 Cache 元素

3.7 cache-ref 元素

动态SQL

 

猜你喜欢

转载自blog.csdn.net/qq_17776439/article/details/84305165