一、MySQL基本操作
1、数据库简介
- 1.1 简介
数据库是指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合,数据库管理系统指一种操作和管理数据库的大型软件。 - 1.2 常见数据库管理系统
Oracle、MySQL、DB2、Microsoft SQL Server、NoSQL、Redis、MongoDB
2、SQL语言
- 2.1 概述
SQL:Structure Query Language,SQL是一种标准语言,各个数据库厂商根据自己的需求做了改动。 - 2.2 SQL语句分类
DDL:数据库定义语言,用来定义数据库操作对象:库、表、列
DML:数据操作语言,用来定义数据库记录
DCL:数据控制语言,用来定义访问权限和安全级别
DQL:数据查询语言,用来查询记录 - 2.3 DDL
create database:创建数据库
drop database:删除数据库
show databases:显示当前MySQL中的数据库
alter database:修改数据库
create table:创建表
drop table:删除表
show dables:展示当前数据库中的所有表
alter table:删除表 - 2.4 DML操作
insert into 表名 (列名) values (列值):插入表
update 表名 set 列名=列值 where :修改操作
delete from 表名 where :删除记录
2、DQL数据查询:查询关键字:SELECT
- 语法:SELECT 列名 FROM 表名 [WHERE --> GROUP BY-->HAVING--> ORDER BY-->LIMIT]
- 2.1 简单查询
SELECT * FROM stu;//查询所有列
SELECT sname FROM stu;//查询指定列 - 2.2 条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中进行条件筛选: - 比较运算符:=、!=、<>、<、<=、>、>=;BETWEEN…AND; IN(set); IS NULL;
- 关系运算符:这里和Java中不同,直接使用英语单词:AND、OR、NOT
- 算术运算符:和Java中一样
- 2.3 模糊查询
模糊查询必须要搭配LIKE关键字,_代表一个字符,%代表任意个字符 - 2.4 字段控制字符
去除重复记录:DISTINCT
IFNULL(comm,0):如果comm这列有null就为0
as:给列名起别名,可以省略 - 2.5 排序
ORDER BY 列名 ASC/DESC [,列名 ASC/DESC,...]
ASC代表顺序,DESC代表逆序,可以按照多列排序 - 2.6 聚合函数
COUNT():统计指定列不为NULL的记录行数
MAX():指定列的最大值
MIN():指定列的最小值
SUM():指定列的和
AVG():指定列的平均值 - 2.7 分组查询
GROUP BY子句 - 2.8 HAVING子句
使用分组查询如果还相对分组进行筛选就需要使用HAVING子句 -
having与where的区别
having是在分组后对数据进行过滤,where是在分组前对数据过滤
having后面可以使用分组函数,where后面不能使用分组函数 - 2.9 LIMIT限制
SELECT * FROM student LIMIT m,n;
m指的是起始行,起始行为0,n指的是查询多少行。 - 2.10 执行顺序
查询语句书写顺序:select 列 from 表 【where- group by- having- order by-limit】
查询语句执行顺序:from 表 where -group by -having - select - order by-limit
3、数据完整性
数据完整性可以分为实体完整性,域完整性、引用完整性,是为了保证用户输入的是正确的
- 3.1 实体完整性
主键约束:非空且唯一 primary key(),可以单独设置一个,也可以设置联合主键。
唯一约束:unique
自动增长列:auto_increment - 3.2 域完整性
也称为用户自定义的完整性:check约束、数据类型、not null约束、默认值约束
数据类型:char、varchar、int、float、bigint、datetime、text、 - 3.3 引用完整性约束
又称为参照完整性约束,foreign key
4、多表查询
- 4.1 表与表之间的关系
现实生活中有:一对一、一对多、多对一、多对多的关系,多对多的关系可以分解为一对多的关系 - 4.2 合并结果集
UNION:去除重复记录
UNION ALL:不去除重复记录 - 4.3 连接查询
笛卡尔积
内连接:INNER JOIN ON,两张表中都满足条件的
左外连接:LEFT OUTER JOIN ON,左表中满足条件和不满足条件的都显示出来
右外连接:RIGHT OUTER JOIN ON,右表中满足条件和不满足条件的都显示出来 - 4.4 子查询
一个select语句中可以包含另一个完整的select语句,子查询出现的位置可以是WHERE后,也可以是from后,当子查询出现在where后作为条件时,可以使用any与all关键字。
二、单元测试
- 软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误,提高软件的可靠性
1、Junit单元测试
- Junit是一个基于Java语言的单元测试框架,是白盒测试的一种.
- 测试方法上必须使用@Test进行修饰
测试方法必须使用public void 进行修饰,不能带任何参数
将测试代码和项目业务代码分开
测试类所在的包名应该和被测试类所在的包名保持一致
测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
测试类使用Test作为类名的后缀(不是必须)
测试方法使用test作为方法名的前缀(不是必须)
三、JDBC
1、简介
JDBC是一种用于执行SQL语句的Java API,通常JDBC体系结构由两层组成:JDBC与JDBC驱动程序
2、JDBC核心组件
- DriverManager:管理数据库程序驱动列表
Driver:处理与数据库服务器的通信
Connection:具有用于连接数据库的所有方法
Statement:将SQL语句提交到数据库
ResultSet:用于保存从数据库检索的数据
SQLException:处理数据库一个用程序中发生的异常
3、JDBC相关的SQL语法
Create、Read、Update、Delete
4、JDBC初始
- 使用步骤
导入JDBC驱动包
注册JDBC驱动程序
创建连接
执行查询
从结果集中提取数据
释放资源
5、JDBC执行SQL语句
有两个接口可供使用:Statement与PreparedStatement,下面以PreparedStatement来说明:
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String driver;
private static String url;
private static String userName;
private static String password;
//静态代码块,当类初始化的时候执行,并且仅执行一次,因为注册驱动只需要一次
static{
try {
//从本地文件中读取配置信息
Properties properties = new Properties();
//获取当前类的根路径 , 读取配置文件
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(is);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
userName = properties.getProperty("userName");
password = properties.getProperty("password");
//注册驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {//获取连接
Connection con = DriverManager.getConnection(url, userName, password);
return con;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Statement st, Connection cn){
close(null,st,cn);
}
public static void close(ResultSet rs, Statement st, Connection cn){
//关闭连接
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(cn!=null){
try {
cn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
6、SQL注入
- 使用Statement容易引发SQL注入,泄露数据库信息.SQL注入指的是将SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到七篇服务器执行恶意的SQL命令,所以最好的方法是使用PreparedStatement,这个类是继承自Statement.它有两个优点:预编译,效率高;安全,避免SQL注入.
- JDBC中的所有参数都由?符号,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。所述的setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的Java数据类型。如果忘记提供值,将收到一个SQLException。
每个参数标记由其顺序位置引用。第一个标记表示位置1,下一个位置2等等。该方法与Java数组索引不同,从0开始。
7、DBUtils工具类
- 由于每次和数据库通信都需要建立连接,写SQL语句,执行SQL语句,释放资源,所以将这些操作封装在一个单独的类中,提高代码的复用性,减少冗余代码.
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public class DBUtils {//查找一条记录
public static <E> E selectOne(Class<E> clazz, ResultSet rs){
E obj = null;
try{
ResultSetMetaData metaData = rs.getMetaData();
int cnum = metaData.getColumnCount();
if(rs.next()){
obj = clazz.newInstance();
for (int i = 1; i <= cnum ; i++) {
String cname = metaData.getColumnLabel(i);
String ctn = metaData.getColumnTypeName(i);
Object value = rs.getObject(cname);
value = value==null&&("INTEGER".equals(ctn)||"DOUBLE".equals(ctn))?0:value;
Field field = clazz.getDeclaredField(cname);
field.setAccessible(true);
field.set(obj,value);
}
}
}catch (Exception e){
e.printStackTrace();
}
return obj;
}
//查找多条记录
public static <E> List<E> selectMore(Class<E> clazz, ResultSet rs){
List<E> list = new ArrayList<>();
try{
ResultSetMetaData metaData = rs.getMetaData();
int cnum = metaData.getColumnCount();
while (rs.next()){
E obj = clazz.newInstance();
for (int i = 1; i <= cnum; i++) {
String cname = metaData.getColumnLabel(i);
String ctn = metaData.getColumnTypeName(i);
Object value = rs.getObject(cname);
value = value==null&&"INTEGER".equals(ctn)?0:value;
Field field = clazz.getDeclaredField(cname);
field.setAccessible(true);
field.set(obj,value);
}
list.add(obj);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
}
网友评论