美文网首页
Java - Part 10

Java - Part 10

作者: 低调的灬攻城狮 | 来源:发表于2020-02-25 22:09 被阅读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语句分类
      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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Java - Part 10

          本文链接:https://www.haomeiwen.com/subject/zjmqxhtx.html