mysql
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061)
mysqld --initialize-insecure
mysqld -install
net start mysql
net start mysql //启动mysql服务
net stop mysql //停止mysql服务
mysqladmin -u root passwond 1234
,这里的 1234就是指默认管理员(即root账户)的密码,可以自行修改成你喜欢的。mysqladmin -u root password 1234
mysql -uroot -p1234
net stop mysql
mysqld -remove mysql
mysql -u用户名―p密码[ -h数据库服务器IP地址-P端口号]
show databases;
select database();
create database [if not exists]
数据库名;drop database [if exists]
数据库名;
- 上述语法中的database,也可以替换成schema。如: create schema db01;
图形化工具
DataGrip
create table 表名(
字段1字段类型[约束][comment字段1注释],
......
字段n字段类型「约束][comment字段n注释]
) [comment表注释];
create table tb_user(
id int comment 'ID,唯一标识',
username varchar (20)comment '用户名',
name varchar ( 10)comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
)comment '用户表';
- 年龄:age tinyint unsigned
- 分数:score double(4,1)
- char(10):最多只能存10个字符,不足10个字符,占用10字符空间;性能高,浪费空间
- varchar(10):最多只能存10个字符,不足10个字符,按照实际长度存储;性能低,节省空间
- 手机号:phone char(11)
- 用户名:username varchar(20)
- 生日:birthday date
- 操作时间:update_time datetime
- create_time:记录的是当前这条数据插入的时间
- update_time:记录当前这条数据最后更新的时间
指定字段添加数据:insert into 表名 (字段名1,字段名2) values (值1,值2);
全部字段添加数据:insert into 表名 values (值1,值2,…);
批量添加数据(指定字段):insert into 表名 (字段名1,字段名2) values (值1,值2),(值1,值2);
批量添加数据(全部字段):insert into 表名 values(值1,值2,…),(值1,值2,…);
- 插入数据时,指定的字段顺序需要与值的顺序是——对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
删除数据:delete from 表名 [where条件];
DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
*号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
count(字段):不记录NULL值
建议使用:count(*)
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序:where >聚合函数>having 。
- 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
- 起始索引从O开始,起始索引=(查询页码–7)*每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
if(表达式, tvalue, fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvalue
case expr when value1 then result1 [when value2 then value2 …] [else result] end
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
--创建表时指定
create table 表名(
字段名 数据类型,
…
[constraint][外键名称] foreign key(外键字段名) references 主表(字段名)
);
--建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
形式:select * from t1 where column1 = ( select column1 from t2…);
子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select,。
分类
优点:
缺点:
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构组织的索引。
主键字段,在建表时,会自动创建主键索引。
添加唯一约束时,数据库实际上会添加唯一索引。
create table user
(
id int unsigned not null auto_increment primary key,
name varchar(100),
age tinyint unsigned,
gender tinyint unsigned,
phone varchar(11)
);
package com.example.springboot_mybatis_quickstart.pojo;
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
public User() {
}
public User(Integer id, String name, Short age, Short gender, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public Short getGender() {
return gender;
}
public void setGender(Short gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", phone='" + phone + '\'' +
'}';
}
}
#配置数据库的连按信息-四要素
# 驱动类名称
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=123456
package com.example.springboot_mybatis_quickstart.mapper;
import com.example.springboot_mybatis_quickstart.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper //在运行时,会自动生成该接口的实现类对象(代理对象),并且将对象就交给IOC容器管理
public interface UserMapper {
//查询全部用户信息
@Select("select * from user")
public List<User> list();
}
package com.example.springboot_mybatis_quickstart;
import com.example.springboot_mybatis_quickstart.mapper.UserMapper;
import com.example.springboot_mybatis_quickstart.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest //springboot整合单元测试注解
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testListUser(){
List<User> userList = userMapper.list();
userList.stream().forEach(user -> {
System.out.println(user);
});
}
}
如果表名红色
产生原因:ldea和数据库没有建立连接,不识别表信息
解决方式:在ldea中配置MySQL数据库连接
JDBC: (Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。
驱动例如:
优势:
标准接口:DataSource
connection getConnection() throws SQLException;
常见产品:
Druid(德鲁伊)
切换Druid数据库连接池
<dependency>
<groupld>com.alibabagroupld>
<artifactld>druid-spring-boot-starterartifactld>
<version>1.2.8version>
dependency>
spring.datasource.druid.url= #或 spring.datasource.url=
spring.datasource.druid.username= #或 spring.datasource.username=
spring.datasource.druid.password= #或 spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
delete from emp where id = 17;
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
#指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
性能更高
更安全(防止SQL注入)
参数占位符:
insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
values ('songyuanqiao';'宋远桥',1, '1.jpg',2,2012-10-09',2,2022-10-0110:00:00,2022-10-0110:00:00');
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create time,update _time) "+
"values(#(username),#(name}), #(gender), #(image), #job), #entrydate},#(deptld ), #(createTime), #(updateTime})")
public void insert(Emp emp);
@Options(keyProperty = "id", useGeneratedKeys = true) //会自动将生成的主键值,赋值给emp对象的id属性
@Insert("insert into emp(username, name, gender, image , job, entrydate, dept_id, create_time, update_time) " +
"values(#(username), #(name}), #(gender}, #(image}, #[job), #(entrydate}),#(deptld), #(createTime}),#(updateTime)")
public void insert(Emp emp);
update emp set username = 'songdaxia' , name = '宋大侠', gender = 1 , image = '7.jpg' , job =2, entrydate = '2012-01-01', dept_id =2, update_time = '2022-10-0112:12:12' where id = 19;
@Update("update emp set username=#{username}, name=#{name}, gender=#{gender}, image=#{image}, job=#{job},entrydate=#{entrydate}, dept_id=#{deptld} , update_time=#{updateTime} where id=#{id}")
public void update(Emp emp);
select * from emp where id = 19;
@select("select * from emp where id = #{id}")
public Emp getByld(Integer id);
select * from emp where name like '%张%' and gender=1 and entrydate between '2010-01-01' and '2020-01-01 ' order by update_time desc;
@Select("select * from emp where name like '%$:{name}%' and gender = #{gender} and entrydate between #{begin} and #{end} order byupdate_time desc")
public List<Emp> list(String name, Short gender , LocalDate begin , LocaiDate end);
在springBoot的2.x版本:
在springBoot的1.x版本/单独使用mybatis:
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
XML映射文件的namespace属性为Mapper接口全限定名一致。
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。
delete from emp where id in (1,2,3);
//批量删除
public void deleteBylds(List<Integer> ids);
<delete id="deleteBylds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
foreach>
delete>
属性
Java:
XML:
Test: