1.Mybatis入门
本章目标
- 什么是ORM
- 创建项目
- 配置说明
本章内容
一、什么是ORM
1、三层体系结构
随着计算机软件技术的发展,应用软件的体系结构也由最初的单层结构向双层、三层甚至多层结构发展,三层体系结构的模型分为表示层、业务逻辑层与数据层:
- 表示层:提供与用户进行交互(显示与收集数据)的界面。
- 业务逻辑层:用于进行各种业务逻辑的处理,如验证表单数据、保存数据到数据库等操作。
- 数据层:负责存放和管理应用的持久性业务数据
2、四层体系结构-持久层
目前,有很多开发人员使用四层式的软件开发模式,该模式进一步将三层模式中的业务逻辑层分离出一个单独的持久层,进行数据的持久化操作。一般来说,这种开发模式对大型的软件项目还是非常有用的。以下是四层体系结构模型的分析:
- 表示层:提供与用户进行交互的界面。
- 业务逻辑层:进行软件核心业务逻辑的处理。
- 持久层:用于进行对象的持久化操作。
- 数据层:用于保存持久化数据。
3、什么是ORM
对象-关系映射(Object/Relation Mapping,简称ORM)一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,将java程序中的对象自动持久化到关系数据库中.
- Object(对象),在业务逻辑层和表示层我们会将各参与实体进行面向对象封装
- Rational(关系型数据),在目前的系统中大多数情况下都是关系型数据库对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
- 对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
4、ORM框架
目前众多厂商和开源社区都提供了持久层框架的实现,比较流行的ORM产品,如下表所示:
产品名 | 网站支持 |
---|---|
Apache OJB | http://db.apache.org/ojb/ |
Cayenne | http://objectstyle.org/cayenne/ |
Jaxor | http://jaxor.sourceforge.net |
Hibernate | http://www.hibernate.org |
MyBatis | https://mybatis.org/mybatis-3/zh_CN/index.html |
jRelationalFramework | http://ijf.sourceforge.net |
Mirage | http://itor.cq2.org/en/oss/mirage/toon |
SMYLE | http://www.drjava.de/smyle |
TopLink | http://otn.oracle.com/products/ias/toplink/index.html |
5、Mybatis入门
官网:https://mybatis.org/mybatis-3/zh_CN/index.html
5.1、简介
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis
避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近95% 的代码。MyBatis
致力于减少使用成本,让用户能更专注于 SQL 代码。
5.2、MyBatis结构图
接口层
接口层的核心是SqlSession,它是上层应用和Mybatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到请求时,会调用核心处理层的各个模块来完成具体对数据库的操作。
核心处理层
核心处理层完成对数据库的所有操作。
核心处理层主要做了这几件事:
1.把接口中传入的参数解析并且映射成JDBC类型;
2.解析xml文件中的SQL语句,包括插入参数,和动态SQL生成;
3.执行SQL语句;
4.处理结果集并映射成Java对象;
插件也属于核心层,这是因为它的工作方式是拦截核心处理层的四大对象。
基础支持层
基础支持层主要是为了让一些通用的功能实现复用,用来支持核心处理层工作。比如数据源、缓存、日志、xml解析、反射、事务等
二、创建Mybatis项目
1、导包
pom.xml文件
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
2、主配置文件
在resources目录中创建并配置mybatis-config.xml
配置信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"/>
<!-- POOLED:mybatis自带的数据源 -->
<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>
<!--注册mapper.xml-->
<mappers>
<mapper resource="mapper/DeptMapper.xml"/>
</mappers>
</configuration>
注册方式有四种:
<!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 --> <package name="com.woniuxy.mybatis.mapperinterface"/> <!-- 通过mapper元素的resource属性可以指定一个相对于类路径的Mapper.xml文件 --> <mapper resource="com/woniuxy/mybatis/mapper/UserMapper.xml"/> <!-- 通过mapper元素的url属性可以指定一个通过URL请求道的Mapper.xml文件 --> <mapper url="file:///E:/UserMapper.xml"/> <!-- 通过mapper元素的class属性可以指定一个Mapper接口进行注册 --> <mapper class="com.woniuxy.mybatis.mapperinterface.UserMapper"/>
3、连接数据库配置信息
在resources目录中创建并配置jdbc.properties
信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hrms?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=root
4、创建实体类
package com.woniuxy.hrms.entity;
import lombok.Data;
@Data
public class Dept {
private int id;
private String deptName;
private String remark;
}
5、创建接口
在Mybatis中一般把dao层命名为mapper,接口命名为XXXMapper
package com.woniuxy.hrms.mapper;
import com.woniuxy.hrms.entity.Dept;
import java.util.List;
public interface DeptMapper {
List<Dept> queryAll();
}
6、配置映射文件
在resources目录中创建mapper文件,并在文件夹中创建DeptMapper.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">
<!-- namespaces属性将xml文件和接口关联 -->
<mapper namespace="com.woniuxy.hrms.mapper.DeptMapper">
<select id="queryAll" resultType="com.woniuxy.hrms.entity.Dept">
select * from dept
</select>
</mapper>
注意:官网拷贝下来的头部文件是https://mybatis.org/dtd/mybatis-3-mapper.dtd, 把https改成http会有意外的惊喜
select标签负责查询功能
- id属性就是方法名
- resultType结果集的类型,如果是集合则写泛型类型即可
- 在标签对之间编写sql语句
- 注意不要加分号
7、在主程序中测试
public class App {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
IDeptDao deptMapper = sqlSession.getMapper(DeptMapper.class);
List<Dept> list = deptMapper.queryAll();
list.forEach(System.out::println);
sqlSession.close();
}
}
8、优化SQL
如果结果集中的列名与实体类的属性名一致,可以直接返回实体类对象,但我们目前表结构和实体类结构如下:
dept表字段 | Dept实体类属性 |
---|---|
id | id |
dept_name | deptName |
remark | remark |
在定义数据库表字段时经常会出现下划线的方式,那么这时我们发现查询的List结果中的deptName一项的值为空,这时我们只需要给表字段起别名,别名的名称和实体字段一致即可:
<select id="queryAll" resultType="Dept">
select id,dept_name as deptName,remark from dept
</select>
这只是一种解决方案,后期我们还可以通过ResultMap来解决,讲到时再说
三、配置说明
1、类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写
1、配置方式一:
配置单个实体,修改mybatis-config.xml
配置信息,添加typeAliases
标签
<properties resource="jdbc.properties"></properties>
<typeAliases>
<typeAlias type="com.woniuxy.hrms.entity.Dept" alias="Dept"/>
</typeAliases>
<environments default="development">
……
当这样配置时,Dept
可以用在任何使用 com.woniuxy.hrms.entity.Dept
的配置文件中。
2、别名应用:
修改DeptMapper.xml
文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.woniuxy.hrms.mapper.DeptMapper">
<select id="queryAll" resultType="Dept">
select id,dept_name as deptName,remark from dept
</select>
</mapper>
resultType改为Dept,首字母大小写均可
3、配置方式二:
直接配置包名,指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<typeAliases>
<package name="com.woniuxy.hrms.entity"/>
<!--<typeAlias type="com.woniuxy.hrms.entity.Dept" alias="Dept"/>-->
</typeAliases>
每一个在包 dcom.woniuxy.hrms.entity 中的 Java Bean,在没有注解的情况下,会使用Bean 的首字母小写(大写也可以)的非限定类名来作为它的别名。
类的短名(dept|Dept))
比如
com.woniuxy.hrms.entity.Dept
的别名为dept
;
4、更多别名
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_char (since 3.5.10) | char |
_character (since 3.5.10) | char |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
char (since 3.5.10) | Character |
character (since 3.5.10) | Character |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
object | Object |
date[] | Date[] |
decimal[] | BigDecimal[] |
bigdecimal[] | BigDecimal[] |
biginteger[] | BigInteger[] |
object[] | Object[] |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
2、配置日志
Mybatis
通过使用内置的日志工厂提供日志功能。 内置日志工厂将会把日志工作委托给下面的实现之一:
- SLF4J
- Apache Commons Logging
- Log4j2
- Log4j
- JDK logging
MyBatis
内置日志工厂会基于运行时检测信息选择日志委托实现。它会(按上面罗列的顺序)使用第一个查找到的实现。当没有找到这些实现时,将会禁用日志功能。
1、配置STDOUT_LOGGING
STDOUT_LOGGING是标准日志输出,他写在mybatis-config.xml文件的<settings>
标签内:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
他不需要再注入其他依赖,直接就能跑起来,现在写一个测试类,看一下他的输出:
思维导图
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18832166