part java_Java - Part 10

一、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 selectOne(Class 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 List selectMore(Class clazz, ResultSet rs){

List 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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值