ssm学习笔记day07mybatis

项目的准备

创建springboot项目(moudle),加入依赖lombok(自动添加setter,getter,toString)、Spring Web(处理servlet请求)、MySQL Driver(mysql的驱动器)、JDBC(JAVA与mysql的接口)、mybatis framework。
在这里插入图片描述
在这里插入图片描述

ps:我在添加mybatis framework依赖的时候,上面灰了,应该是maven里面没有对应的包导致的,解决办法很简单,之前学过maven的相关东西,直接在pom.xml中加上依赖即可。
在这里插入图片描述

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

对项目做配置,首先配置对应的数据库。

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-example
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

接下来进入正题,先写好Emp对象(/bean/Emp.class)

package com.atguigu.mybatis.bean;import lombok.Data;@Data
public class Emp {private Integer id;private String empName;private Integer age;private Double empSalary;}

然后创建EmpMapper接口(/dao/EmpMapper)

package com.atguigu.mybatis.dao;import com.atguigu.mybatis.bean.Emp;
import org.apache.ibatis.annotations.Mapper;@Mapper //告诉spring这是mysql操作数据库
public interface EmpMapper {Emp getEmpById(Integer id);void addEmp(Emp emp);void updateEmp(Emp emp);void deleteEmpById(Integer id);
}

这个就相当于以前的DAO层,用mybatis去实现了。
接下来就是配置mybatis信息,可以用插件事半功倍,下载插件mybatisX,如果要编写对应的xml,可以在函数附近按ALT+ENTER即可。
在这里插入图片描述
然后找resource下找一个合适位置存放即可,这里存放在了mapper/EmpMapper.xml
在这里插入图片描述
里面的内容如下,前两句是固定搭配,不用记忆,<mapper>负责绑定对应的mapper接口类,然后编写方法。

<?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-->
<mapper namespace="com.atguigu.mybatis.dao.EmpMapper">
</mapper>

但是mybatis也要知道这个xml在哪里,于是还需要再resource/application.prosperities写相应的位置。这里用通配符(**.xml)表示文件里面的所有文件都能绑定。

在这里插入图片描述


CRUD的编写

在Empmapper类中,我们需要对这个类标注为@mapper让mybatis识别到这个类,然后接几个方法类。如图下所示。

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.bean.Emp;
import org.apache.ibatis.annotations.Mapper;@Mapper //告诉spring这是mysql操作数据库
public interface EmpMapper {Emp getEmpById(Integer id);void addEmp(Emp emp);void updateEmp(Emp emp);void deleteEmpById(Integer id);
}

然后这些方法的具体实现要在/mapper/Empmapper.xml去实现。刚才我们把这个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" >
<!--绑定对应的mapper-->
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper"><!--    在里面写方法 , id绑定方法名 #{变量名} resultType返回类型--><select id="getEmpById" resultType="com.atguigu.mybatis.bean.Emp">SELECT id , emp_name empName, age , emp_salary empSalary FROM t_emp WHERE id = #{id}</select><insert id="addEmp">insert into t_emp(emp_name , age , emp_salary) values(#{empName} ,#{age} , #{empSalary})</insert><update id="updateEmp">UPDATE t_emp SET emp_name = #{empName} , age = #{age} , emp_salay = #{empSalary} WHERE id = #{id}</update><delete id="deleteEmpById">DELETE FROM t_emp WHERE id = #{id}</delete>
</mapper>

用标签标记方法类型,如<select><update<insert><delete>等,id是绑定mapper类的方法,然后里面写sql语句即可。需要注意的是,方法中可能会带有参数,也需要传到sql语句中,可以用#{变量名}引用。

开SQL日志

很简单,在application.prosperities中配置相关信息即可。
在这里插入图片描述
语法为logging.level."mapper包"=debuglogging.level."mapper包"=debuglogging.level."mapper"=debug
含义是mapper包里面的类进行的debug级别以上的行动都会被记录。

