初识MyBatis

文章目录

  • 初识MyBatis
    • 1.MyBatis简短介绍
    • 2.持久化与ORM
    • 3.搭建MyBatis开发环境
    • 4.使用Mybatis查询数据库内容
      • 1.找不到mapper的映射xml文件
      • 2.maven项目可能会出错:找不到包,报错xx包不存在
    • 5.编写构建SqlSessionFactory构建工具类
    • 6.MyBatis框架优缺点
    • 7.MyBatis核心配置文件
      • 1.mybatis-config.xml 系统核心配置文件
    • mybatis-config.xml 系统核心配置文件
      • 2.settings元素

1.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工作原理

   (1)mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。 (2)mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。(3)通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。 (4)SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。(5)Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。

2.持久化与ORM

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

ORM(Object Relational Mapping)
编写程序的时候,以面向对象的方式处理数据
保存数据的时候,却以关系型数据库的方式存储

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

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

3.搭建MyBatis开发环境

使用MyBatis的开发步骤

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

mybatis搭建结构预览

<!--步骤1、在maven中添加Mybatis依赖包-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency><!--添加mysql驱动jar包-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version>
</dependency><!-- 添加测试类junit的jar包-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope>
</dependency><!--在maven中添加log4j依赖包便于观察sql信息-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>

mybatis-config.xml文件配置内容

需要注意的是配置文件里的标签是有顺序的,顺序不对会出错

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- ———————————————————————————————————————————————————————————————————————————————— plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?-->
<!--1.properties:配置(可代替)数据源属性-->
<!--2.settings:设置MyBatis框架的运行时行为-->
<!--3.typeAliases:为java的类取一个简短的别名,从而不需要使用完全限定类名,
也可以设置包名,建议设置包名因为一个包下有多个类,所以每个类都配置的话太多太繁琐了
设置包名后,里面的对象名会默认改为小写的并且是全小写不是驼峰命名
-->
<!--4.environments 配置框架的运行环境(数据库连接字符串和设置事务类型)-->
<!--5.mappers 用于配置需要引用的SQL映射文件的位置
也可以设置包名,方式和第三步的设置包名方式一致
-->
<!-- ———————————————————————————————————————————————————————————————————————————————— --><!--根节点-->
<configuration>
<!-- 1.引入包含数据库连接参数的database.properties文件或者自己配置-->
<!-- 读取一些外部的(可替代)的属性 此处读取mysql.properties的连接字符串-->
<properties resource="mysql.properties"/><!--    也可以用直接配置的方式来配置数据源信息-->
<!--    <properties>-->
<!--        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--        <property name="url"-->
<!--                  value="jdbc:mysql://localhost:3306/shopping_website?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true"></property>-->
<!--        <property name="user" value="root"/>-->
<!--        <property name="password" value="root"/>-->
<!--    </properties>--><!-- 2.设置 MyBatis 框架的运行时行为-->
<settings>
<!-- 使用 Log4j 作为 MyBatis 框架的运行环境-->
<setting name="logImpl" value="log4j"/>
</settings><!-- 3.设置别名 使用别名后xml映射文件可以用别名指定返回类型等操作-->
<!--    但是一般不推荐使用,可能会有同名类-->
<!--  最好不设置别名    使用包名+类名就可以了 -->
<typeAliases>
<!-- package指定包下列所有实体类别名为全小写-->
<!-- <package name="com.pojo"/>--><!-- typeAlias指定单个类的别名-->
<!-- <typeAlias type="com.pojo.User" alias="别名"/>-->
</typeAliases><!--    4.配置MyBatis 框架的运行环境 即环境配置容器-->
<!--  default:由于可以配置多个数据源所以是用于指定配置环境容器中的某个数据源
指定方式 将default的值改成容器中environment数据源的id值即可-->
<environments default="development">
<!--environment环境配置 id用于让框架选择数据源,即标识-->
<environment id="development"><!-- transactionManager配置事务管理器,采用JDBC事务,由应用自行管理事务-->
<!--  用于指定事务管理类型,有两种选项-->
<!--  JDBC:直接使用JDBC的提交和回滚功能,依赖程序代码对事务进行管理-->
<!--  MANAGED:表示由容器负责,例如spring框架提供的事务机制-->
<transactionManager type="JDBC"></transactionManager><!-- 配置数据源,POOLED:MyBatis提供的数据源,JNDI:JNDI数据源-->
<!--    提供了三种数据源类型-->
<!--    UNPOOLED:表示采用非池化的连接管理-->
<!--    POOLED:表示MyBatis框架实现简单的数据库连接池类型-->
<!--    JNDI:表示使用容器中以JNDI范式提供的数据源资源-->
<dataSource type="POOLED"><!--${}引用定义的参数,此处参数来自mysql.properties文件--><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/>
</dataSource>
</environment><!--可配置多个数据源 只需要容器的default属性指定其中一个即可-->
<!--        <environment id="development2">-->
<!--            <transactionManager type="JDBC"></transactionManager>-->
<!--            <dataSource type="POOLED">-->
<!--                <property name="driver" value="驱动字符串"/>-->
<!--                <property name="url" value="连接字符串"/>-->
<!--                <property name="username" value="账号"/>-->
<!--                <property name="password" value="密码"/>-->
<!--            </dataSource>-->
<!--        </environment>-->
</environments><!--    5.mapper映射配置-->
<mappers>
<!--此处数据是配置mapper层的映射xml文件-->
<mapper resource="com/mapper/UserMapper.xml"/>
</mappers></configuration>

