MyBatis 01 快速入门

13 篇文章 0 订阅
4 篇文章 0 订阅

MyBatis 01 快速入门

一、学习目标

1、理解数据持久化概念和ORM原理
2、理解MyBatis的概念以及优点特性
3、搭建MyBatis环境
4、了解MyBatis与JDBC的区别与联系
5、理解核心类的作用域和生命周期
6、掌握全局配置文件结构内容

二、为什么需要框架技术

问题:如何更快更好地写简历?

  • 使用word简历模板

思考:使用模板有什么好处呢?

  • 不用考虑布局、排版等,提高效率、结构统一,便于人事阅读、可专心在简历内容上、新手也可以做出专业的简历。

模板即框架

三、框架技术介绍

框架技术

  • 是一个应用程序的半成品
  • 提供可重用的公共结构
  • 按一定规则组织的一组组件

分析优势

  • 不用再考虑公共问题
  • 专心在业务实现上
  • 结构统一,易于学习、维护
  • 新手也可写出好程序
四、主流框架介绍

在这里插入图片描述

​ MVC设计模式的实现
​ 拦截器
​ 可变和可重用的标签

在这里插入图片描述

​ ORM,简化数据库操作
​ DAO层

在这里插入图片描述

依赖注入容器 / AOP实现
​ 声明式事务
​ 简化Java EE应用
​ 黏合剂,将大家组装到一起

在这里插入图片描述

​ 结构最清晰的MVC Model2实现
​ 高度可配置,支持多种视图技术
​ 定制化开发

在这里插入图片描述

半自动化的ORM实现
DAO层
动态SQL
​ 小巧灵活、简单易学

五、持久化与ORM

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

在这里插入图片描述

ORM(Object Relational Mapping)

  • 编写程序的时候,以面向对象的方式处理数据
  • 保存数据的时候,却以关系型数据库的方式存储

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

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

MyBatis前身是iBatis,本是Apache的一个开源的项目

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

entity ——> pojo

dao ——>mapper

impl——>XML

官方网站 http://mybatis.org

中文官网网站: https://mybatis.org/mybatis-3/zh/

ORM框架
实体类和SQL语句之间建立映射关系
特点
1.基于SQL语法,简单易学
2.能了解底层封装过程
3.SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
4.方便程序代码调试

七、搭建MyBatis开发环境

使用MyBatis的开发步骤

步骤1、在maven中添加Mybatis依赖包
步骤2、编写MyBatis核心配置文件(configuration.xml)
步骤3、创建实体类-POJO
步骤4、DAO(mapper)层-SQL映射文件(mapper.xml)
步骤5、创建测试类
​ ① 读取核心配置文件mybatis-config.xml
​ ② 创建SqlSessionFactory对象,读取配置文件
​ ③ 创建SqlSession对象
​ ④ 调用mapper文件进行数据操作

<!--步骤1、在maven中添加Mybatis依赖包-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
<!--步骤2、编写MyBatis核心配置文件(configuration.xml)-->
<?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 resource="database.properties"></properties>
    <!--配置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--配置类别名-->
    <typeAliases>
        <package name="com.cvs.pojo"/>
    </typeAliases>
    <!--环境配置 default默认-->
    <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/cvs_db?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimeZone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <!-- 测试环境-->
        <environment id="test">
            <transactionManager type="JDBC"/>
            <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>

    <mappers>
        <!--映射文件必须要配置
        org.apache.ibatis.binding.BindingException-->
        <mapper resource="com/cvs/mapper/SysRoleMapper.xml"></mapper>
        <!--<mapper class="com.cvs.mapper.SysRoleMapper"></mapper>-->
    </mappers>
</configuration>
#database.properties配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/cvs_db?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimeZone=UTC
username=root
password=root
//步骤3、创建实体类-POJO
package com.cvs.pojo;
import java.util.Date;
/**
 * 角色类
 */
public class SysRole {
	private Integer id;   			//id
	private String code;			//角色编码
	private String roleName; 		 //角色名称
	private Integer createdUserId;	 //创建者
	private Date createdTime; 		 //创建时间
	private Integer updatedUserId;	 //更新者
	private Date updatedTime;		 //更新时间
	
	//省略getter/setter...
}
//步骤4、DAO层 (mapper)接口
package com.cvs.mapper;
import com.cvs.pojo.SysRole;
import java.util.List;
/**
 * Description: TODO
 * date: 2021-11-19 10:21
 * 系统用户角色接口
 * @author Aiden
 */
public interface SysRoleMapper {
    /**
     * 获取角色总记录数
     * @return
     */
    int getTotalCount();
    /**
     * 查询所有系统角色
     * @return
     */
    List<SysRole> getSysRoleAll();
}
<!--步骤4、创建与接口对应的-SQL映射文件(SysRoleMapper.xml)-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE>
<!--namespace:命名空间 java接口文件全包名-->
<mapper namespace="com.cvs.mapper.SysRoleMapper">
    <!-- 查询系统角色总数-->
    <select id="getTotalCount" resultType="int">
        SELECT count(0) FROM `t_sys_role`
    </select>
    <!--查询所有系统角色-->
    <select id="getSysRoleAll" resultType="com.cvs.pojo.SysRole">
        select * from t_sys_role
    </select>