为添加的数据提供自增id

useGenerateKeys相当于insert标签的属性类,表示是否使用自增ID, keyProperty表示自增的变量是id。

    <!--    useGeneratedKeys表示是否使用自增ID, keyProperty表示自增的变量是id--><insert id="addEmp" useGeneratedKeys="true" keyProperty="id">insert into t_emp(emp_name , age , emp_salary) values(#{empName} ,#{age} , #{empSalary})</insert>

useGenerateKeys具有自增回填的功能,当制定的id自增后,会返回到原有的实例对象中。
可以通过Test实验理解:

    @Testvoid testCRUD(){Emp emp = new Emp();emp.setId(5);emp.setEmpName("张三5");emp.setAge(105);emp.setEmpSalary(1000.00);empMapper.addEmp(emp);Integer empId = emp.getId();System.out.println(empId);}

empMapper.add(emp)之后,把自增的id返回到emp的id当中,输出便可以查看自增后的id是多少。
在这里插入图片描述

查询所有数据(集合)

    <!--    在里面写方法 , id绑定方法名 #{变量名} resultType返回类型--><select id="getEmpById" resultType="com.atguigu.mybatis.bean.Emp">SELECT id , emp_name empName, age , emp_salary empSalary FROM t_emp WHERE id = #{id}</select><!--    返回的是集合,但是还是写集合中元素的对象类型--><select id="getAll" resultType="com.atguigu.mybatis.bean.Emp">SELECT id , emp_name empName, age , emp_salary empSalary FROM t_emp</select>

和之前的selectEmpById类似,返回类型只看集合元素的类型,不用管是不是集合。

开启驼峰和下划线的转换

在Emp实体类中,属性是驼峰命名法,而在数据库中用的是下划线命名法,需要一个工具对其进行转换,方法很简单,只需要在application.prosperites中添加一句话
在这里插入图片描述

mybatis.configuration.map-underscore-to-camel-case=true

参数传递遇到多个参数的解决办法

在这里插入图片描述

示例
EmpParamMapper实现

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.bean.Emp;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
import java.util.Map;@Mapper
public interface EmpParamMapper {Emp getEmploy(Integer id);Emp getEmploy02(List<Integer> ids);
//void addEmploy(Emp e);
//void addEmploy2(Map<String , Object> m);}

EmpParamMapper.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" >
<mapper namespace="com.atguigu.mybatis.mapper.EmpParamMapper"><select id="getEmploy" resultType="com.atguigu.mybatis.bean.Emp">SELECT * FROM t_emp WHERE id = #{abc}</select><select id="getEmploy02" resultType="com.atguigu.mybatis.bean.Emp">SELECT * FROM t_emp WHERE id = #{ids[1]}</select><insert id="addEmploy">INSERT INTO t_emp(emp_name , age) VALUES(#{empName} , #{age})</insert><insert id="addEmploy2">INSERT INTO t_emp(emp_name , age) VALUES(#{empName} , #{age})</insert></mapper>

@Param的使用

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.bean.Emp;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
import java.util.Map;@Mapper
public interface EmpParamMapper {Emp getEmployByIdAndName(Integer id, @Param("name") String name);Emp getEmployHaha(@Param("id") Integer id, @Param("m") Map<String, Object> m , @Param("ids") List<Integer> ids , @Param("e") Emp e);
}
<?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.atguigu.mybatis.mapper.EmpParamMapper"><select id="getEmployByIdAndName" resultType="com.atguigu.mybatis.bean.Emp">SELECT * FROM t_emp WHERE id = #{id} AND emp_name = #{name}</select><select id="getEmployHaha" resultType="com.atguigu.mybatis.bean.Emp">SELECT * FROM t_emp WHERE id = #{id} AND emp_name = #{m.name} AND age = #{ids[2]} AND emp_salary = #{e.empSalary}</select>
</mapper>

参数传递返回值的处理

很简单,基本类型就直接写就完事了
在这里插入图片描述
其中Map比较复杂,需要制定Map_key对应的属性值,用@Mapkey(“属性名”)指定,剩下的基本上大差不差,例子如下:

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.bean.Emp;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;@Mapper
public interface EmpReturnValueMapper {Long countEmp();BigDecimal getEmpSalary(@Param("id")Integer id);@MapKey("id")Map<Integer , Emp> getAllEmp();
}
<?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.atguigu.mybatis.mapper.EmpReturnValueMapper"><select id="countEmp" resultType="java.lang.Long">SELECT COUNT(*) FROM t_emp</select><select id="getEmpSalary" resultType="java.math.BigDecimal">SELECT emp_salary FROM t_emp WHERE id = #{id}</select><select id="getAllEmp" resultType="com.atguigu.mybatis.bean.Emp">SELECT * FROM t_emp</select></mapper>

自定义结果集ResultMap,使用方法如下,<select>标签中属性resultMap绑定对应的id,自定义<resultMap>标签,然后<id>标签绑定的是主键,<result>绑定的是属性,然后column是数据库中的属性名,property是JavaBean中的属性名。

    <resultMap id="EmpRm" type="com.atguigu.mybatis.bean.Emp"><id column="id" property="id"></id><result column="emp_name" property="empName"></result><result column="age" property="age"></result><result column="emp_salary" property="empSalary"></result></resultMap><select id="getEmpById" resultMap="EmpRm">SELECT * FROM t_emp WHERE id = #{id}</select>

关联查询

说白了就是表的链接,然后封装到一个类中,比如说网上买东西中,一个用户对应多个订单,一个订单对应一个用户购买。于是我们定义以下两种Bean
Customer

import lombok.Data;import java.util.List;@Data
public class Customer {private Integer id;private String customerName;private String phone;private List<Order> orders;
}

Order

package com.atguigu.mybatis.bean;import lombok.Data;
import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails;import java.math.BigDecimal;@Data
public class Order {private Integer id;private String address;private BigDecimal amount;private Integer customerId;//订单对应的客户private Customer customer;
}

可以发现Order中有Customer的成员类,我们要通过SQL语句封装这个Order类,就要用到表的链接,这时困难出现了,怎么把表的多个元素返回到一个成员类中呢,根据关联查询一对一和一对多的关系分为assiciation、collection。以下是两个xml的实现方法:
利用ReslutMap,在里面套一个assiciation,assiciation的property属性对应成员类的名字,JavaType对应成员类的类型;collection的property属性对应成员类集合的名字,OfType对应成员类的类型。

<?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.atguigu.mybatis.mapper.OrderMapper"><resultMap id="OrderRM" type="com.atguigu.mybatis.bean.Order"><id column="id" property="id"></id><result column="address" property="address"></result><result column="amount" property="amount"></result><result column="customer_id" property="customerId"></result><association property="customer" javaType="com.atguigu.mybatis.bean.Customer"><id column="c_id" property="id"></id><result column="customer_name" property="customerName"></result><result column="phone" property="phone"></result></association></resultMap><select id="getOrderByIdWithCustomer" resultMap="OrderRM">SELECT o.* , c.id c_id , c.customer_name , c.phone  FROM t_order oLEFT JOIN t_customer cON o.customer_id = c.idWHERE o.id = #{id}</select>
</mapper>
<?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.atguigu.mybatis.mapper.CustomerMapper"><resultMap id="CustomerRM" type="com.atguigu.mybatis.bean.Customer"><id column="c_id" property="id"></id><result column="customer_name" property="customerName"></result><result column="phone" property="phone"></result><collection property="orders" ofType="com.atguigu.mybatis.bean.Order"><id column="id" property="id"></id><result column="address" property="address"></result><result column="amount" property="amount"></result><result column="customer_id" property="customerId"></result></collection></resultMap><select id="getCustomerByIdWithOrders" resultMap="CustomerRM">SELECT c.id c_id , c.customer_name , c.phone , o.*  FROM t_customer cLEFT JOIN t_order oON o.customer_id = c.idWHERE c.id = #{id}</select>
</mapper>

自动查询

延迟加载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91202.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 高级调度01

目录 一、 初始化容器 InitContainer 1. InitContainer 的基本概念 2. 延迟指定时间后启动 3. 使用初始化容器修改内核参数 4. 等待依赖的服务启动后再启动应用 5. pause 容器 二、 临时容器 Ephemeral Containers 1. 临时容器的概念 2. 临时容器的使用示例 三、 自动…

Spring MVC2

在Spring MVC1中&#xff0c;我们知道了MVC的定义&#xff0c;同时也知道了RequestMapping和RestController这个注解的作用。本篇文章&#xff0c;我们将学习使用Spring MVC获取请求参数和返回不同的响应等等请求传递单个参数如图所示&#xff0c;创建RequestController类&…

项目文章(IF:9.3)转录因子ChIP-seq助力揭示CsphyB-CsPIF4-CsBRC1模块调控ABA合成和腋芽生长发育

分枝生长是作物农业特性中的一项重要指标&#xff0c;它直接影响植株的结构和作物的产量。黄瓜&#xff08;学名&#xff1a;Cucumis sativus L.&#xff09;是一种在全球范围内具有重要经济价值和营养价值的重要蔬菜作物。在田间环境中&#xff0c;具有更多侧枝的黄瓜植株更受…

NSSCTF Web 一点学习

[SWPUCTF 2021 新生赛]jicao连接&#xff1a;利用hackbar&#xff0c;按照php的判断条件来得到flag[SWPUCTF 2021 新生赛]easyrce连接&#xff1a;url读取并且执行先用ls查看flag位置&#xff1a;找到了个看起来是flag的文件cat一下&#xff1a;得到flag[SWPUCTF 2021 新生赛]c…

【STM32项目】环境监测设计

✌️✌️大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是基于《基于STM32的环境监测设计》。 目录 1、系统功能 2.1、硬件清单 2.2、功能介绍 2.3、控制模式 2、演示视频和实物 3、系统设计框图 4、软件设计流程图 5、原理图 6、主…

不同系统记录项目进度不一致,如何统一口径

不同系统记录项目进度不一致&#xff0c;会造成项目管理混乱、信息混淆和决策失误。统一口径的方法包括&#xff1a;采用统一的项目管理平台、明确数据记录与更新规范、建立进度数据对接与整合机制。特别是采用统一的项目管理平台&#xff0c;通过统一的信息输入与输出渠道&…

玩转Docker | 使用Docker部署Drawnix在线白板工具

玩转Docker | 使用Docker部署Drawnix在线白板工具 前言一、Drawnix介绍Drawnix简介Drawnix主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Drawnix服务下载Drawnix镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Drawnix服务访…

Linux操作系统从入门到实战(九)Linux开发工具(中)自动化构建-make/Makefile知识讲解

Linux操作系统从入门到实战&#xff08;九&#xff09;Linux开发工具&#xff08;中&#xff09;自动化构建-make/Makefile前言一、 make/Makefile是什么&#xff1f;1. 我们先想个问题&#xff1a;手动编译代码有多麻烦&#xff1f;2. 为了解决麻烦&#xff0c;才有了自动化工…

开源b2b2c商城源码 支持多端适用 含完整代码包和图文搭建教程

在电商行业蓬勃发展的当下&#xff0c;b2b2c商城系统成为众多企业拓展业务版图的有力工具。这种支持自营与商家入驻并存的系统&#xff0c;含丰富平台商品种类&#xff0c;能通过多元化运营提升平台竞争力。本文分享一个开源b2b2c商城源码的相关知识&#xff0c;并详细介绍其搭…

Vue3入门-指令补充

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;vscode\node.js &#x1f680;所属专栏&#xff1a;Vue3 文章目录1. 指令修饰符1.1 按键修饰符1.2 事件修饰符1.3 v-model修饰符2. v-model用在其他表单元素上3. 样式绑定3.1 操作class4. 操作style5.…

UDP类型套接字

理解UDP协议&#xff1a;互联网世界的"明信片"通信 UDP是什么&#xff1f;为什么需要它&#xff1f; 想象一下&#xff0c;你正在给朋友寄送两种不同的东西&#xff1a;一份重要的合同文件和一叠度假时的风景明信片。对于合同文件&#xff0c;你会选择挂号信&#xf…

redis快速入门教程

更新中基本概念安装centOS安装redis&#xff1a;yum install redis -y启动&#xff1a;systemctl start redis设置开机启动&#xff1a;systemctl enable redis检查运行状态&#xff1a;systemctl status redis远程访问编辑配置文件 vi /etc/redis.conf在其中修改为bind 0.0.0.…

UDP和TCP的主要区别是什么

UDP&#xff08;用户数据报协议&#xff09;和 TCP&#xff08;传输控制协议&#xff09;是互联网传输层的两大核心协议&#xff0c;主要区别体现在​​连接方式、可靠性、传输效率、头部开销​​及​​适用场景​​上。以下是具体对比&#xff1a;​​一、核心区别对比表​​​…

ASP .NET Core 8结合JWT轻松实现身份验证和授权

身份验证和授权是每一个后端服务必不可少的&#xff0c;可以实现对非法请求进行拦截&#xff0c;能够有效保护数据的安全性。 JSON Web Token&#xff08;JWT&#xff09;是一项开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方法&#xff…

5G时代的智慧灯杆:塔能“一杆多用”方案如何激活城市新基建?

在《5G应用“扬帆”行动计划》持续推进的进程之中&#xff0c;智慧杆已然成为了5G基站部署环节极为重要的载体&#xff0c;并且被明确地归入到新型基础设施建设的重点范畴之内。相关政策提出&#xff0c;要在2025年达成重点区域5G网络全面且深度覆盖的目标&#xff0c;与此同时…

护照阅读器:国外证件识别的 OCR “解码师”

国外证件版式多样、语种繁杂&#xff0c;人工识别不仅耗时&#xff0c;还易因翻译误差、格式不熟悉导致信息错漏。尤其在跨境业务场景中&#xff0c;传统识别方式严重影响效率与准确性。护照阅读器搭载的 OCR 技术成为破局关键。它能精准提取国外护照、驾照等证件上的多语种文字…

Linux部署Python服务

1、创建项目目录与虚拟环境#确保安装 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 创建虚拟环境#Linux source venv/bin/activate # 激活虚拟环境#Windowds venv\S…

【Python办公】使用Python和Tkinter构建Excel数据导入MySQL工具(GUI版)

目录 专栏导读前言项目概述技术栈环境准备核心代码实现1. 导入必要的库2. 主应用类设计3. 用户界面设计数据库配置区域数据库选择区域4. 数据库连接功能测试连接获取数据库列表5. 数据导入功能关键技术点解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 认证问题3. 避免启动时连接错…

华为OD机试_2025 B卷_猜数字(Python,100分)(附详细解题思路)

题目描述 一个人设定一组四码的数字作为谜底&#xff0c;另一方猜。 每猜一个数&#xff0c;出数者就要根据这个数字给出提示&#xff0c;提示以XAYB形式呈现&#xff0c;直到猜中位置。 其中X表示位置正确的数的个数&#xff08;数字正确且位置正确&#xff09;&#xff0c;而…

【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线

1. 简介 在网络安全领域&#xff0c;每天都会产生大量安全警报。作为一名安全分析师&#xff0c;识别、评估并优先处理这些警报的能力至关重要。三分法&#xff08;Triage&#xff09; 是确保安全团队高效响应安全事件的核心流程&#xff0c;它能够帮助我们合理分配资源、集中精…