mysql.properties配置文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shopping_website?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
jdbc.user=root
jdbc.password=root

配置log4j.properties配置日志文件

配置日志信息是为了方便查看sql语句的信息,默认控制台是不会输出sql语句以及传入的参数的,配置了logoj就可以输出

# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
# 下面的属性配置中,所有日志的输出级别是debug,输出源是con
log4j.rootLogger=debug,con
# 定义输出源的输出位置是控制台
log4j.appender.con=org.apache.log4j.ConsoleAppender
# 定义输出日志的布局采用的类
log4j.appender.con.layout=org.apache.log4j.PatternLayout
# 定义日志输出布局
log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%c%n -%m%n## rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
## 下面的属性配置中,所有日志的输出级别是info,输出源是con
#log4j.rootLogger=info,con
## 定义输出源的输出位置是控制台的类
#log4j.appender.con=org.apache.log4j.ConsoleAppender
## 定义输出日志的布局采用的类
#log4j.appender.con.layout=org.apache.log4j.PatternLayout
## 定义日志输出布局 (格式
#log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%c%n -%m%n

创建数据库实体类

//步骤3、创建实体类-POJO
package com.pojo;
/**
* 角色类
*/public class User {private long id;  //用户id
private String name; //用户名
private String img;  //用户头像
private String pwd; //密码private String phone;
private long usertype;
private long sex;
private long state;
private long credit;//省略getter/setter...
}

编写mapper层

//步骤4、Mapper层 (原dao) 接口
package com.mapper;import com.pojo.User;
import java.util.List;/**
* 用户类Mapper层
*/
public interface UserMapper {/*** 获取所有用户
** @return
*/
public List<User> getUserAll();
}

配置mapper层的映射xml文件
xml位置放在mapper层即可

<!--步骤4、创建与接口对应的-SQL映射文件(SysRoleMapper.xml)-->
<?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用于指定mapper层的映射
必须保证全局唯一 -->
<mapper namespace="com.mapper.UserMapper">
<!--select标签用于查询,id用于指定mapper接口中的方法-->
<!--resultType用于指定返回值,由于返回值是list所以指定-->
<!--list中的泛型类型即可-->
<select id="getUserAll" resultType="com.pojo.User">
select * from `user`
</select>
</mapper>

4.使用Mybatis查询数据库内容

创建测试类

