Mysql与MyBatis

1  Sql语句 增删改查

1.1 建表

-- cmd展示数据库
show databases ;
-- cmd登录数据库
mysql localhost -u root -p-- auto_increment 自动增长,每添加一个表项id自动增1
-- char定长字符串 0-255,不足十个字符按十个字符算, varchar变长字符串:有几个字符给几个的空间
-- varchar(20)最多20个字符的空间,char(11)直接给11个字符空间
create table tbuser(id int primary key  auto_increment comment 'ID 唯一标识',username varchar(20) not null unique comment '用户名',name varchar(10) not null comment '姓名',age int comment '年龄',gender char(1) default '男' comment '性别'
)comment '用户表';

 

 图形化界面创建:

price decimal(8.2)//最多8位,2位小数
image varchar(300) 图像存储的是路径
# 查看指定表结构
desc tbuser;

 

# 查看建表语句
show create table tbuser;

1.2 修改删除

alter table tbuser add height varchar(11) comment '身高';
alter table tbuser modify height varchar(13) comment '身高';
# 修改height名字为height1
alter table tbuser change height  height1 varchar(13) comment '身高';
alter table tbuser drop column height1;
rename table tbuser to tb_user;
# 删除表
drop table if exists tbuser;
insert into tb_user (id,username,name) values (2,"haha","haha"),(3,"haha2","haha2");
# 全部字段添加数据
insert into tb_user values xxx
update  tb_user set username="bus" where id=1;
delete from tb_user where id=1;
#删除表中所有数据
delete from tb_user;

1.3 查询

1.3.1 基本查询 

# distinct表示不要重复
select distinct job from tb_emp;
# 查询并起别名
select name as 姓名 from tb_emp;

 1.3.2 条件查询

select * from tb_emp where id=5;
select * from tb_emp where id is null;
# 查询id不等于5的信息
select * from tb_emp where id !=5;
# 与上一个同义
select * from tb_emp where id <>5;
select * from tb_emp where id >5 and id<10;
select * from tb_emp where id between  5 and 10;
# id在5-10范围而且要gender=2
select * from tb_emp where id between  5 and 10 and gender=2;
select * from tb_emp where id =5 or id=6;
# 与上一个同义
select * from tb_emp where id in (5,6);
# _表示一个字符
select * from tb_emp where name like '__';
# %表示任意字符
select * from tb_emp where name like '张%';

1.3.3 聚合函数 

# 统计,不对null值运算
select count(id) from tb_emp;
select count(*) from tb_emp;select min(entrydate) from tb_emp;
select max(entrydate) from tb_emp;
select avg(entrydate) from tb_emp;
select sum(entrydate) from tb_emp;

1.3.4 分组查询

# 根据性别分组,统计各自数量
select gender,count(*) from tb_emp group by gender;
# 查询entrydate<='2015-1-1',并职位分组,获取员工数量>=2的职位
# where是分组之前过滤,之后不能使用聚合函数,having是分组之后的过滤
select job,count(*) from tb_emp where entrydate<='2015-1-1' group by job having count(*)>=2;

1.3.5 排序查询

# 排序,asc升序默认,desc默认,此句asc在前
select * from tb_emp order by entrydate asc,id desc ;

1.3.6 分页查询

起始索引0可以省略

2 多表设计

外键约束

关系:一对一、一对多、多对多;多对多关系,需要一张中间表;一对多在多的一方添加一个外键

外键约束分为:物理外键(容易死锁)、逻辑外键(service层)

要把外键表相关信息删除之后,才能删除关联信息


create table class(id int primary key auto_increment);
//class_id是外键字段名create table student(id int primary key auto_increment,class_id int,constraint  foreign key(class_id) references class(id));
create table teacher(id int primary key);
create table student (id int primary key); create table teacher_student(teacher_id int,student_id int,constraint foreign key(teacher_id) references teacher(id),constraint foreign key(student_id) references student(id));

3 多表查询

