MyBatis学习笔记(2022-11-30)
创始人
2024-03-03 13:27:47
0

在这里插入图片描述

熬过无人问津的日子才会有诗和远方。


文章目录

  • 一、MyBatis简述
  • 二、快速入门
  • 三、MyBatis配置文件详解
    • 1. MyBatis核心配置文件
      • 1.1 configuration(配置)
      • 1.2 properties(属性)
      • 1.3 environments(环境配置)
      • 1.4 typeAliases(类型别名)
      • 1.5 settings(设置)
      • 1.6 mappers(映射器)
      • 1.7 其它配置
    • 2. MyBatis映射配置文件

一、MyBatis简述


  • MyBatis 是一款优秀的持久层框架,用于简化JDBC开发。(半自动化的ORM框架)
  • 它支持自定义SQL、存储过程以及高级映射。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录。
  • MyBatis 是 Apache的一个开源项目iBatis,在2010年6月 Apache 将项目交与Google进行管理,更名MyBatis。于2013年11月迁移到GitHub上。
  • Mybatis官网:https://mybatis.org/mybatis-3/zh/index.html
  • 项目地址:https://github.com/mybatis/mybatis-3/releases
  • 目前最新版本是:3.5.11,其发布时间是2022年9月18日。

什么是框架?

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。
  • 在架构的基础之上构建软件编写更加高效、规范、通用、可扩展。

三层架构和SSM框架的关系

三层架构:数据访问层、业务逻辑层和表示层(web层),区分层次的目的即为了高内聚低耦合的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。

