SSM
SSM框架说明
- Spring
指 Spring Framework,是Spring家族的核心。 - SpringMVC
SpringMVC 是 Spring Framework 的核心子项目,提供了一系列功能,使得开发者能够快速开发灵活、易于维护的Web应用程序 - MyBatis
MyBatis 是基于 Java 的持久层框架,用于和数据库映射;
MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作;
MyBatis 通过注解方式或者xml配置文件的方式来配置SQL和映射关系,灵活性非常高
SpringBoot
Spring Boot是一个Java软件开发框架(脚手架)
SpringBoot核心特性
- 起步依赖
创建项目时,会默认添加基础依赖,简化我们自己查找依赖的过程。 - 嵌入式服务(Tomcat)
SpringBoot工程支持内嵌的web服务,可以将tomcat这样的服务直接嵌套到web依赖中。
MyBatis
- Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互;
- 使用此框架程序员只需要通过注解或者修改xml配置文件的方式配置好需要执行的SQL语句,MyBatis框架会根据SQL语句生成对应的JDBC代码并对数据库中数据进行增删改查操作。
整合MyBatis
SpringBoot版本:2.7.17
依赖项:MySQL Driver、MyBatis Framework
application.properties配置文件中添加连接数据库信息
spring.datasource.url=jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
数据库中表的设计&Pojo对象设计
类型和数量必须严格对应,但是名称可以不一致,属性名和表字段名可以不一样
- 客户端>服务端
DTO
客户端传递给服务器端的数据, 封装到 DTO 类中 - 服务端>客户端
VO
服务端传递给客户端的数据, 一般会放到 VO 类中 - 实体类
entity
实体类和数据表一一映射关系
注: 生成get和set方法并重写toString方法
ORM
- ORM(Object Relational Mapping)叫做对象关系映射,用于将对象模型与关系型数据库之间进行映射;
- 目的是在程序开发中通过简化数据持久化的过程,提高开发效率;
- ORM 将数据库中的表、字段、记录关系结构映射为类、属性、对象面向对象的结构。开发人员可以通过面向对象的方式操作数据库。
Java | 数据库 |
---|---|
一个类 | 一张表 |
一个类属性 | 一个表字段 |
一个类属性 | 一个表字段 |
一个对象 | 一条表记录 |
Dao接口设计
- @Mapper注解
是由MyBatis框架提供,用于描述数据层接口,告诉系统底层为此接口创建其实现类,在实现类中定义数据访问逻辑,执行与数据库的会话(交互) - @Insert注解
使 MyBatis 框架根据接口方法的参数类型自动生成插入数据的代码 - 占位符 #{}
#{} 是 MyBatis 框架中用来表示占位符的语法
在 @Insert 注解中,#{}所代表的是一个占位符,它可以接受 Java 对象作为输入参数,并将其转换为预编译的 SQL 语句中的参数。使用 #{}可以帮助我们避免 SQL 注入等问题,同时也让 SQL 写起来更加简单 - @Select
- @Update
- @Delete
注: insert、update、delete返回值为受影响的数据条数int
Dao单元方法进行测试
@Autowired自动装配
实例化对象调用set方法
调用Mapper接口方法
MyBatis原理及流程
XML管理
xml定义
- XML是一种可扩展性语言,用户可以自己定义标签,用来描述特定类型的数据;
- XML的语法严格,每个标签都必须有一个结束标签,标签的嵌套关系也必须合法;
和SQL注解比较
- xml配置SQL,可以将SQL语句和JAVA代码分离开
- xml配置SQL,支持动态SQL语句
- xml配置SQL,支持SQL语句的复用
整合MyBatis框架及映射配置文件的位置
- SpringBoot版本:2.7.17
- 依赖项
MyBatis Framework
MySQL Driver
resources目录下创建mappers目录,并创建MyBatis-Mapper文件, 指定 namespace 属性值
<mapper namespace="cn.tedu.project.mapper._Mapper"></mapper>
application.properties中添加配置:mybatis框架映射配置文件的位置
mybatis.mapper-locations=classpath:mappers/*.xml
- 不再使用各Mapper接口中的@Insert,@Update,@Select,@Delete注解
Mybatis的XMl方式的流程
XML配置SQL标签
在 Mybatis 的 XML 文件中,SQL 语句都是使用 SQL 标签来定义的
注: 注释一定要放在标签的外面,不能放在里面,放在里面会被当做sql语句执行!
常用的SQL标签及属性
-
id属性
id为属性是接口方法名 -
select
用于查询操作,包括多表查询、条件查询等。可以使用 resultType 来指定返回结果的类型。 -
insert
用于插入操作,并将其自动注入实体类中。 -
update
用于更新操作,包括更新一条记录或者批量更新。 -
delete
用于删除操作,包括删除一条记录或者批量删除。
属性:
collection 用来设置遍历对象的类型
item 设置遍历出每一个变量的名称
separator 设置分隔符 -
if、foreach、set
用于条件控制,可以根据不同的条件进行查询、插入、更新和删除操作。
if 标签用于指定可以为空的查询条件,
foreach 标签用于循环查询,
set 标签用于指定更新操作的字段值。 -
sql
用于定义可重用的 SQL 片段,通常是一些较为复杂的 SQL 片段。可以在其它 SQL 语句中使用 include 标签来引用 SQL 片段。 -
include
用于引入外部的 SQL 片段。可以在 include 标签的 refid 属性中指定外部 SQL 片段的名字,然后在当前 SQL 中使用它。
多表联查常用的SQL标签及属性
- type 属性
指定一对多中代表一的VO类的地址 - resultMap 标签
多表查询 - id 标签:
主键 - result 标签:
非主键 - column 属性:
SQL语句查询字段名[可以是别名] - property 属性:
Java中的pojo类的属性名 - collection 标签:
映射集合类型属性,主要应用于一对多和多对多 - ofType 属性:
集合中的泛型所指的Java类,指定类的地址
这些 SQL 标签可以随意组合,可以使 SQL 语句变得很灵活和强大。通常需要根据实际业务场景选择合适的标签来实现相应的 SQL 操作。
增删改的返回值为整数类型,受影响的数据条数
动态SQL语句
动态SQL是指在程序运行时动态生成SQL语句的技术。它允许开发人员在程序运行时根据不同的条件拼接SQL语句,从而灵活地构建各种查询
动态删除数据
演示 foreache 标签的使用
某Mapper接口
/**1.第一种批量删除: 传递Integer的数组*/
int deleteByIds1(Integer[] ids);
/**2.第二种批量删除:传递集合参数*/
int deleteByIds2(List<Integer> ids);
定义映射文件某Mapper.xml
<delete id="deleteByIds1">
DELETE FROM comment WHERE id IN(
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
<!-- 集合传参,需要把collection改为 list -->
<delete id="deleteByIds2">
DELETE FROM comment WHERE id IN(
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
动态修改数据
使用xml中的 set 和 if 标签组合
<update id="dynamicUpdate">
UPDATE product
<set>
<if test="title!=null">title=#{title},</if>
<if test="price!=null">price=#{price},</if>
<if test="num!=null">num=#{num}</if>
</set>
WHERE id=#{id};
</update>
注: 逗号
SQL语句重用
SQL语句重用是指在数据库应用程序中,多次执行相同或类似的SQL语句时,通过重用这些语句来提高性能,减少系统消耗的资源
使用 sql 和 include 标签组合实现动态删除
<!-- 1.重复SQL抽取-sql标签 -->
<sql id="deleteSql">
DELETE FROM comment WHERE id IN
</sql>
<delete id="deleteByIds1">
<!--2.通过include标签复用-include标签-->
<include refid="deleteSql"></include>(
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
<delete id="deleteByIds2">
<!--2.通过include标签复用-include标签-->
<include refid="deleteSql"></include>(
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
多表联查
用户表和微博表的一对多查询案例
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`nickname` varchar(50) DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=521 DEFAULT CHARSET=utf8
CREATE TABLE `weibo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`content` varchar(255) DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8
package cn.tedu._04mybatis.pojo.entity;
import java.util.Date;
public class Weibo {
private Long id;
private String content;
private Date created;
private Long userId;
get()&set()&toString()
}
package cn.tedu._04mybatis.pojo.vo;
import cn.tedu._04mybatis.pojo.entity.Weibo;
import java.util.List;
public class ResultMapVO2 {
private Long id;
private String nickname;
private List<Weibo> weiboList;
get()&set()&toString()
}
查询多张表中相同字段名时, 注意使用别名,比如:u.id uid, w.id wid
<resultMap id="bbb" type="cn.tedu._04mybatis.pojo.vo.ResultMapVO2">
<id column="uid" property="id"/>
<result column="nickname" property="nickname"/>
<collection property="weiboList" ofType="cn.tedu._04mybatis.pojo.entity.Weibo">
<id column="wid" property="id"/>
<result column="content" property="content"/>
<result column="created" property="created"/>
<result column="user_id" property="userId"/>
</collection>
</resultMap>
<select id="selectMap2" resultMap="bbb">
SELECT u.id uid,
u.nickname,
w.id wid,
w.content,
w.created,
w.user_id
FROM user u
JOIN weibo w
ON u.id = w.user_id
WHERE u.id = #{uid}
</select>
@Test
void selectMap2Test(){
System.out.println(commentMapper.selectMap2(101));
}
resultMap 标签
查询结果与Java对象属性之间映射关系的一种配置方式,一般用于一对多和多对多的复杂查询
-
resultMap 标签
id 属性:唯一标识
type 属性:指定映射的JAVA类型 -
id 标签
指定映射的 主键 字段,包含:
column 属性:查询语句中的列名(或别名);
property 属性:Java类中的属性名 -
result 标签
指定映射的 非主键 字段,包含
column 属性 :查询语句中的列名(或别名)
property 属性 :JAVA类中的属性名 -
collection 标签
映射一对多或多对多关系
property 属性 :JAVA类中的属性名
ofType 属性 :集合中元素的类型