笛卡尔积:两个集合所有的组合情况; 需要设置条件消除无效笛卡尔积,比如where x.id=y.id

3.1 内连接

集合A,B交集的数据

-- 查询员工的姓名,部门(内连接实现)
select tb_emp.name ,tb_dept.name from tb_dept,tb_emp where tb_emp.dept_id=tb_dept.id;
-- 起别名
select e1.name ,b.name from tb_dept e1 ,tb_emp b  where b.dept_id=e1.id;
# 显式内连接
select tb_emp.name ,tb_dept.name from  tb_emp inner join tb_dept  on tb_emp.dept_id=tb_dept.id;

3.2 外连接

查询集合A或B的所有

# 左外连接
select tb_emp.name ,tb_dept.name from  tb_emp left join tb_dept  on tb_emp.dept_id=tb_dept.id;
# 右外连接
select tb_emp.name ,tb_dept.name from  tb_emp right join tb_dept  on tb_emp.dept_id=tb_dept.id;

 3.3 子查询

嵌套select语句

1.标量子查询

返回单个值

select * from tb_emp where dept_id=(select id from tb_dept where name='张三丰');

 2.列子查询

返回一列

# 查询教研部与咨询部所有员工信息
select * from tb_emp where dept_id in (select id from tb_dept where name='教研部' or name='咨询部')

3.行子查询 

返回一行

# 查询与金庸的出生日期以及职位都相同的信息
select * from tb_emp where (entrydate,job) =(select entrydate,job from tb_emp where name='金庸')

4.列子查询

返回多行多列

# 查询入职日期为2000-01-01的员工信息以及部门名称
select * from (select * from tb_emp where entrydate>'2000-01-01') e ,tb_dept d where e.dept_id=d.id

4 事务

# 事务:一组操作的集合,要么同时成功,要么同时失败
# 开启事务
start transaction ;
# 删除部门
delete from tb_dept where id=3;
#删除员工
delete from tb_emp where dept_id=3;
# 提交事务,如果上面两行都成功使用
commit ;
# 回滚事务,只有上面两行有一个失败就使用,相对于撤销原操作
rollback ;

5 索引

默认底层结构:B+树

IBD文件:存放数据库的数据与索引

create index inname on tb_emp(name);
show index from tb_emp;
# 删除索引
drop index inname on tb_emp;

6 MyBatis

6.1 配置

MyBatis是dao层(持久层)框架

数据库连接池:容器,管理数据库连接

接口:DataSource

产品:Druid、Hikari

<!--        druyid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency>

lombok :注解提供相应方法

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
//@Getter
//@Setter
//@ToString
//@EqualsAndHashCode
@Data//相当于以上四个
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
public class user {}
#配置mybatis日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

6.2 删除

UserMapper接口

@Mapper
public interface UserMapper {
//    #{id}表示占位符
//如果有返回值,成功返回值为1@Delete("delete from emp where id=#{id}")public void list(Integer id);
}
MybatisApplicationTests测试启动类
@SpringBootTest
class MybatisApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testUser(){userMapper.list(10);}
}

成功!

 '#'表示预编译Sql:性能更高、更安全

性能更高:将编译后的结果缓存起来 

 安全原因:防止SQL注入

SQL注入是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句

   //$是拼接,后台直接是delete from emp where id=id@Delete("delete from emp where id=${id}")public void list(Integer id);

6.3 插入

UserMapper接口

@Mapper
public interface UserMapper {//获取返回的主键@Options(keyProperty = "id",useGeneratedKeys = true)
//更新是@Update@Insert("insert into dept (id, name,create_name,update_name) values (#{id},#{name},#{create_name},#{update_name})")public void insert(user u);
}

 MybatisApplicationTests

 @Testpublic void testUser(){user u=new user();u.setAge((short) 18);u.setGender((short) 1);u.setName("123");u.setPhone(String.valueOf(12321));u.setId(12);userMapper.insert(u);System.out.println(u.getId());}
}