MVC:模型(model)、视图(view)、控制器(controller。

SSM:Spring Framework、Spring MVC、MyBatis(扩展MyBatis-Plus)。

SSH:Spring、Struts、Hibernate(扩展JPA)。

JavaSE => JDBC => Servlet+JSP => SSM =>SpringBoot(分布式) => SpringCould(微服务)


MyBatis缺点

  • 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  • SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
  • 二级缓存机制不佳。

软件设计:(open-close开闭原则)尽量不修改源代码,对程序进行扩展。

  • 对扩展是开放的。
  • 对修改源码是关闭的。

如何使用MyBatis?

1、使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。

2、如果使用 Maven 来构建项目,则需将下面的依赖引入 pom.xml 文件中:

org.mybatismybatisx.x.x



二、快速入门


通过本节可以初步了解MyBatis的使用以及logback的配置

1、创建一个普通的Maven项目

2、引入依赖坐标


org.mybatismybatis3.5.5


mysqlmysql-connector-java5.1.46


junitjunit4.12test


org.slf4jslf4j-api1.7.20


ch.qos.logbacklogback-classic1.2.3


ch.qos.logbacklogback-core1.2.3

在这里插入图片描述


3、导入SQL脚本

-- 创建数据库
drop database if exists `mybatis`;
create database `mybatis` character set = utf8;use mybatis;-- 创建数据表
create table `user`(`id` int auto_increment primary key comment '编号',`name` varchar(20) unique comment '姓名', -- 唯一约束`pwd` varchar(20) comment '密码',`gender` char(1) comment '性别',`addr` varchar(30) comment '家庭住址'
)engine=innodb default charset=utf8;-- 插入数据
insert into user(name,pwd,gender,addr) values
("张三","123456",'男',"北京"),
("李四","123456",'女',"南京"),
("王五","777777",'男',"杭州"),
("赵六","123456",'女',"温州"),
("陈七","666666",'男',"黑河");

在这里插入图片描述


4、编写实体类

package com.baidou.pojo;/*** 用户实体类** @author 白豆五* @version 2022/11/30 11:07* @since JDK8*/
public class User {private Integer id;  // 编号private String name; // 姓名private String pwd;  // 密码private char gender; // 性别private String addr; // 家庭住址// 满参构造方法public User(Integer id, String name, String pwd, char gender, String addr) {this.id = id;this.name = name;this.pwd = pwd;this.gender = gender;this.addr = addr;}// 无参构造方法public User() {}// set/get方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}// 重写Object类的toString方法,返回对象里的内容// Object类的toString方法返回的是对象的地址值,即: "类的全限定名@十六进制的哈希码"@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +", gender=" + gender +", addr='" + addr + '\'' +'}';}
}

在这里插入图片描述

5、编写mapper接口

package com.baidou.mapper;import com.baidou.pojo.User;import java.util.List;/*** 基于MyBatis实现用户接口* mapper、dao都是对数据库进行持久化操作的(crud)*/
public interface UserMapper {// 查询所有用户List selectAll();
}

在这里插入图片描述

6、编写UserMapper.xml(SQL映射文件)

参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html

在这里插入图片描述

在这里插入图片描述

 





7、编写MyBatis核心配置文件

参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html

在这里插入图片描述
在这里插入图片描述






8、编写logback.xml日志配置文件

在这里插入图片描述



                   [%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg%n       


9、编写测试

import com.baidou.mapper.UserMapper;
import com.baidou.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;/*** mybatis快速入门* @author 白豆五* @version 2022/11/30 12:55* @since JDK8*/
public class MyTest {/*** 方式一: 使用qlSession.selectList()查询所有用户(旧版mybatis的API,不推荐使用)* @throws IOException*/@Testpublic void test1() throws IOException {// 1、加载mybatis核心配置文件,获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 2、获取对应的SqlSession对象,用来执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3、执行sql语句,  selectList()方法的参数是一个字符串,该字符串必须是映射配置文件的 namespace.idList list = sqlSession.selectList("com.baidou.mapper.UserMapper.selectAll");// 输出结果for (User user :list) {System.out.println(user);}// 4、释放资源sqlSession.close();}/*** 使用Mapper代理开发,查询所有用户* @throws IOException*/@Testpublic void test2() throws IOException {// 1、加载Mybatis核心配置文件,获取SqlSessionFactory对象InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2、获取对应的SqlSession对象,用来执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3、获取mapper,来调用mapper中的方法UserMapper mapper = sqlSession.getMapper(UserMapper.class);List users = mapper.selectAll();users.forEach(System.out::println);// 4、关闭SqlSessionsqlSession.close();}
}

test1()方法执行结果:
在这里插入图片描述

test2()方法执行结果:
在这里插入图片描述

  • 第一种方式:sqlSession.selectList()需要传入映射文件的名称空间和查询语句的id(即 "namespace.id"),然后它每次返回的类型都是Object,会存在类型转换问题,导致不太安全。
  • 第二种方式:sqlSession.getMapper(),更灵活的使用方法,不依赖上述的字符串字面值而且安全,只需传参UserMapper.class,返回的是mapper接口的代理对象,然后通过mapper调用对应方法完成sql的执行。

官网解释:
在这里插入图片描述



三、MyBatis配置文件详解


MyBatis核心配置文件:mybatis-config.xml

MyBatis映射配置文件:XxxMapper.xml

后期在使用MyBatis框架做数据库操作(持久化操作)会经常使用这两个配置文件。

当然我们也可以在这个XML的dtd约束文件中查看相应的配置:

在这里插入图片描述


1. MyBatis核心配置文件


核心配置文件(mybatis-config.xml)的层级结构如下:

在这里插入图片描述

注:配置每个标签时,需要遵守前后顺序!


1.1 configuration(配置)


configuration表示核心配置文件的根标签。

在这里插入图片描述


1.2 properties(属性)


  • properties属性可以引用外部配置文件;
  • properties属性也可以在内部增加一些属性配置;
  • 如果两个文件有共同的字段,会优先使用外部配置文件的!

1、编写db.properties配置文件

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

2、在mybatis-config.xml中引用db.properties






1.3 environments(环境配置)


  • MyBatis 可以配置多种环境,但每个 SqlSessionFactory 实例只能选择一种环境;
  • 用ID这个唯一标识来切换默认使用的环境,如开发环境、测试环境、生产环境/线上;
  • MyBatis默认的事务管理器是JDBC,后期在Spring中会替换成声明式事务;
  • MyBatis默认连接池是POOLED,后期我们可以使用第三方数据库连接池(如Druid、C3P0等)。

在这里插入图片描述

在公司做项目的时候,如果开发阶段连接开发环境的数据库,那么数据库的配置要管运维或者DBA的同事要。


1.4 typeAliases(类型别名)


类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写;

使用场景:1、给实体类起别名(跟map挺像,K-V键值对)



使用场景:2、扫描实体类的包,它的的默认别名为类名,首字母小写



在实体类比较少的时候使用第一种方式,如果实体类比较多建议使用第二种方式!

区别:第一种可以自定义别名,第二种它就不行(如果非要改 需要在实体类上增加@Alias注解)。


下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

1.5 settings(设置)


在MyBatis全局配置文件中通过标签控制MyBatis全局开关。

MyBatis的设置:https://mybatis.org/mybatis-3/zh/configuration.html#settings

在这里插入图片描述


示例:在mybatis-config.xml配置日志输出




1.6 mappers(映射器)


mappers(映射器)的作用是告诉 MyBatis 到哪里去找映射文件;

使用场景:1. 使用相对于类路径的资源引用(推荐使用)




使用场景:2. 使用映射器接口实现类绑定注册



使用场景:3. 使用包扫描进行注入绑定



注:接口和它的配置文件必须同名,接口和它的映射文件必须在同级包下(SQL映射文件可以放在src目录中,也可以放在resources目录中 );


1.7 其它配置


  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • databaseIdProvider(数据库厂商标识)

2. MyBatis映射配置文件


MyBatis 真正强大之处在于它的语句映射,这是它的魔力所在。由于它的功能强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于写SQL代码😥。

SQL 映射配置文件标签结构如下:

  • mapper – 作为映射配置文件的根标签,namespace属性值就是绑定mapper接口的全限定名(包名.接口名)。
    • cache – 该命名空间的缓存配置。
    • cache-ref – 引用其它命名空间的缓存配置。
    • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
    • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
    • sql – 可被其它语句引用的可重用语句块。
    • select – 映射查询语句,resultType – SQL语句执行的返回值;parameterType – 参数类型;
    • insert – 映射插入语句。
    • update – 映射更新语句。
    • delete – 映射删除语句。

在mapper接口中定义方法,方法名就是该SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致;

在这里插入图片描述


相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...