Mybatis学习(黑马程序员)

news2025/1/11 21:58:02

Mybatis操作数据库的步骤:

  1. 准备工作(创建springboot工程、数据库表user、实体类User)
  2. 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
  3. 编写SQL语句(注解/XML

1.创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包
2.在springboot项目中,可以编写application.properties文件,配置数据库连接信息

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

3.在创建出来的springboot工程中,在引导类所在包下,在创建一个包 mapper。在mapper包下创建
一个接口 UserMapper

import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
//查询所有用户数据
@Select("select id, name, age, gender, phone from user")
public List<User> list();
}

4.单元测试

@SpringBootTest
public class MybatisQuickstartApplicationTests {
 
@Autowired
private UserMapper userMapper;
 
@Test
public void testList(){
List<User> userList = userMapper.list();
for (User user : userList) {
System.out.println(user);
 }
 }
}

lombok使用

1在pom.xml文件中引入依赖

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

2.在实体类上添加注解

import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}

在这里插入图片描述

MybatisCrud

删除操作
接口方法:

@Mapper
public interface EmpMapper {
        @Delete("delete from emp where id=#{id}")
        public void  delect( Integer id);
}

测试方法:

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入
private EmpMapper empMapper;
@Test
public void testDel(){
//调用删除方法
empMapper.delete(16);
 }

日志输入:

1. 打开application.properties文件
2. 输入mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

新增操作:
接口实现:

 @Insert("insert into emp (username,name, gender, image, " +
                "job, entrydate, dept_id, create_time, update_time)" +
                "values (#{username},#{name},#{gender}," +
                "#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime});")
        public void insertEmp(Emp emp);

测试代码:

     @Test
    public void InEmp(){
        Emp emp = new Emp();
        emp.setUsername("tom");
        emp.setName("汤姆");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);
        empMapper.insertEmp(emp);
    }

主键返回操作:

@Options(useGeneratedKeys = true,keyProperty = "id")
在insert的接口中插入注解
其中keyProperty="实体类属性名",useGeneratedKeys为true

根据主键id更新数据库

接口的实现:
@Update("update emp set username=#{username},password=#{password},name=#{name},gender=#{gender}," +
                "image=#{image},job=#{job},entrydate=#{entrydate},update_time=#{updateTime} where id=22;")
        public void updata(Emp emp);
测试类的实现:
@Test
    public void updateEmp(){
        Emp emp = new Emp();
        emp.setUsername("jierui");
        emp.setName("杰瑞");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);
        empMapper.updata(emp);
    }

根据主键查询数据库的信息

接口实现:
@Select("select * from emp where id=#{id};")
        public Emp selet(Integer id);
测试类实现:
 @Test
    public void selEmp(){
        System.out.println(empMapper.selet(22));
    }

数据封装

实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
解决方案:
# 在application.properties中添加:
mybatis.configuration.map-underscore-to-camel-case=true

条件查询

接口实现:
@Select("select * from emp where name like concat('%',#{name},'%')  and gender= #{gender} and entrydate between #{start}" +
                " and #{end} order by entrydate  desc ;")
        public List<Emp> seletPan(String name, Short gender, LocalDate start , LocalDate end);     
测试方法:
 @Test
    public void selectTest(){
        List<Emp> emp= empMapper.seletPan("张",(short)1,LocalDate.of(2000,1,1),
                LocalDate.of(2010,1,1));
        emp.forEach(new Consumer<Emp>() {
            @Override
            public void accept(Emp emp) {
                System.out.println(emp);
            }
        });
    }
注意:使用MySQL提供的字符串拼接函数:concat('%' , '关键字' , '%')防止sql注入的风险

使用XML文件配置sql语句

1.创建XML映射文件:需要与接口同包同名放在resources目录下
2.编写XML映射文件:mybatis中文网下载
3.配置:XML映射文件的namespace属性为Mapper接口全限定名;
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