6.3 查询

 UserMapper接口

    @Select("select * from dept where id=#{id}")public user select(Integer id);

  MybatisApplicationTests

@SpringBootTest
class MybatisApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testUser(){user u=userMapper.select(2);System.out.println(u);}
}

 null原因:数据封装

实体类属性名与数据库查询返回的字段一致,mybatis会自动封装,不一致则不会

解决方法一:起别名

    @Select("select id, name, create_time createName, update_time updateName from dept where id=#{id}")public user select(Integer id);

解决方法二:@Results

    @Results({@Result(column="create_time",property="createName"),@Result(column="update_time",property="updateName"),})@Select("select * from dept where id=#{id}")public user select(Integer id);
}

解决方法三:

application.properties

#开启mybatis驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

6.4 XML

同包同名:XML映射文件名与Mapper接口名称一致

 xml的sql语句的id要与mapper接口方法名、返回类型一致

//namespace是接口copy->copy reference
<mapper namespace="com.tencent.mybatis.mapper.UserMapper"></mapper>

xml要导入的文件: 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 UserMapper接口

动态SQL-if

<mapper namespace="com.tencent.mybatis.mapper.UserMapper"><select id="select" resultType="com.tencent.mybatis.polo.user">select  * from dept
--         如果if不成立,where不会创建,还会自动除去条件前面的and或者or
--          如果where改为set,那么set会自动除去条件后面的‘,’<where><if test="name!=null">name like concat('%',#{name},'%');</if><if test="id!=null">
--             没有<where>标签,name不成立id成立会报错and id =#{id}</if></where></select>
</mapper>

删除

 UserMapper接口

@Mapper
public interface UserMapper {public void deleteId(List<Integer> ids);
}
接口的ids要与MybatisApplicationTests的ids对应,不然报错
<mapper namespace="com.tencent.mybatis.mapper.UserMapper">
<!--    collection遍历的集合,item是遍历出的元素,separator分隔符--><delete id="deleteId">delete from dept where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
</mapper>
MybatisApplicationTests
@SpringBootTest
class MybatisApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testUser(){List<Integer> ids= Arrays.asList(1,2,3);userMapper.deleteId(ids);}
}

6.5 解决Could not autowire. No beans of ‘UserMapper‘ type found问题

文件夹放入与启动项文件同级 

  成功!

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

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

相关文章

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

Transformer的前世今生 day01(预训练、统计语言模型)

预训练 在相似任务中&#xff0c;由于神经网络模型的浅层是通用的&#xff0c;如下图&#xff1a; 所以当我们的数据集不够大&#xff0c;不能产生性能良好的模型时&#xff0c;可以尝试让模型B在用模型A的浅层基础上&#xff0c;深层的部分自己生成参数&#xff0c;减小数据集…

tp8 mpdf 导出pdf