</mapper>
import com.cvs.mapper.SysRoleMapper;
import com.cvs.pojo.SysRole;
import com.cvs.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
 * date: 2021-11-19 10:53
 * 单元测试类
 * @author Aiden
 */
public class SysRoleMapperTest {

    /**
     * 步骤5、创建测试类
	 *​①读取核心配置文件mybatis-config.xml
	 *​②创建SqlSessionFactory对象,读取配置文件
	 *​③创建SqlSession对象
	 *​④调用mapper文件进行数据操作
     */
    
    @Test
    public void testGetTotalCount() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        int totalCount = MyBatisUtils.getSqlSession().getMapper(SysRoleMapper.class).getTotalCount();
        System.out.println("总计录条数:" + totalCount);
        MyBatisUtils.closeSqlSession(sqlSession);
    }

    @Test
    public void getSysRoleAll() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        List<SysRole> sysRoleList = sqlSession.getMapper(SysRoleMapper.class).getSysRoleAll();
        sysRoleList.forEach(r->{
            System.out.println(r.getId()+"\t"+r.getRoleName());
        });
        MyBatisUtils.closeSqlSession(sqlSession);
    }
}
package com.cvs.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

/**
 * Description: TODO
 * date: 2021-11-19 12:00
 * MyBatis工具辅助类
 * @author Aiden
 */
public class MyBatisUtils {

    /**
     * 获取 SqlSession
     * @return
     */
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

    /**
     * 关闭 sqlSession
     * @param sqlSession
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}
八、与JDBC直观对比

MyBatis将代码分解包装
在这里插入图片描述

九、MyBatis框架优缺点

优点
与JDBC相比,减少了50%以上的代码量
最简单的持久化框架,小巧并简单易学
SQL代码从程序代码中彻底分离,可重用
提供XML标签,支持编写动态SQL
提供映射标签,支持对象与数据库的ORM字段映射
缺点
SQL语句编写工作量大,对开发人员有一定要求
数据库移植性差
在这里插入图片描述

十、MyBatis基本要素

MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
mybatis-config.xml 系统核心配置文件
mapper.xml SQL映射文件

十一、MyBatis 核心接口和类的结构

在这里插入图片描述

十二、MyBatis 核心对象

☆ SqlSessionFactoryBuilder

​ 用过即丢,其生命周期只存在于方法体内
​ 可重用其来创建多个 SqlSessionFactory 实例
​ 负责构建SqlSessionFactory,并提供多个build方法的重载

build(InputStream inputStream, String environment, Properties properties) ;
build(Reader reader, String environment, Properties properties);
build(Configuration config);
//注意:
配置信息以三种形式提供给SqlSessionFactory的build方法:
InputStream(字节流)、Reader(字符流)、Configuration(类)
读取XML文件构造方式:
String resource = "mybatis-config.xml";   
InputStream is = Resources.getResourceAsStream(resource);   
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

☆ SqlSessionFactory

​ SqlSessionFactory 是每个MyBatis应用的核心, 作用:创建SqlSession实例

/*
 * autoCommit true:关闭事务控制(默认) false:开启事务控制
 */
SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);

​ **作用域:**Application
生命周期与应用的生命周期相同
单例: 存在于整个应用运行时,并且同时只存在一个对象实例

教学指导:

//sqlSessionFactory的生命周期,抛出问题:获取sqlSessionFactory的代码是否可以进行优化?
//写在静态代码块下,sqlSessionFactory对象只会被创建一次
//演示示例:编写MyBatisUtil类:
//把获取sqlSessionFactory对象的内容抽取到一个工具类中,
//注意:factory.openSession(false); //true 为自动提交事物

☆ SqlSession
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享

示例:

SqlSession session = sqlSessionFactory.openSession();
try {
     // do work
} finally {
     session.close(); //强调sqlSession的关闭
}

注意:

在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建

SqlSession的获取方式

String resource = "mybatis-config.xml";   
InputStream  is = Resources.getResourceAsStream(resource);   
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is) ;
SqlSession sqlSession = factory.openSession();
package cn.smbms.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * @Created by Aiden
 */
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    //使用mybatis第一步:获取 sqlSessionFactory
    static {
        String resource = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 实例化sqlSessionFactory对象后,可以通过此方法获得sqlSession对象
     * sqlSession中完全包含了面向数据库执行sql命令所需的所有方法
     * * @return
     */
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
    
}

SqlSession的两种使用方式
通过SqlSession实例直接运行映射的SQL语句
基于Mapper接口方式操作数据

十三、非集成环境下的最佳实践

SqlSessionFactoryBuilder
用过即丢,推荐作用域范围:方法体内
SqlSessionFactory
最佳作用域范围:应用的全局作用域
生命周期与应用的生命周期相同
SqlSession
线程级
一个request请求期间

十四、系统核心配置文件

mybatis-config.xml 系统核心配置文件

注意元素节点的顺序!

