MyBatis 01 快速入门

文章目录

  • MyBatis 01 快速入门
    • 一、学习目标
    • 二、为什么需要框架技术
    • 三、框架技术介绍
    • 四、主流框架介绍
    • 五、持久化与ORM
    • 六、MyBatis简介
    • 七、搭建MyBatis开发环境
    • 八、与JDBC直观对比
    • 九、MyBatis框架优缺点
    • 十、MyBatis基本要素
    • 十一、MyBatis 核心接口和类的结构
    • 十二、MyBatis 核心对象
    • 十三、非集成环境下的最佳实践
    • 十四、系统核心配置文件
      • 1、配置properties元素
      • 2、settings元素
      • 3、typeAliases元素
      • 4、environments元素
      • 5、mappers元素
      • 6、mapper.xml SQL映射文件模板
    • 十五、本章总结

一、学习目标

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 configurationPUBLIC "-//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;               //idprivate 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文件进行数据操作*/@Testpublic void testGetTotalCount() {SqlSession sqlSession = MyBatisUtils.getSqlSession();int totalCount = MyBatisUtils.getSqlSession().getMapper(SysRoleMapper.class).getTotalCount();System.out.println("总计录条数:" + totalCount);MyBatisUtils.closeSqlSession(sqlSession);}@Testpublic 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第一步:获取 sqlSessionFactorystatic {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 configurationPUBLIC "-//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 | false true
lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 true | false true
autoMappingBehavior MyBatis对于resultMap自动映射匹配级别 NONE 、PARTIAL 、FULL PARTIAL
……(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 mapperPUBLIC "-//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>

十五、本章总结

MyBatis 01 快速入门相关推荐

  1. MyBatis之快速入门

    MyBatis之快速入门 2017/9/30 首先我要明确告诉大家的是MyBatis是一个java持久层框架,以前我们都是用jdbc来将我们的java程序与数据库相连接,而MyBatis是对jdbc的 ...

  2. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

  3. MyBatis框架快速入门

    MyBatis框架快速入门 入门案例 创建一个关于Mybatis项目 首先创建一个空项目,然后新建一个moudle,选择quickstart,接下来把模块放到空项目之下.即可 实现mybatis查询数 ...

  4. JavaScript学习记录01快速入门、基本语法、严格检查模式

    文章目录 JavaScript学习记录01快速入门.基本语法.严格检查模式 1.1什么是JavaScript 1.2认识JavaScript框架 1.3快速入门 1.4基本语法入门 1.5数据类型简介 ...

  5. Mybatis(day1)快速入门

    框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义. 简 ...

  6. mybatis的快速入门

    说明: 在这个部分,会写个简单的入门案例. 然后,会重新写一个,更加严格的程序案例. 一:案例一 1.最终的目录结构 2.新建一个普通的Java项目,并新建lib 在项目名上右键,不是src. 3.导 ...

  7. 第一:Java+MyBatis(快速入门)

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  8. springboot 整合mybatis_SpringBoot整合MyBatis框架快速入门

    MyBatis概述: mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动.创建连接.创建statemenet等繁 ...

  9. MyBatis:快速入门代码实例(maven代码版)

    文章目录 1. MyBatis实例 1.1 添加Mybatis依赖 1.2 创建MyBatis配置文件 1.3.创建po类 1.4.创建映射文件 #{}: 表示sql参数,一个占位符. 1.5.测试 ...

最新文章

  1. mysql的安装胚子_Mysql安装
  2. 有这么一群人,他们通过AI撬动世界!
  3. UA OPTI570 量子力学4 带不含时的标量势的粒子的薛定谔方程
  4. MATLAB实战系列(四)- LabVIEW初探
  5. 【网址收藏】windows安装Docker Desktop常见问题整理
  6. 今天是魔兽世界关服的日子
  7. 安卓 Input Events(输入事件)
  8. 安全狗结合服云,网络管理倍儿轻松
  9. 2019最新k8s集群搭建教程 (centos k8s 搭建)
  10. oracle数据库中的一些操作
  11. unet服务器向客户端发消息,unet
  12. 【java】输出素数
  13. 微信小程序使用QQ音乐API完整实例
  14. VS2010使用教程(使用VS2010编写C语言程序)
  15. CAD图纸格式转换怎么操作?如何转换常见图纸格式?
  16. 深圳“毕业”生灵活就业社保缴纳方式
  17. POI-获取Excel中合并单元格问题
  18. swfobject1.5
  19. 如何复制网页上不能复制的文本!!!
  20. java求三角形周长 面积_用java如何求三角形的周长和面积?

热门文章

  1. 因果信号的傅里叶变换_信号与系统实验报告3实验3 傅里叶变换及其性质
  2. hexo butterfly主题 添加全局吸底APlayer
  3. python + win32api,win32gui,win32con 写 exe 窗口的时候,怎么创建按钮呢?
  4. OS第二章五大经典PV
  5. 数据结构顺序表和单链表优缺点
  6. 前端如何实现整套视频直播技术流程(以打扑克直播软件为例)
  7. python基本类型介绍
  8. QQ个性域名邮箱(免费企业邮箱)快速申请
  9. 西安电子科技大学2018考研复试计算机类上机试题总结
  10. 齐次弦振动方程的matlab解法,ode45求解振动微分方程