第十篇学习总结

2020-01-27  本文已影响0人  拼搏男孩

第十篇学习总结

一、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语句分类

2.3 DDL

2.4 DML操作

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 字段控制字符

2.5 排序

ORDER BY 列名 ASC/DESC [,列名 ASC/DESC,...]

ASC代表顺序,DESC代表逆序,可以按照多列排序

2.6 聚合函数

2.7 分组查询

GROUP BY子句

2.8 HAVING子句

使用分组查询如果还相对分组进行筛选就需要使用HAVING子句

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 实体完整性

3.2 域完整性

也称为用户自定义的完整性:check约束、数据类型、not null约束、默认值约束

3.3 引用完整性约束

又称为参照完整性约束,foreign key

4、多表查询

4.1 表与表之间的关系

现实生活中有:一对一、一对多、多对一、多对多的关系,多对多的关系可以分解为一对多的关系

4.2 合并结果集

4.3 连接查询

4.4 子查询

一个select语句中可以包含另一个完整的select语句,子查询出现的位置可以是WHERE后,也可以是from后,当子查询出现在where后作为条件时,可以使用any与all关键字。

二、单元测试

软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误,提高软件的可靠性

1、Junit单元测试

Junit是一个基于Java语言的单元测试框架,是白盒测试的一种.

二、JDBC

1、简介

JDBC是一种用于执行SQL语句的Java API,通常JDBC体系结构由两层组成:JDBC与JDBC驱动程序

2、JDBC核心组件

3、JDBC相关的SQL语法

Create、Read、Update、Delete

4、JDBC初始

5、JDBC执行SQL语句

有两个接口可供使用:Statement与PreparedStatement,下面以PreparedStatement来说明:

package com.qianfeng;

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

}

上一篇 下一篇

猜你喜欢

热点阅读