Mybatis
文章目录
1.Mybatis介绍
(1)Mybatis vs 传统JDBC
-
连接池取代数据库的连接与释放
传统的jdbc连接数据库需要自己编写代码来获取数据库连接、关闭连接;MyBatis使用连接池来管理数据库连接,可以减少数据库连接的创建和释放操作,提高了性能。(实际上是一组已经建立好的数据库连接,这些连接被预先创建并存放在池中,应用程序可以从连接池中获取连接,使用完毕后将连接返回到池中。)
-
SQL语句统一存取
SQL语句统一集中放到配置文件(映射文件)XML里面(以key-value的格式存放),然后通过SQL语句的key值去获取对应的SQL语句。取代了JDBC需要开发人员编写大量的、散落在java类(dao层的实现类)中的样板式代码来处理SQL语句的执行和结果集的处理,Mybatis将JDBC的样板式代码封装起来到XML中,使开发人员可以更加方便地操作数据库(Mybatis这样的ORM使得dao层实现类没有必要存在了,dao层只需要接口(mapper接口)就行了),更加关注业务逻辑。
(2)三层架构中的 持久层DAO
持久层与持久化的区别:
-
“持久化”仅指将域对象永久保存至数据库(数据库是一种持久存储介质)中。
-
“持久层”是指在系统逻辑层面上,专注于实现数据持久化的一个相对独立的领域。(也就是说,专注于将数据和数据库间进行存取的一层)
(3)Mybatis
Mybatis特点
- 简单:MyBatis很小,没有任何第三方依赖,最简单安装只要一个jar文件,配置几个SQL映射文件,易于学习,易于使用。
- 灵活:MyBatis不会对应用程序或者数据库的现有设计强加任何影响。 SQL写在XML里,便于统一管理和优化。通过SQL语句可以满足操作数据库的所有需求。
- 解耦:通过提供DAO层,将业务逻辑(service层)和数据访问逻辑(dao层)分离,使系统的设计更清晰,更易开发,更易测试,更易维护。
优点
- 支持ORM
- 支持动态SQL
- 外部化SQL语句
- 封装SQL语句
入门使用流程
-
下载jar包
-
在maven的pom.xml中加入mybatis和Mysql的dependecy依赖
-
在mysql中创建表(可视化软件中进行)
-
创建mybatis配置文件mybatis-config.xml,配置数据库的连接信息(若是用了springboot就用application.properties配置)
配置数据源 <dataSource type="POOLED"> <!-- 数据库JDBC驱动 --> <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <!-- 数据库URL --> <property name="url" value="jdbc:sqlserver://127.0.0.1:1433;database=shop" /> <!-- 用户名 --> <property name="username" value="sa" /> <!-- 密码 --> <property name="password" value="sa" /> </dataSource>
-
创建实体类:包含了表中的字段以及对应的 getter 和 setter 方法
实体类作用:
数据映射:实体类可以与数据库表进行一一对应的映射,方便程序对数据库进行操作。通过实体类,我们可以直接访问数据库表中的字段,进行数据的查询、新增、更新和删除等操作。
参数传递:在 MyBatis 中,查询条件 和 返回结果 通常是以实体类的形式传递的。我们可以将实体类作为查询条件,传递到 Mapper 接口中,完成数据的查询。同时,我们也可以将实体类作为返回值,将查询结果封装为一个实体类对象,返回给调用方。
代码生成:在 MyBatis 中,我们可以使用 MyBatis Generator 工具来自动生成实体类、Mapper 接口和 XML 映射文件等代码。通过配置好数据库连接和表信息,即可快速生成符合规范的代码,减少了开发人员的工作量。
public class User implements Serializable { //属性字段 private int userId; private String userName; private String userPassword; private Date userBirth; private String userAddress; private String userPhone; private int userStatus; //无参数的构造函数 //getter和setter }
-
创建实体类对应的mapper接口(映射器)和其对应的xml映射文件
Mapper 接口用于定义 SQL 语句的执行方法,
而 XML 映射文件则用于存储 SQL 语句和参数映射信息。
二者位置:
src/main/resources/
├── mybatis │
├── mapper
│ └── UserMapper.java
│ └── UserMapper.xml
└── application.properties
mapper接口: public interface UserMapper { //新增用户 public void insertUser(User user); //根据用户名和密码查询用户 public User selectUserByNameAndPassword(User user); //查询所有的用户 public List<User> selectAllUsers();
<?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="com.shop.persistence.UserMapper"> <!-- 添加用户 --> <insert id="insertUser" parameterType="user" useGeneratedKeys="true"> SQL语句 </insert> <!-- 根据用户名和密码查询用户 --> <select id="selectUserByNameAndPassword" parameterType="user" resultType="user"> SQL语句 </select> </mapper>
详解:
-
namespace表示该配置文件对于映射器(UserMapper)接口的完全路径。该属性值通常设置为“包名+SQL映射文件名”
-
insert 映射插入语句
id表示在命名空间中唯一的标识符,可以被用于引用该语句,与映射器接口中的方法一致时,会在该方法中使用该语句。
parameterType表示将会传入该语句的参数类型的完全限定名或别名。
useGeneratedKeys表示使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键(实现标识列自动增长)。
-
select 映射查询语句
id表示在命名空间中唯一的标识符,可以被用于引用该语句,与映射器接口中的方法一致时会在该方法中使用该语句。
parameterType表示将会传入该语句的参数类型的完全限定名或别名。
resultType表示从这条语句中返回的期望类型的完全限定名或别名,如果返回的是集合,则应是集合中包含元素的类型(User),而并非集合本身。
-
2.Mybatis配置
核心配置文件mybatis-config.xml:
但在使用 Spring Boot 集成 MyBatis 时,可以不必使用 MyBatis 的配置文件 mybatis-config.xml
,因为 Spring Boot 集成 MyBatis 时会自动配置 MyBatis 相关的配置项。
3.Mybatis映射器
由Java 接口和 XML 文件共同组成
-
接口与映射器之间关系:
注:还可通过在mapper接口中用注解的方式实现映射器(注解里写sql语句),不推荐
package com.shop.persistence
public interface UserMapper {
//新增用户
@Insert(value = “insert into user (id,name,password,email,bio)
values (#{id},#{name},#{password},#{email},#{bio}) ”)
public void insertUser(User user);
}
-
select (mapper文件中元素
查询语句是使用MyBatis时最常用的元素之一。当从数据库中取出数据时,会发现将数据存储在数据库中是很有价值的,所以许多应用程序的查询操作相较更改数据操作更多。
<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>
该语句被称为selectPerson,使用一个int(或Integer)类型的参数,并返回一个HashMap类型的对象,其中的键是列名,值是列对应的值。
-
insert、update和delete 它们三者是相似的(mapper文件中元素
<insert id="insertAuthor" parameterType="domain.blog.Author"> insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio}) </insert> <update id="updateAuthor" parameterType="domain.blog.Author"> update Author set username = #{username}, password = #{password}, email = #{email}, bio = #{bio} where id = #{id} </update> <delete id="deleteAuthor” parameterType="int"> delete from Author where id = #{id} </delete>
-
resultMap(mapper文件中最重要、强大的元素
解决列名与属性名称不匹配的问题
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
property指的是实体类中的属性名
column指的是对应查询语句中的列名(注意,不一定是数据库表中的列名!!!、当然,大多数情况下肯定是的)
其引用语句使用resultMap属性即可(注意,我们去掉了resultType属性)。例如:
<select id=”selectUsers” parameterType=”int” resultMap=”userResultMap”>
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>
4.mybatis关联与映射
- 在软件开发的不同阶段需要建立不同的模型:
分析阶段:概念模型(技术人员和非技术人员都得看懂)
设计阶段:域模型、关系数据模型
-
各种模型之间存在转换关系:
也就是面向对象模型和关系模型间的转换
域对象:实体域对象、过程域对象、事件域对象。概念模型的实体一般需要转换成实体域对象
-
ORM模式
-
即:Object Relation Mapping 简称对象关系映射
-
ORM通过特定的配置文件 定义域对象与关系数据库之间的关系来实现域模型到关系数据模型的映射
-
ORM通过从业务层分离一个单独的持久化层来实现域模型与关系数据模型之间的映射。
-
在持久化层通过向业务层公开API接口,来实现业务系统的数据持久化。
-
-
对象–关系的匹配与不匹配
匹配:
面向对象的概念 面向关系的概念 类 表 对象 表行、记录 属性 表列、字段
不匹配:
- 域模型主要由域对象的关联,依赖,聚集,一般化关系组成,而关系模型只有参照完整性
- 域模型中有继承关系,关系模型不能直接表示继承关系
- 域模型中有多对多的关系,而关系模型中只能通过连接表来表示多对多的关联关系
- 域模型中有双向关联关系,关系模型只有单向参照关系,只有多参照 一的一方
- 域模型提倡精粒度的设计,而关系模型则提倡粗粒度的设计
- 看一对一就行了,一对多只做了解
5.mybatis动态SQL
可以灵活处理多条件查询,无须在代码中动态拼接SQL语句,从而简化了数据访问层的开发。
段 |
不匹配:
- 域模型主要由域对象的关联,依赖,聚集,一般化关系组成,而关系模型只有参照完整性
- 域模型中有继承关系,关系模型不能直接表示继承关系
- 域模型中有多对多的关系,而关系模型中只能通过连接表来表示多对多的关联关系
- 域模型中有双向关联关系,关系模型只有单向参照关系,只有多参照 一的一方
- 域模型提倡精粒度的设计,而关系模型则提倡粗粒度的设计
- 看一对一就行了,一对多只做了解
5.mybatis动态SQL
可以灵活处理多条件查询,无须在代码中动态拼接SQL语句,从而简化了数据访问层的开发。