package com.mapper;import com.pojo.User;
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 org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;import static org.junit.Assert.*;/**
* @version 1.0
* @Description
* @Author luyo
* @date 2022-05-18
*/
public class UserMapperTest {@Test
public void getUserAll() {//Mybatis核心配置文件
SqlSession sqlSession = null;
String resource = "mybatis-config.xml";
try {//1.读取MyBatis框架的核心配置文件InputStream is = Resources.getResourceAsStream(resource);//2.使用sqlSessionFactoryBuilder读取配置文件并构建SqlSessionFactory实例SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.创建SqlSessionFactory构建SqlSession实例// 可以在构建的方法其中 写入boolean参数// true代表关闭事务(直接提交增删改操作),false代表开启事务(需要手动提交事务)//开启事务后 增删改操作需要提交才生效,这里只做查询sqlSession = sqlSessionFactory.openSession(false);//4.创建UserMapper接口实例,调用其方法执行相关的SQL语句UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//获取接口后直接调用方法获取用户信息列表List<User> userList = userMapper.getUserAll();System.out.println("_________________________");userList.forEach(v -> {System.out.println(v.getName());System.out.println(v.getPwd());System.out.println("_________________________");});} catch (IOException exception) {exception.printStackTrace();
} finally {//用完sqlSession后记得关闭if (sqlSession != null) {sqlSession.close();}
}
}
}

运行后效果:

相信看到这里一定会有一个疑惑,查询的结果是怎么自动映射到对象上的呢?

其实是mybatis自动映射的一个机制,后续也可以手动映射

而映射的机制是对应着javabean中的set\get方法。

如果你不给你的对象写set方法则映射数据失败,set名字有误也会自动映射数据失败,

如果需要映射对象元素或者集合元素无法自动映射,需要手动映射,后续会讲

此外可能会出现两个bug

1.找不到mapper的映射xml文件

原因:maven项目构建不会自动识别java源文件中的xml等配置文件

所以需要在pom.xml中添加配置让maven去识别java源文件中的xml配置文件

<build>
<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource>
</resources>
</build>
2.maven项目可能会出错:找不到包,报错xx包不存在

解决方案:将idea构建托给maven

​ 需要注意的是勾选这项后 lib中的jar包无效 只有maven依赖jar包有效

这样就不会出错了

如果还出错 ,请看看你的maven项目是不是命名为中文了,请改为英文

5.编写构建SqlSessionFactory构建工具类

由于构建SqlSession步骤太多 每次使用都需要构建,所以我们可以将这个SqlSession构建的过程封装起来

在工具类中给予一个获取SqlSession和关闭SqlSession的方法即可

package com.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;/**
* MyBatis工具类
*/
public class MyBatisUtil {//SqlSession的工广对象
private static SqlSessionFactory factory = null;static {String resource = "mybatis-config.xml";InputStream is = null;try {is = Resources.getResourceAsStream(resource);factory = new SqlSessionFactoryBuilder().build(is);} catch (IOException exception) {exception.printStackTrace();throw new RuntimeException("初始化失败," + exception);}
}/*** 返回SqlSession开启事物
** @return SqlSession
*/
public static SqlSession createSqlSession() {// false:开启事务控制  true(默认):自动提交return factory.openSession(false);
}/*** 关闭SqlSession
** @param sqlSession
*/
public static void closeSqlSession(SqlSession sqlSession) {if (sqlSession != null) {sqlSession.close();}
}}

使用方式

@Test
public void getUserAllTwo() {//获取sqlSessionSqlSession sqlSession = MyBatisUtil.createSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.getUserAll();System.out.println("_________________________");userList.forEach(v -> {System.out.println(v.getName());System.out.println(v.getPwd());System.out.println("_________________________");});//关闭sqlSessionMyBatisUtil.closeSqlSession(sqlSession);
}

6.MyBatis框架优缺点

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

7.MyBatis核心配置文件

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

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

顺序 标签元素 作用
1 properties 可以配置在Java 属性配置文件中
2 settings 修改 MyBatis 在运行时的行为方式
3 typeAliases 为 Java 类型命名一个别名(简称)
4 typeHandlers 类型处理器
5 objectFactory 对象工厂
6 plugins 插件
7 environments 环境
8 environment 环境变量
9 transactionManager 事务管理器
10 dataSource 数据源
11 mappers 映射器
2.settings元素

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

设置项 描述 允许值 默认值
cacheEnabled 对在此配置文件下的所有cache 进行全局性开/关设置 true|false true
lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 true|false true
autoMappingBehavior MyBatis对于resultMap自动映射匹配级别 NONE PARTIAL FULL PARTIAL
LogImpl 指定MyBatis框架应使用的日志记录实现,如果不指定测将自动发现日志记录并实现 SLF4J|LOG4J|LOG4J2等参数

