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 属性 :集合中元素的类型

请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值