configuration 配置
 	properties          可以配置在Java 属性配置文件中
 	settings            修改 MyBatis 在运行时的行为方式
 	typeAliases         为 Java 类型命名一个别名(简称)
 	typeHandlers        类型处理器
 	objectFactory       对象工厂
 	plugins             插件
	environments        环境
	environment         环境变量
 	transactionManager  事务管理器
 	dataSource          数据源
 	mappers             映射器
1、配置properties元素

配置properties元素的两种方式
通过外部指定的方式(database.properties),实现动态配置
直接配置为xml,实现动态配置

database.properties配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
username=root
password=root

1.通过外部指定的方式(database.properties),实现动态配置
配置properties的resource属性

<?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核心配置文件-->
<configuration>
 <!--配置:mysql数据库连接配置文件-->
 <properties resource="database.properties"/>      
 ......
 <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${user}"/>
     <property name="password" value="${password}"/>
 </dataSource>
 
  <!--每一个Mapper.xml文件都必须在mybatis核心配置文件中注册-->
	<mappers>
  	<mapper resource="cn/smbms/dao/UserMapper.xml"/>
	</mappers>
</configuration>

2.直接配置为xml,实现动态配置
配置property的name和value

<properties>
		<property name="driver" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
		<property name="user" value="root"/>
		<property name="password" value="root"/>
</properties>
......
<dataSource type="POOLED">
		<property name="driver" value="${driver}"/>
		<property name="url" value="${url}"/>
		<property name="username" value="${user}"/>
		<property name="password" value="${password}"/>
</dataSource>

<!--每一个Mapper.xml文件都必须在mybatis核心配置文件中注册-->
<mappers>
  <mapper resource="cn/smbms/dao/UserMapper.xml"/>
</mappers>
2、settings元素

用来修改MyBatis运行时的行为方式
主要是MyBatis的一些全局配置属性的设置

autoMappingBehavior :此设置项,下次课讲解resultMap的时候会用到,需要强调一下

设置项描述允许值默认值
cacheEnabled对在此配置文件下的所有cache 进行全局性开/关设置true | falsetrue
lazyLoadingEnabled全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载true | falsetrue
autoMappingBehaviorMyBatis对于resultMap自动映射匹配级别NONE 、PARTIAL 、FULLPARTIAL
……(9个)
3、typeAliases元素

类型别名
仅仅只关联XML配置,简写冗长的Java类名

<typeAliases>
	<typeAlias alias="User" type="cn.smbms.pojo.User"/>
</typeAliases>
<typeAliases>
 <!--默认名称:指定包下JavaBean的非限定类名-->
	<package name ="cn.smbms.pojo" />
</typeAliases>
4、environments元素

environments元素 表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
子元素节点:environment,但是必须指定其中一个为默认运行环境(通过default指定)

注意:每个SqlSessionFactory实例只能选择一个运行环境

<environments default="development"><!--默认的运行环境 ID-->
<environment id="development">      <!--运行环境 ID-->
<transactionManager type="JDBC"/>   <!--事务管理器配置-->
<dataSource type="POOLED">          <!--数据源配置-->
 		<property name="driver" value="${driver}"/>
		 <property name="url" value="${url}"/>
 		<property name="username" value="${user}"/>
 		<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
……
</environment>
</environments>

transactionManager-事务管理器

语法:

<!-- JDBC:JDBC MANAGED (托管)-->
<transactionManager type="[ JDBC | MANAGED ]" />

dataSource
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
有三种内建的数据源类型

语法:

<dataSource type=" [UNPOOLED | POOLED | JNDI]" />
5、mappers元素

映射器,定义SQL映射语句
须在配置中引用mapper映射文件
方式一:使用类资源路径获取资源(推荐使用)

<!-- 将mapper映射文件加入到系统核心配置文件中 -->
<mappers>
	<mapper  resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>

方式二:使用URL获取资源

<mappers>
		<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
		<mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
</mappers>
6、mapper.xml SQL映射文件模板
<?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 绑定一个对应的dao/mapper接口-->
<mapper namespace="cn.smbms.dao.UserMapper">
   <!--查询语句-->
   <select id="getUserList" resultType="cn.smbms.pojo.User">
       select * from user
   </select>

   <select id="getUserById" resultType="cn.smbms.pojo.User" parameterType="int">
       select * from user where id =#{id}
   </select>

   <insert id="insert" parameterType="cn.smbms.pojo.User">
       insert into user(name,pwd) values(#{name},#{pwd})
  </insert>

   <update id="update" parameterType="cn.smbms.pojo.User">
       update user set name=#{name},pwd=#{pwd} where id=#{id}
   </update>
</mapper>

7、POM.xml 防止资源导出失败问题配置

<!--build中配置resources ,防止资源导出失败问题-->
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <includes>
                 <include>**/*.properties</include>
                 <include>**/*.xml</include>
             </includes>
             <filtering>true</filtering>
         </resource>
         <resource>
             <directory>src/main/java</directory>
             <includes>
                 <include>**/*.properties</include>
                 <include>**/*.xml</include>
             </includes>
             <filtering>true</filtering>
         </resource>
     </resources>
十五、本章总结

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

众生云海,一念初见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值