1. 安装mpdf composer require mpdf/mpdf 2. 然后 使用 use mpdf\Mpdf; 或者 require_once __DIR__ . /vendor/autoload.php; 官方文档 mPDF – mPDF 手册 文档里有很多东西 可以自己去研究 3. 编写代码 下载 (支持中文) $mpdf new Mpdf([mode > utf-8,"autoS…

Netty学习——源码篇2 客户端Bootstrap(二)

接上篇 Bootstrap源码-客户端 1 Handler的添加过程 Netty有一个强大和灵活之处就是基于Pipeline的自定义Handler机制。基于此&#xff0c;可以像添加插件一样自由组合各种各样的Handler来完成业务逻辑。例如&#xff0c;需要处理HTTP数据&#xff0c;那么就可以在Pipeline前添…

基于java+springboot+vue实现的电影院选票系统(文末源码+Lw+ppt)23-467

摘 要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;电影院选票系统当然不能排除在外。电影院选票系统是在实际应用和软件工程的开发原理之上&#xff0c;运用java语言&#xff0c;前台Vue框…

Hive:数据仓库利器

1. 简介 Hive是一个基于Hadoop的开源数据仓库工具&#xff0c;可以用来存储、查询和分析大规模数据。Hive使用SQL-like的HiveQL语言来查询数据&#xff0c;并将其结果存储在Hadoop的文件系统中。 2. 基本概念 介绍 Hive 的核心概念&#xff0c;例如表、分区、桶、HQL 等。 …

k8s部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 配置和模板参考helm仓库&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop 先通过以下命令生成yaml文件&#xff1a; helm template hadoop pfisterer-hadoop/hadoop > hadoop.yaml用kube…

NodeJs利用腾讯云实现手机发送验证码

本文介绍如何在nodejs实现短信发送&#xff0c;以腾讯云的短信验证为例。 腾讯云中准备工作 首先需要腾讯云的个人或者企业认证的账号&#xff0c;个人会赠送一百条&#xff0c;企业赠送一千条&#xff0c;可以用于测试&#xff0c;地址&#xff1a;腾讯云短信服务。然后需要…

电机学(笔记一)

磁极对数p&#xff1a; 直流电机的磁极对数是指电机定子的磁极对数&#xff0c;也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说&#xff0c;极对数越多&#xff0c;电机转速越低&#xff0c;扭矩越大&#xff0c;适用于低速、高扭矩的场合&#xff1b;相反&…

免 费 搭 建 多模式商城:b2b2c、o2o、直播带货一网打尽

鸿鹄云商 b2b2c产品概述 【b2b2c平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级b2b2c电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

IonQ最新研究突破!引入光量子纠缠以构建量子计算网络

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;700字丨5分钟阅读 2024年2月22日&#xff0c;美国量子计算公司IonQ宣布&#xff0c;公司研究团队已实现可重复地生成与离子纠缠的光子&#…

Python之Web开发中级教程----Django站点管理

Python之Web开发中级教程----Django站点管理 网站的开发分为两部分&#xff1a;内容发布和公共访问 内容发布是由网站的管理员负责查看、添加、修改、删除数据 Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地…

图论题目集一(代码 注解)

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目一&#xff1a; #include<iostream> #include<queue> #include<cstring> using namespace st…

rviz上不显示机器人模型(模型只有白色)

文档中的是base_footprint&#xff0c;需要根据自己所设的坐标系更改&#xff0c;我的改为base_link 如何查看自己设的坐标系&#xff1a; 这些parent父坐标系就是 同时打开rviz后需要更改成base_link

Java后端八股----JVM篇

上图中线程1&#xff0c;2如果资源被抢占了&#xff0c;则程序计数器记录一下执行的行号&#xff0c;等到资源就绪后会从记录的行号继续向后执行。 Java8把静态变量以及常量放到了线程的本地内存原空间中(避免放在堆中不可控)。 &#x1f446;图中第二种情况不太容易出现…

gPTP简介

1、gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议 gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议&#xff0c;即IEEE 802.1AS协议。它是IEEE 1588协议的延伸&#xff0c;可以为TSN提供全局精准…

使用RabbitMQ,关键点总结

文章目录 1.MQ的基本概念2.常见的MQ产品3.MQ 的优势和劣势3.1 优势3.2 劣势 4.RabbitMQ简介4.1RabbitMQ 中的相关概念 1.MQ的基本概念 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。…

RabbitMQ 安装保姆级教程

目录 1.MQ引言 1.1 什么是MQ 1.2 MQ有哪些 1.3 不同MQ特点 2.RabbitMQ 的引言 2.1 RabbitMQ 2.2 RabbitMQ 的安装 2.2.1 下载 2.2.2 下载的安装包 2.2.3 安装步骤 3. RabiitMQ 配置 3.1RabbitMQ 管理命令行 3.2 web管理界面介绍 3.2.1 overview概览 3.2.2 Admin用…

Linux的背景介绍

1.Linux的发展史 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08…

C到C++的敲门砖-2

文章目录 引用内联函数auto关键字基于范围的for循环指针空值nullptr后记 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 所谓引用就是给变量起别名&am…