接口实现:
public List<Emp> seletPan(String name, Short gender, LocalDate start , LocalDate end);

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.itheima.mapper.EmpMapper">
    <select id="seletPan" resultType="com.itheima.pojo.Emp">
        select * from emp where name like concat('%',#{name},'%')  and gender= #{gender} and entrydate between #{start}
             and #{end} order by entrydate  desc ;
    </select>
</mapper>

mybatis动态SQL

if动态sql

XML里面的where语句改写:
 <where>
            <if test="name != null">
                name like concat('%', #{name}, '%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="start != null and end != null">
                and entrydate between #{start} and #{end}
            </if>
</where>

set动态标签用于update操作
动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)

<if>
用于判断条件是否成立,如果条件为true,则拼接SQL
形式:<if test="name != null"></if>
<where>
where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的
AND或OR
<set>
动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

动态SQL-foreach实现循环控制

标签实现:实现根据员工id删除员工信息:

<delete id="delectEmp">
        delete from emp where id in
        <foreach collection="list" item="id" separator=","
                 open="(" close=")">
            #{id}
        </foreach>
</delete>

参数含义:

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每
一次遍历使用的分隔符"
open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

动态SQL代码复用:

<sql> :定义可重用的SQL片段
<include> :通过属性refid,指定包含的SQL片段
	   <sql id="reuse" >
        delete from emp where id in
       </sql>

inchude实现复用

        <include refid="reuse">
        </include>
        <foreach collection="list" item="id" separator=","
                 open="(" close=")">
            #{id}
        </foreach>
    </delete>

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

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

相关文章

C++ 信息学奥赛 2046:【例5.15】替换字母

#include<cstdio> #include<iostream> using namespace std; int main() { char st[200];char A,B; int n0;while((st[n]getchar())!\n); //将原文存放在字符数组st中,并且要注意上述的最后分号 Agetchar();getchar();Bgetchar(); //读取A和B&#xff0c;中间get…

10 行代码即可检测脸部情绪

引言 面部表情展示人类内心的情感。它们帮助我们识别一个人是愤怒、悲伤、快乐还是正常。医学研究人员也使用面部情绪来检测和了解一个人的心理健康。 人工智能在识别一个人的情绪方面可以发挥很大的作用。在卷积神经网络的帮助下&#xff0c;我们可以根据一个人的图像或实时视…

mipi DPHY学习记录

DPHY的内容很多,而且细节很多,我会一点一点的进行补充记录,今天要记录的是cdphy的LP-MODE数据传输的过程。 1:HS 和LP mode lane status 和 lane上的电压 HS mode时,差分线上的电压摆幅为200mv,LP mode时,差分线上的电压为1.2v 2:HS mode data Transmission start 在…

SHAP(一):使用 XGBoost 预测英雄联盟获胜

SHAP&#xff08;一&#xff09;&#xff1a;使用 XGBoost 预测英雄联盟获胜 本笔记本使用 Kaggle 数据集 英雄联盟排名比赛&#xff0c;其中包含从 2014 年开始的 180,000 场英雄联盟排名比赛。 根据这些数据&#xff0c;我们构建了一个 XGBoost 模型&#xff0c;根据有关该球…

48基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

基于matlab的经验傅里叶分解&#xff0c;适用于非线性及非平稳时间序列分析&#xff0c;将信号进行精确分解。程序已调通&#xff0c;可直接运行。

3D高斯泼溅(Splatting)简明教程

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅&#xff08;Splatting&#xff09;是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样…

优先级队列:PriorityQueue常用接口+构造+方法+源码分析+OJ练习

文章目录 PriorityQueue常用接口一.PriorityQueue 的特性二.PriorityQueue常用接口介绍1.优先级队列的构造2.插入/删除/获取优先级最高的元素3.PriorityQueue的扩容方式&#xff1a; PriorityQueue常用接口 一.PriorityQueue 的特性 1.Java集合框架中提供了 **PriorityQueue *…

ActiveMq学习⑦__ActiveMq协议

问题一、默认的61616端口如何更改&#xff1f; 问题二、你生产上的链接协议如何配置的&#xff1f;使用tcp吗&#xff1f; ActiveMQ 支持的client-broker 通讯协议有&#xff1a;TVP、NIO、UDP、SSL、Http(s)、VM。 其中配置TransportConnector 的文件在ActiveMQ 安装目录的co…

产品经理墨刀学习----注册页面

我们做的产品是一个校园论坛学习开发系统&#xff0c;目前才开始学习。 &#xff08;一&#xff09;流程图 &#xff08;二&#xff09;简单墨刀设计--注册页面 &#xff08;1&#xff09;有账号 &#xff08;a&#xff09;直接登录&#xff1a; &#xff08;b&#xff09;忘…

Git使用规范指南

文章目录 Git使用规范指南前言分支命名规范分支合并流程规范提交信息规范Angular提交规范注意事项 通用Git忽略文件配置 Git使用规范指南 前言 由于最近写完代码之后&#xff0c;Git使用不规范被领导说了&#xff0c;所以最近通过阅读大量的相关博客快速学习Git使用规范&#…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

Qt全局定义

一、QtGlobal头文件 头文件中包含了Qt类库的一些全局定义&#xff0c;包括&#xff1a; 基本数据类型全局函数宏定义 二、基本数据类型 三、全局函数 四、宏定义 1.Qt版本相关的宏 1.1 QT_VERSION 这个宏展开为数值形式 0xMMNNPP (MM major, NN minor, PP patch) 表示…

P9831 [ICPC2020 Shanghai R] Gitignore

P9831 [ICPC2020 Shanghai R] Gitignore - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 只看题意翻译这道题是做不出来的&#xff0c;还要去看英文里面的规定&#xff08;这里就不放英文了&#xff09;&#xff0c;主要问题是不要公用子文件夹。 例如: 1 / a / 2 2 / a / 3…

【C语言】函数的系统化精讲(一)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心的勇气和无限的潜能&#xff0c;只要你有决心&#xff0c;就没有什么事情是不可能的…

线程条件控制实现线程的同步

前面讲了互斥锁&#xff0c;但是总感觉有些功能互斥锁有些不够用。 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时&#xff0c;允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条…

Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这几篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;什么是SpringMVC&#xff1f;简单好理解&#xff01;什么是应用分层&#xff1f;SpringMVC与应用分层的关系&#xff1f; 什么是三层架构&…

Danswer 接入 Llama 2 模型 | 免费在 Google Colab 上托管 Llama 2 API

一、前言 前面在介绍本地部署免费开源的知识库方案时&#xff0c;已经简单介绍过 Danswer《Danswer 快速指南&#xff1a;不到15分钟打造您的企业级开源知识问答系统》&#xff0c;它支持即插即用不同的 LLM 模型&#xff0c;可以很方便的将本地知识文档通过不同的连接器接入到…

Linux中的高级IO

文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码&#xff08;会在代码中进行讲解&#xff09;2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…

【51单片机】蜂鸣器(学习笔记)

一、蜂鸣器 1、蜂鸣器介绍 鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定无源蜂鸣器&#xff1a;内部不带振荡源&…