Mysql与MyBatis

news2024/11/13 12:50:29

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问题

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

  成功!

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

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

相关文章

[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

【深度学习】手动实现全连接神经网络(FCNN)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 神经网络的本质就是通过参数、线性函数与激活函数来拟合特征与目标之间的真实函数关系。 01 神经网络简介 1.1 引入 神经网络是一门重要的机器学习技术&…

hosts文件丢失了怎么办?

hosts文件的位置&#xff1a;C:\Windows\System32\drivers\etc 丢失了恢复的方法&#xff1a; 在“管理员&#xff1a;命令提示符中输入&#xff1a; &#xff08;winR 然后cmd&#xff09; for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\d…

SAP前台处理:物料主数据创建<MM01>之采购视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

SpringMVC | SpringMVC中的“JSON数据交互“ 和“RESTful支持“

目录: 1.JSON 数据交互1.1 JSON概述1.2 JSON的“数据结构”对象结构数组结构 1.3 JSON的“数据转换” (JSON交互) 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教…

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二&#xff1a;Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#xff0c;也意味着它…

工业AMR机器人如何实现规模化的柔性生产

在当下高度复杂的工业生产环境中&#xff0c;机器人如何实现规模化的柔性生产&#xff0c;已成为业界关注的焦点。特别是在追求高效率、高质量的生产过程中&#xff0c;团队协作的重要性愈发凸显。富唯智能一体化AMR控制系统&#xff0c;作为机器人的核心指挥部&#xff0c;犹如…

VMware安装Centos 6.5系统

文章目录 镜像下载地址1.在vmware中新建虚拟机2.选择标准典型步骤进行安装3.选择以后再放入光盘4.选择准备安装的系统类型5.为虚拟机指定名称并指定位置6.磁盘空间20G默认下一步&#xff1b;7.将无用的硬件删除掉8.点击打开虚拟机&#xff1b;9.选择第一个回车进行全新安装&…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

Django templates 存放html目录

模板 一概述 模板由两部分组成&#xff0c;一部分是HTML代码&#xff0c;一部分是逻辑控制代码&#xff08;变量&#xff0c;标签&#xff0c;过滤器&#xff09; 作用&#xff1a;可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码&#xff0c;并且实现简单的…

二叉树遍历(牛客网)

描述 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树…

后端工程师快速使用vue和Element

文章目录 Vue1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 Element快速使用1 Element介绍2 快速入门3 当前页面中嵌套另一个页面案例代码案例截图 Vue 1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了…

Linux 文件系统:重定向、缓冲区

目录 一、重定向 1、输出重定向 2、输入重定向 3、追加重定向 4、dup2 系统调用 二、理性理解Linux系统下“一切皆文件” 了解硬件接口 三、缓冲区 1、为什么要有缓冲区? 2、刷新策略 3、缓冲模式改变导致发生写时拷贝 未创建子进程时 创建子进程时 使用fflush…

使用树莓派 结合Python Adafruit驱动OLED屏幕 显示实时视频

关于OLED屏幕的驱动&#xff0c;在之前我已经写过很多篇博文&#xff1a; IIC 协议 和 OLED_oled iic-CSDN博客 香橙派配合IIC驱动OLED & 使用SourceInsight解读源码_香橙派5 驱动屏幕-CSDN博客 这两篇博文都是通过模拟或调用IIC协议来使用C语言驱动OLED屏幕&#xff0c;现…

Sentinel加密锁的工作原理

Sentinel加密锁是一种先进的安全机制&#xff0c;它旨在提供强大的数据加密和访问控制功能&#xff0c;确保数据在传输和存储过程中的机密性、完整性和可用性。下面将详细介绍Sentinel加密锁的工作原理、优势以及在现实中的应用。 一、Sentinel加密锁的工作原理 Sentinel加密锁…

2024年腾讯云GPU服务器价格表_1小时费用_一个月价格和一年优惠

腾讯云GPU服务器怎么收费&#xff1f;GPU服务器1小时多少钱&#xff1f;一个月收费价格表和一年费用标准&#xff0c;腾讯云百科txybk.com分享腾讯云GPU服务器GPU计算型GN10Xp、GPU服务器GN7、GPU渲染型 GN7vw等GPU实例费用价格&#xff0c;以及NVIDIA Tesla T4 GPU卡和V100详细…