数据库
一、SQL语句
1、SQL
(1)SQL语句可以单行或多行书写,以分号结尾。
(2)MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写。
(3)注释
- 单行注释:-- 注释内容(--后必须有空格)或#注释内容(MYSQL 特有)
- 多行注释 /*注释*/
2、SQL分类
- DDL:数据定义语言,用来定义数据库对象:数据库、表、列等
- DML:数据操作语言,用来对数据库中表的数据进行增删改
- DQL:数据查询语言,用来查询数据库中表的记录(数据)
- DCL:数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
3、DDL --操作数据库
(1)查询
SHOW DATABASES;
(2)创建
- 创建数据库
CREATE DATABASE 数据库名称;
- 创建数据库(判断,如果不存在则创建)
CREATE DATABASE IF NOT EXISTS 数据库名称;
(3)删除
- 删除数据库
DROP DATABASE 数据库名称;
- 删除数据库(判断,如果存在则删除)
DROP DATABASE IF EXISTS 数据库名称;
(4)使用数据库
- 查看当前使用的数据库
SELECT DATABASE();
- 使用数据库
USE 数据库名称;
4、DDL --操作表
创建(Create)
查询(Retrieve)
修改(Update)
删除(Delete)
查询表
- 查询当前数据库下所有表的名称
SHOW TABLES;
- 查询表结构
DESC 表名称;
数据类型
MYSQL支持多种数据类型,可以分为三类:
- 数值
- 日期
- 字符串
score double(3+2=5,2)
定长字符串 :name char(10) (存储性能高一点)(浪费空间)
变长字符串 :name varchar(10)(存储性能低一点)(节约空间)
- 如果存储的名字是:“张三”,
- 若它存在char里面,虽然张三是两个字符,但他依然会占10个字符空间的,剩下的八个会用空格补全。
- 若张三两个汉字存在了varchar数据类型里边,它将会占两个字符空间;也就是说varchar在存储数据时会计算原始数据的长度,根据长度来存储数据
- 例如,存储姓名时采用char数据类型,用户名采用varchar数据类型。
练习
答案:
USE test;
CREATE TABLE student(
id INT,#编号
name VARCHAR(10),
gender CHAR(1),
birthday DATE,
score DOUBLE(5,2),
email VARCHAR(64),
phone VARCHAR(15),
status TINYINT
);
desc student;
显示结果:
删除表
(1)删除表
DROP TABLE 表名;
(2)删除表时判断是否存在
DROP TABLE IF EXISTS 表名;
修改表
(1)修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
(2)添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
(3)修改数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
(4)修改列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
(5)删除列
ALTER TABLE 表名 DROP 列名;
5、DML--对数据进行增删改的操作
- 添加(insert)
- 修改(update)
- 删除(delete)
添加数据
(1)给指定列添加数据
INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2,...);
(2)给全部列添加数据
INSERT INTO 表名 VALUES(值1,值2,...);
(3)批量添加数据
INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2,...),(值1,值2...)...;
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...)...;
--查询所有数据
select * from 表名;
例如:INSERT INTO stu (id,name) VALUES(1,'张三');
!!注意:在做开发项目时列名的列表不建议省略
修改数据
修改表数据
UPDATE 表名 SET 列名1=值1,列名2=值2,...[WHERE 条件];
!!注意:修改语句中如果不加条件,则将所有数据都修改
例如: update stu set sex = '女' where name = '张三';--当名字是张三时将性别修改为女
6、DQL--对数据进行查询操作
--起别名的用法
select name, math as 数学成绩,english as 英语成绩 from stu;
!as 不写也可以但必须用空格隔开。
效果展示:
练习:
如:
--模糊查询(like):
通配符:(1)_:代表单个任意字符;
(2)%:代表任意个数字符。(代表前面有几个字或后面有几个字)
例如:
--1、查询姓“马”的学员信息
select * from stu where name like '马%';
--2、查询第二个字是“花”的学员信息
select * from stu where name like '_花%';
--3、查询名字中包含“德”的学院信息(常用)
select * from stu where name like '%德%';
例如:
--1、查询学生信息,按照年龄升序排序
select * from stu order by age asc;
--2、查询学生信息,按照数学成绩降序排序
select * from stu order by math desc;
--3、查询学生信息,按照数学成绩降序排序,如果数学成绩一样,再按照英语成绩升序排序
select * from stu order by math desc,english asc;
例如:
--1、统计班级一共有多少个学生
select count(id)from stu; #count 统计的列名不能为null;取值:1、主键,2、*
--2、查询数学成绩的最高分
select max(math)from stu;
--3、查询数学成绩的最低分
select min(math)from stu;
--4、查询数学成绩的总分
select sum(math)from stu;
--5、查询数学成绩的平均分
select avg(math)from stu;
--1、查询男同学和女同学各自的数学平均分
select sex,avg(math) from stu group by sex;
--2、查询男同学和女同学各自的数学平均分,以及各自人数
select sex,avg(math),count(*) from stu group by sex;
--3、查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70的不参与分组
select sex,avg(math),count(*) from stu where math>70 group by sex;
--4、查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2
select sex,avg(math),count(*) from stu where math>70 group by sex having count(*)>2;
--1、从0开始查询,查询3条数据
select * from stu limit 0 , 3;
--2、每页显示3条数据,查询第1页数据
select * from stu limit 0 , 3;
--3、每页显示3条数据,查询第2页数据
select * from stu limit 3 , 3;
--4、每页显示3条数据,查询第3页数据
select * from stu limit 6 , 3;
二、约束
1、概念&分类
(1)约束的概念:
约束是作用于表中列上的规则,用于限制加入表的数据
约束的存在保证了数据库中数据的正确性、有效性和完整性
(2)约束的分类
TIPS:MYSQL不支持检查约束
约束的名称 | 描述 | 关键字 |
非空约束 | 保证列中所有数据不能有null值 | NOT NULL |
唯一约束 | 保证列中所有数据各不相同 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
检查约束 | 保证列中的值满足唯一条件 | CHECK |
默认约束 | 保证数据时,未指定值则采用默认值 | DEFAULT |
外键约束 | 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 | FOREIGN KEY |
//默认约束指的是不给这个字段添加任何值的时候才能生效
//auto_increment 自增长:当列是数字类型并且是唯一约束的时候才能添加
约束的添加方式:
2、外键设计
可以查看表之间的关系(E-R图):
3、数据库设计
(1)数据库设计简介:
软件的研发步骤:
数据库设计概念:
- 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构 造出最优的数据存储模型。
- 建立数据库的表结构以及表与表之间的关联关系的过程。
- 有哪些表?表里有哪些字段?表和表之间有什么关系?
数据库设计的步骤:
- 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
- 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
- 物理分析(根据数据库自身的特点把逻辑设计转换为物理设计)
- 维护设计(1、对新的需求进行建表;2、表优化)
(2)表关系
- 一对一:
- 如:用户和用户详情
- 一对一关系多用于表的拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
- 一对多(多对一):
- 如:部门和员工
- 一个部门对应多个员工,一个员工对应一个部门
- 多对多:
- 如:商品和订单
- 一个商品对应多个订单,一个订单包含多个商品
(3)表之间关系的实现
- 一对多实现方式:在多的一方建立外键关联一的一方主键
- 多对多实现方式:建立第三张中间表;中间表至少包含2个外键,分别关联双方主键
- 一对一实现方式:在任意一方建立外键,关联对方主键,并设置外键唯一
(4)数据库设计案例
USE test;
#音乐专辑表
CREATE TABLE Music(
title VARCHAR(32),
alias VARCHAR(32),
image VARCHAR(64),
style VARCHAR(8),
type VARCHAR(4),
medium VARCHAR(4),
publish_time date,
publisher VARCHAR(16),
number TINYINT,
barcode BIGINT,
summary VARCHAR(1024),
artist VARCHAR(16),
id INT UNIQUE
);
#曲目表
CREATE table Song(
name VARCHAR(32),
serial_number TINYINT,
id INT
);
#评论表
CREATE TABLE Review(
content VARCHAR(256),
rating TINYINT,
review_time datetime
);
ALTER TABLE Review ADD id INT UNIQUE;
#用户表
CREATE TABLE User(
username VARCHAR(16),
image VARCHAR(64),
signature VARCHAR(64),
nickname VARCHAR(16),
id INT UNIQUE
);
#一个专辑对应多个曲目
ALTER TABLE Song ADD CONSTRAINT fk_Song_Music FOREIGN KEY (id) REFERENCES Music(id);
#一个专辑对应多条短评
ALTER TABLE Review ADD CONSTRAINT fk_Review_Music FOREIGN KEY (id) REFERENCES Music(id);
#一个用户对应多条短评
ALTER TABLE Review ADD CONSTRAINT fk_Review_Music FOREIGN KEY (id) REFERENCES Music(id);
#多个用户对应多个专辑
#建立中间表
CREATE TABLE Order_User_Music(
User_id INT UNIQUE,
Music_id INT UNIQUE
);
ALTER TABLE Order_User_Music ADD CONSTRAINT fk_Order_Music FOREIGN KEY (Music_id) REFERENCES Music(id);
ALTER TABLE Order_User_Music ADD CONSTRAINT fk_Order_User FOREIGN KEY (User_id) REFERENCES User(id);
4、多表查询
select * from emp , dept;
这样写会产生笛卡尔积(有A、B两个集合,取A、B所有的组合情况[这些数据里有很多无效的数据])
连接查询
内连接:相当于查询A、B交集数据
//消除无效数据要求查询emp和dept的数据,emp.dep_id = dept.did
//隐式内连接
select * from emp , dept where emp.dep _id = dept.did
内连接查询语法
--隐式内连接
SELECT 字段列表 FROM 表1,表2...WHERE 条件;
--显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
外连接:
- 左外连接:相当于查询A表所有数据和交集部分数据
- 右外连接:相当于查询B表所有数据和交集部分数据
语法:
--左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件
--右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件
子查询
- 子查询概念:
查询中嵌套查询,称嵌套查询为子查询
嵌套查询案例:
--查询工资高于猪八戒的员工信息
1、--查询猪八戒的工资
SELECT salary from emp where name ='猪八戒';
2、--查询工资高于猪八戒的员工信息
SELECT * from emp where salary>3600;
--合在一起
SELECT * from emp where salary>(SELECT salary from emp where name ='猪八戒');
三、事务
1、事务简介
- 数据库的事务是一种机制、一个操作序列,包含了一组数据库操作命令
- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
- 事务是一个不可分割的工作逻辑单元
2、事务的三个命令
(1)开启事务
START TRANSACTION;
或者 BEGIN;
(2)提交事务
COMMIT;
(3)回滚事务
ROLLBACK;
张三、李四金额变动语句:
--李四金额-500
UPDATE account set money = money -500 where name ='李四';
--张三金额+500
UPDATE account set money = money +500 where name ='张三';
3、事务四大特征(面试题)
- 原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
- 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
- 隔离性(Isolation):多个事务之间,操作的可见性
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
MYSQL事务默认是自动提交的:
--查看事务的默认提交方式
SELECT @@autocommit;
运行显示:
如果是1:默认自动提交
如果是0:默认手动提交
--修改事务提交方式
set @@autocommit = 0;
JDBC
JDBC下载网址:https://dev.mysql.com/downloads/connector/j/
- JDBC就是使用Java语言操作关系型数据库的一套API
一、JDBD简介
JDBC概念:
- JDBD就是使用Java语言操作关系数据库的一套API
- 全称:(Java DataBase Connectivity)Java数据库连接
JDBC本质:
- 官方(Sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
二、JDBC快速入门
三、JDBC API 详解
1、DriverManager
DriverManager(驱动管理类)作用:
1、注册驱动
2、获取数据库连接
注意:useSSL=false中间不能有空格
2、Connection
Connection(数据库连接对象)作用:
1、获取执行SQL的对象
2、管理事务
语法:
1、获取执行SQL的对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
- 执行存储过程的对象
CallableStatement prepareCall(sql)
2、事务管理
- MySQL事务管理
开启事务:BEGIN; / START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit): true为自动提交事务; false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
当出现异常时,使用try-catch语句可以捕获并处理异常(快捷键:Ctril+alt+t)
3、Statement
作用:执行SQL语句
4、ResultSet
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBC {
public static void main(String[] args) throws Exception {
String url="jdbc:mysql:///test?useSSL=false";
String username="root";
String password="root";
Connection con =DriverManager.getConnection(url,username,password);
//定义sql
String sql="select * from account";
//获取statment对象
Statement stmt =con.createStatement();
//执行sql
ResultSet rs =stmt.executeQuery(sql);
//处理结果,遍历rs中的所有数据
//1、光标向下移动一行,并且判断当前行是否有数据
while (rs.next()){
//2、获取数据 getXxx()
int id=rs.getInt(1);
String name=rs.getString(2);
double money=rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-------------");
}
//释放资源
rs.close();
stmt.close();
con.close();
}
}
案例:
一般对于数据封装的类都放在pojo包中,这个包一般存放实体类的(简单的java对象)
1、定义实体类Accout
package pojo;
public class Account {
private int id;
private String name;
private double money;
public Account() {
}
public Account(int id, String name, double money) {
this.id = id;
this.name = name;
this.money = money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
2、查询数据,封装到Account对象中
3、将Account对象存入ArrayList集合中
import pojo.Account;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JDBC {
public static void main(String[] args) throws Exception {
String url="jdbc:mysql:///test?useSSL=false";
String username="root";
String password="root";
Connection con =DriverManager.getConnection(url,username,password);
//定义sql
String sql="select * from account";
//获取statment对象
Statement stmt =con.createStatement();
//执行sql
ResultSet rs =stmt.executeQuery(sql);
//处理结果,遍历rs中的所有数据
//1、光标向下移动一行,并且判断当前行是否有数据
//创建一个集合
List<Account> list= new ArrayList<>();
while (rs.next()){
//创建对象
Account account=new Account();
//2、获取数据 getXxx()
int id=rs.getInt(1);
String name=rs.getString(2);
double money=rs.getDouble(3);
//给对象赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
}
System.out.println(list);
//释放资源
rs.close();
stmt.close();
con.close();
}
}
5、PrepareStatement
拼字符串:如:“+name+”
解决SQL注入的步骤:
四、数据库连接池
1、数据库连接池简介
- 数据库连接池是一个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
数据库连接池的实现
标准接口:DataSource
- 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
- 功能:获取连接
Connection getConnection()
常见的数据库连接池:
- DBCP
- C3P0
- Druid
Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
2、Driud使用步骤
- 导入jar包druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
jar包下载:https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/
创建配置文件
创建driuid.properties
# 驱动名称(连接Mysql)
driverClassName = com.mysql.cj.jdbc.Driver
# 参数?rewriteBatchedStatements=True表示支持批处理机制
url = jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
# 用户名,注意这里是按"userName"来读取的
userName = root
# 用户密码(自己改)
password = root
# 初始化连接数量
initialSize = 10
# 最小连接数量
minIdle = 10
# 最大连接数量
maxActive = 50
# 超时时间3000ms (在等待队列中的最长等待时间,若超时,)
maxWait = 3000
idea中创建返回对象的快捷键Ctrl+Alt+V
package com.test;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
public class druid {
public static void main(String[] args) throws Exception {
//配置文件
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("Java web/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
五、JDBC练习
1、环境准备
- 数据库表 tb_brand
- 实体类Brand
- 测试用例
Alt+鼠标左键:整列编辑
数据库勇敢下划线,而idea中用驼峰命名
在实体类中,基本数据类型建议使用其dui
2、操作
@Test
public void testSwlectAll() throws SQLException {
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
String sql = "select * from tb_brand";
PreparedStatement State = con.prepareStatement(sql);
ResultSet rs = State.executeQuery();
List<Brand> list = new ArrayList<>();
while (rs.next()){
Brand brand = new Brand();
int id = rs.getInt(1);
String brandName = rs.getString(2);
String companyName = rs.getString(3);
int ordered = rs.getInt(4);
String decription = rs.getString(5);
int status = rs.getInt(6);
brand.setId(id);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDecription(decription);
brand.setStatus(status);
list.add(brand);
}
System.out.println(list);
rs.close();
State.close();
con.close();
}
//添加数据
@Test
public void testAdd() throws SQLException {
String url="jdbc:mysql:///test?useSSl=false";
String username="root";
String password="root";
Connection con = DriverManager.getConnection(url, username, password);
//模拟页面接受的数据
String brandName="香飘飘";
String companyName="香飘飘";
int ordered = 5;
String decription="good";
int status=1;
String sql="insert into tb_brand (brand_name,company_name,ordered,decription,status) values(?,?,?,?,?)";
PreparedStatement pstm = con.prepareStatement(sql);
//设置参数
pstm.setString(1,brandName);
pstm.setString(2,companyName);
pstm.setInt(3,ordered);
pstm.setString(4,decription);
pstm.setInt(5,status);
//执行SQL
int count = pstm.executeUpdate();//影响的行数
//处理结果
System.out.println(count>0);
pstm.close();
con.close();
}
//修改数据
@Test
public void testUpdate() throws SQLException {
String url = "jdbc:mysql:///test?useSSl=false";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
String companyName = "3";
String decription = "well";
int id = 4;
String sql="update tb_brand set company_name=?,decription=? where id = ?";
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setString(1,companyName);
pstm.setString(2,decription);
pstm.setInt(3,id);
int count = pstm.executeUpdate();
System.out.println(count>0);
pstm.close();
con.close();
}
//删除数据
@Test
public void testDelete() throws SQLException {
String url = "jdbc:mysql:///test?useSSl=false";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
int id =5;
String sql="delete from tb_brand where id = ?";
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setInt(1,id);
int count = pstm.executeUpdate();
System.out.println(count>0);
pstm.close();
con.close();
}
Maven
一、简介
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译、测试、打包、发布...)
- 提供了一套依赖管理机制
Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用
- Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档
- 官网:http://maven.apache.org/
仓库分类
- 本地仓库:自己计算机上的一个目录
- 中央仓库:由Maven团队维护的全球唯一的仓库(国外)
地址:https://repo1.maven.org/maven2/
- 远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
- 如果有,则在项目直接引用
- 如果没有,则去中央仓库中下载对应的jar包到本地仓库
二、Maven安装配置
- 解压apache-maven-3.6.1.rar即安装完成
- 配置环境变量MAVEN_HOME为安装路径的bin目录
- 配置本地仓库:修改conf/setting.xml中的<localRepository>为一个指定目录
- 配置阿里云私服:修改conf/setting.xml中的<mirrors>标签,为其添加如下子标签:
配置成功:
三、Maven的基本使用
1、Maven的常用命令
- compile:编译
- clean:清理
- test:测试
- package:打包
- install:安装
2、Maven的生命周期
四、IDEA配置Maven
1、IDEA配置Maven环境
- 选择IDEA中-->Settings
- 搜索maven
- 设置IDEA使用本地安装的Maven,并修改配置文件路径
2、Maven坐标详解
什么是坐标?
- Maven中的坐标是资源的唯一标识
- 使用坐标来定义项目或引入项目中需要的依赖
Maven坐标主要组成
- groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itiheima)
- artifactld:定义当前Maven项目名称(通常是模板名称,例如:order-service\goods-service)
- version:定义当前项目版本号
3、IDEA创建Maven项目
- 创建模块,选择Maven,点击Next
- 填写模块名称,坐标信息,点击finish,创建完成
- 编写HellowWorld,并运行
4、IDEA导入Maven项目
- 选择右侧Maven面板,点击+号
- 选中对应项目的pom.xml文件,双击即可
- 如果没有Maven面板,选择View->Appearance->Tool Window Bars
配置Maven-Helper插件
- 选择IDEA中File-->Settings
- 选择Plugins
- 搜索Maven,选择第一个Maven Helper,点击Install安装,弹出面板中点击Accept
- 重启IDEA
这个插件的作用:
会出现以上两个按钮,可以对代码进行调试
五、依赖管理
步骤:(使用过坐标导入jar包)
- 在pom.xml中编写<dependencies>标签
- 在<dependencies>标签中使用<dependency>引入坐标
- 定义坐标的groupld,artifactld,,version
- 点击刷新按钮,使坐标生效
在网上找依赖:
在搜索引擎上输入myqsl maven
按Alt+Insert,选Dependency,可以搜索驱动依赖
依赖范围
MyBatis
什么是MyBatis?
- MyBatis是一款优秀的持久层框架,用于简化JDBC开发
- MyBatis本是Apache的一个开源项目iBatis,2010年这个项目有apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Girhub
- 官网:https://mybatis.net.cn/
持久层
- 负责将数据保存到数据库的那一层代码
- JavaEE三层架构:表现层、业务层、持久层
- 表现层:页面展示;业务层:逻辑处理;持久层:对数据进行持久化保存到数据库中
框架
- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
一、MyBatis快速入门
user表:
use test;
create table tb_user(
id int PRIMARY KEY auto_increment,
username VARCHAR(20),
password VARCHAR(20),
gender char(1),
addr varchar(30)
);
INSERT INTO tb_user VALUES(1,'张三','123','男','北京'),(2,'李四','234','女','天津'),(3,'王五','11','男','西安');
SELECT * FROM tb_user;
依赖:
<dependencies>
<!--Mybaits 依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--junit 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加slf4j日志api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<!--添加log back-classic依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--添加logback-core依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
idea中格式化代码:`Ctrl + Alt + L`
二、Mapper代理开发
目的:
- 解决原生方式中的硬编码
- 简化后期执行SQL
步骤:
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
- 设置SQL映射文件的namespace属性为Mapper接口全限定名
- 在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 编码:
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
在resource中创建包用/作为分割符
三、MyBatis核心配置文件
配置数据库:开发库和测试库是不在一起的,通过default属性切换不同的enviroment
四、配置文件完成增删改查
1、查询
产品原型地址:https://www.pmdaniu.com/storages/122645/74ccff58678d80583ea55547173eb-1818/start.html
1.1查询所有数据
1.2查看详情
特殊符号处理(<):
- 转义字符:
- CDATA区:
1.3多条件查询
条件查询:
- 参数接收:
@Param
是一个注解,通常用在与数据库交互的框架中,比如 MyBatis。它用于给SQL映射文件中的参数占位符命名,从而使得SQL语句更加清晰易懂,并且方便映射方法参数到SQL语句中。使用场景
当你在使用MyBatis等框架进行数据库操作时,你可能会写一些接口方法来执行SQL语句。如果你的SQL语句需要用到方法的参数,你可以使用
@Param
注解来给这些参数命名。
- 散装参数:如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)
- 对象参数:对象属性名称要和参数占位符名称一致
- map集合参数:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
1.4动态条件查询
2、添加
3、修改
3.1修改全部字段
3.2修改动态字段
4、删除
4.1删除一个
4.2批量删除
mybatis会将数组参数,封装为一个Map集合。
默认:array=数组
使用@Param注解改变map集合的默认key的名称
separator:分隔符
5.Mybatis参数传递
五、注解完成增删改查
HTML
参考书:W3schools
什么是HTML?
- HTML是一门语言,所有的网页都是用HTML这门语言编写出来的
- HTML(HyperText Markup Language):超文本标记语言
- 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容
- 标记语言:由标签构成的语言
- HTML运行在浏览器上,HTML标签由浏览器来解析
- HTML标签都是预定义好的。例如:使用<img>展示图片
- W3C标准:网页主要由三部分组成
- 结构:HTML
- 表现:CSS
- 行为:JavaScript
一、HTML快速入门
二、基础标签
三、图片、音频、视频标签
四、超链接标签
五、列表标签
六、表格标签
七、布局标签
八、表单标签
CSS
什么是CSS?
- CSS是一门语言,用于控制网页表现
CSS(Cascading Style Sheet):层叠样式表
- W3C标准:网页主要由三部分组成
- 结构:HTML
- 表现:CSS
- 行为:JavaScript
一、CSS导入方式
二、CSS选择器
id选择器只有一个,类选择器可以弄多个