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 {
     @Autowired
    private UserMapper userMapper;
    @Test
    public 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

 @Test
    public 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 {
     @Autowired
    private UserMapper userMapper;
    @Test
    public 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 mapper
  PUBLIC "-//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 {
     @Autowired
    private UserMapper userMapper;
    @Test
    public void testUser(){
        List<Integer> ids= Arrays.asList(1,2,3);
        userMapper.deleteId(ids);
    }
}

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

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

  成功!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器“地域”,这么选择就对了!

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

预防近视的台灯有哪些?多款专家说好的护眼台灯推荐

现在的儿童青少年近视率真的非常高&#xff01;据统计&#xff0c;我国儿童青少年的总体近视率为52.7%&#xff0c;其中6岁儿童为14.3%&#xff0c;小学生为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生为80.5%。而造成如此高近视率的原因主要还是长时间过度用眼导致的疲…

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…

AI - 集成学习

目录 集成学习概念 集成学习器性能评估 随机森林 AdaBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的阅读&#x1f606;&#x1f606;&#x1f606; 集成学习概念 &#x1f48e;集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

雷龙发展Nand flash芯片试用体验

一、项目背景 最近自己开始准备了一个智能家居控制系统项目,需要包含室内的温湿度、空气质量、烟雾浓度以及气体含量,能够存储相应的数据,并进行显示。 Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

一招让你的Mac重获新生!CleanMyMac专业软件助你清理系统垃圾,保障安全!

一、Mac用户必备神器——CleanMyMac 随着Mac的使用时间越来越长&#xff0c;系统中的垃圾文件也会越来越多&#xff0c;不仅占用宝贵的硬盘空间&#xff0c;还会影响系统的运行速度。这时候&#xff0c;一款专业的清理软件就显得尤为重要。CleanMyMac作为荣获多项大奖的清理软件…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

【Linux】回顾 C 文件接口

文章目录 1. 写文件2. 读文件3. 输出信息到显示器的几个方法4. stdin / stdout / stderr5. 打开文件的方式 1. 写文件 int main() {FILE* fp fopen("myfile", "w");if (!fp){printf("fopen error!\n");}const char* msg "hello world!\n…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

初次文件包含漏洞

1.文件包含漏洞介绍 1.1.文件包含漏洞解释   文件包含漏洞就是使用函数去包含任意文件的时候&#xff0c;当包含的文件来源过滤不严谨的时候&#xff0c;当存在包含恶意文件后&#xff0c;就可以通过这个恶意的文件来达到相应的目的。 1.2.文件包含漏洞原理    其实原理就…

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…

【Python】进阶学习:一文解决如何从指定的源目录中,挑选出符合条件的文件,并将这些文件复制到目标目录中

【Python】进阶学习&#xff1a;一文解决如何从指定的源目录中&#xff0c;挑选出符合条件的文件&#xff0c;并将这些文件复制到目标目录中 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化…

spotify怎么购买会员?

Spotify&#xff0c;是一家瑞典在线音乐流媒体平台&#xff0c;主要服务除音乐外&#xff0c;包含播客、有声书及影片流服务。 Spotify于2006年4月&#xff0c;由Daniel Ek和Martin Lorentzon在瑞典创立&#xff0c;以数字版权管理保护的音乐为主要业务&#xff0c;用户规模截至…

出彩不停息!创维汽车SKYHOME又获国际大奖

祝贺&#xff01;创维汽车SKYHOME又获国际缪斯设计大奖&#xff01;进一步获得国际认可&#xff01; 卓越的意识、优秀的审美、无与伦比的专注&#xff0c;不仅是缪斯奖所看重的独特品质&#xff0c;也是SKYHOME设计团队在传递品牌故事中所秉持的优秀品格。作为缪斯奖青睐的设计…

ISP技术综述

原文来自技术前沿&#xff1a;ISP芯片终极进化——VP芯片&#xff08;AI视觉处理器&#xff09; 目录 1.计算机视觉的定义 2.与计算机视觉密切相关的概念与计算机视觉密切相关的概念有机器视觉&#xff0c;图像处理与分析&#xff0c;图像和视频理解。 3.计算机视觉的应用 …