1 初识Mybatis相关推荐

  1. 初识mybatis源码

    初识mybaits的时候,我还是只小菜鸟,而你也总喜欢找我问问题.而如今我懂了很多,但是找我问问题 的人再也不是你了. 遥想公瑾当年,小乔初嫁了,雄姿英发. 羽扇纶巾,谈笑间,樯橹灰飞烟灭. 春去秋来 ...

  2. 框架:初识Mybatis

    1.mybatis是什么? mybatis是一个持久层的框架,是apache下的顶级项目. mybatis托管到goolecode下,再后来托管到github下(https://github.com/ ...

  3. 2.平凡之路-初识MyBatis

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  4. 第一章 初识 MyBatis

    概念:优秀持久层框架:实体类和SQL语句之间建立映射关系 与hibernate区别    :自动生成sql语句,并且建立实体类和数据表的映射. MyBatis基本要素:核心对象   核心配置文件  S ...

  5. 【Mybatis框架】初识Mybatis

    CSDN话题挑战赛第2期 参赛话题:学习笔记 MyBatis 1.MyBatis简介 1.1.MyBatis历史 1.2.MyBatis特性 2. 搭建MyBatis 2.1 创建一个Maven项目 ...

  6. 初识MyBatis Plus

    前言 简介 MyBatisPlus环境搭建 创建表 代码生成器 测试代码 前言 昨天知道了有MyBatisPlus这个框架,今天了解了一下,发现运用其写代码真的是爽,为我们开发者省了不少的功夫,下面来 ...

  7. MyBatis(一)——初识MyBatis

    MyBatis简介 MyBatis是什么 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...

  8. 快速搭建第一个Mybatis程序

    一.简介 1.初识Mybatis 2.持久化 3.持久层 4.为什么需要Mybatis 二.第一个Mybatis程序 1.搭建环境 2.创建一个新模块 3.编写代码 4.Junit测试 三.可能遇到的 ...

  9. 面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    来自:Java建设者 初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.M ...

最新文章

  1. 因果关系是通向强AI的阶梯or作用被夸大?
  2. Maven出现User setting file does not exist ...\.m2\setting.xml的问题解决(同时也解决用户.m2目录下无setting.xml文件)...
  3. python免费入门手册-Python 基础入门教程
  4. Nature论文解读 | 基于深度学习和心脏影像预测生存概率
  5. ajax使用html()后样式无效,jquery.ajax使用字符串拼接后内联css样式失效
  6. 飞桨企业版重磅发布智能边缘控制台 5分钟零代码自动化模型部署
  7. php裁剪图片白边,php生成缩略图填充白边(等比缩略图方案)_PHP
  8. mysql索引背后的数据结构_MySQL索引背后的数据结构及算法原理
  9. 什么是隐形门? 隐形门安装要注意什么
  10. 遍历树,找出所有叶子路径
  11. .net开源CMS系统使用教程之:如何用We7 CMS建设全新网站
  12. 尚硅谷zookeeper入门笔记
  13. 如何查询Windows XP 系统是多少位的
  14. The Bean Validation API is on the classpath but no implementation could be found
  15. speedoffice(Excel)表格怎么自动求和
  16. 机器学习笔记 - YOLOv7 论文简述与推理
  17. STM32物联网项目-HMI串口屏
  18. 老毛桃 固态硬盘 系统迁移
  19. 算数操作符与移位操作符
  20. Android点击WebView中的图片查看大图

热门文章

  1. c语言试题库之单选题
  2. 哪个ppt模板网站好
  3. win10网线插上显示的ipv6的服务器,win10如何开启IPV6及WIN10无法上ipv6的解决方法
  4. JointDNN: An Effificient Training and Inference Engine for Intelligent Mobile Cloud Computing Servic
  5. 地图 显示 动态轨迹_腾讯地图SDK全新版本上线,可满足开发者核心诉求
  6. Arduino + GP2D12红外测距传感器+LCD1602
  7. 带蒙版的安卓剪辑软件_安卓手机上的视频剪辑软件哪款好?
  8. python 聚宽 对股票名称或代码进行查询
  9. python学习之股票查询程序
  10. 顺丰云服务器,基于华为云云原生解决方案,顺丰“快递+”这一项业务效率提升了48倍...