熬过无人问津的日子才会有诗和远方。
文章目录
- 一、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 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
二、快速入门
通过本节可以初步了解MyBatis的使用以及logback的配置
1、创建一个普通的Maven项目
2、引入依赖坐标
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- junit 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope><!--作用范围只在测试环境有效-->
</dependency>
<!-- slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
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方法返回的是对象的地址值,即: "类的全限定名@十六进制的哈希码"
@Override
public 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<User> selectAll();
}
6、编写UserMapper.xml(SQL映射文件)
参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html
<?xml version="1.0" encoding="UTF-8" ?> <!--xml文档声明-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
引入外部的dtd约束: <!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置">
根标签: mapper
dtd文件名: -//mybatis.org//DTD Mapper 3.0//EN
dtd文件的位置: https://mybatis.org/dtd/mybatis-3-mapper.dtd
-->
<!--
mapper根标签:映射器
namespace:名称空间,用来绑定对应的mapper接口
-->
<mapper namespace="com.baidou.mapper.UserMapper">
<!--
select标签: selct查询语句
id: 是这里的唯一标识用来绑定接口中对应的方法
resultType: 返回值类型
-->
<select id="selectAll" resultType="com.baidou.pojo.User">
select * from user
</select>
</mapper>
7、编写MyBatis核心配置文件
参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html
<?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">
<!--mybatis核心配置文件-->
<configuration>
<!--可以多环境切换
default="development"
-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理-->
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--映射器-->
<mappers>
<!--之后mapper的配置文件需要在这里注册-->
<mapper resource="com/baidou/mapper/UserMapper.xml"/>
</mappers>
</configuration>
8、编写logback.xml日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件修改时重新加载,默认true -->
<configuration scan="true">
<!--控制台输出-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 输出的日志格式 -->
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg%n</pattern>
</encoder>
</appender>
<!--level:用来设置日志输出级别,有OFF FATAL ERROR WARN INFO DEBUG TRACE ALL,默认DEBUG-->
<logger name="com.baidou" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
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
*/
@Test
public 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.id
List<User> list = sqlSession.selectList("com.baidou.mapper.UserMapper.selectAll");
// 输出结果
for (User user :
list) {
System.out.println(user);
}
// 4、释放资源
sqlSession.close();
}
/**
* 使用Mapper代理开发,查询所有用户
* @throws IOException
*/
@Test
public 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<User> users = mapper.selectAll();
users.forEach(System.out::println);
// 4、关闭SqlSession
sqlSession.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
<?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="db.properties"/>
<environments default="development">
<environment id="development">
<!--事务管理-->
<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>
<!--<mapper resource="com/baidou/mapper/UserMapper.xml"/>-->
<package name="com.baidou.mapper"/>
</mappers>
</configuration>
1.3 environments(环境配置)
- MyBatis 可以配置多种环境,但每个 SqlSessionFactory 实例只能选择一种环境;
- 用ID这个唯一标识来切换默认使用的环境,如开发环境、测试环境、生产环境/线上;
- MyBatis默认的事务管理器是JDBC,后期在Spring中会替换成声明式事务;
- MyBatis默认连接池是POOLED,后期我们可以使用第三方数据库连接池(如Druid、C3P0等)。
在公司做项目的时候,如果开发阶段连接开发环境的数据库,那么数据库的配置要管运维或者DBA的同事要。
1.4 typeAliases(类型别名)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写;
使用场景:1、给实体类起别名(跟map挺像,K-V键值对)
<typeAliases>
<typeAlias type="com.baidou.pojo.User" alias="user"/>
</typeAliases>
使用场景:2、扫描实体类的包,它的的默认别名为类名,首字母小写
<typeAliases>
<package name="com.baidou.pojo"/>
</typeAliases>
在实体类比较少的时候使用第一种方式,如果实体类比较多建议使用第二种方式!
区别:第一种可以自定义别名,第二种它就不行(如果非要改 需要在实体类上增加@Alias注解)。
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
1.5 settings(设置)
在MyBatis全局配置文件中通过<settings>
标签控制MyBatis全局开关。
MyBatis的设置:https://mybatis.org/mybatis-3/zh/configuration.html#settings
示例:在mybatis-config.xml配置日志输出
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
1.6 mappers(映射器)
mappers(映射器)的作用是告诉 MyBatis 到哪里去找映射文件;
使用场景:1. 使用相对于类路径的资源引用(推荐使用)
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
使用场景:2. 使用映射器接口实现类绑定注册
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
使用场景:3. 使用包扫描进行注入绑定
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注:接口和它的配置文件必须同名,接口和它的映射文件必须在同级包下(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,并保持参数类型和返回值类型一致;