数据库相关知识总结

Posted 夏芷雨涵梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库相关知识总结相关的知识,希望对你有一定的参考价值。

时间:2019.08.26 作者:夏晓林 内容:数据库相关知识总结

DDL操作表

创建数据库:create database if not exists mydb;

double(5,2)表示最多5位,其中有必须有2位小数,即-999.99-999.99

decimal:精确数值数据。最大位数可以是65

char:固定长度字符串类型,不足的补空格,查询速度快,浪费空间

varchar:可变长度字符串类型,查询速度慢,节省空间

text:大文本字符串类型;有字符编码,存储比较大的文本数据

blob:二进制大数据类型,可以存储图片、音频和视频

查看表的字段信息:

desc student;

在学生表的基础上再加一列image

alter table student add image blob;

修改address列,使其长度为60

alter table student modify address varchar(60)

删除image列,一次只能删除一列

alter table student drop image;

表名改为user

rename table student to user;

查看表的创建细节

show create table user

列名name修改为username

alter table user change name username varchar(100)

DML操作

插入操作insert

如果插入空值,请使用null

插入的时期和字符一样,都使用单引号括起来

insert into user() values (),(),();

修改操作update

update student set age=25;

删除操作delete

delete from student where name=‘zhangsan’;

delete from student;

约束

主键约束(primary key)数据唯一,且不能为null

唯一约束(unique)数据不能重复,可以为null

域完整性约束:数据类型、非空约束(not null)、默认值约束(default)

多表查询

合并结果集:union union all

连接查询:inner join on(内连接) outer join on(外连接)left join right join

子查询

union(去除重复记录),select * from t1 union select * from t2; union all(不去重)

内连接:

select * from emp inner join dept on emp.deptno=dept.deptno;注意:on后面是主外键关系

外连接:

左外连接:以左表为主表,右表是从表

select * from emp left outer join dept on emp.deptno=dept.deptno;

左连接是先查询出左表(以左表为主),然后查询右表,左表中满足条件和不满足条件都显示,右边不满足条件的显示null

子查询:

select * from emp where sal>all(select sal from emp where deptno=30)

数据库测试

黑盒测试(只测试功能)

白盒测试(测试逻辑代码)

黑盒测试(介于黑盒和白盒之间)

Junit测试

  1. 测试方法上必须使用@test进行修饰
  2. 测试方法必须使用public void 进行修饰,不能带任何的参数
  3. 新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
  4. 测试类所在的包名应该和被测试类所在的包名保持一致
  5. 测试单元中的每个方法必须可以单独测试,测试方法间不能有任何的依赖
  6. 测试类使用Test作为类名的后缀(不是必须)
  7. 测试方法使用test作为方法名的前缀(不是必须)

jdbc核心组件

DriverManager:此类管理数据库驱动程序列表。使用通信协议将来自java应用程序的连接请求与适当的数据库驱动老来进行匹配。

Driver:此接口处理与数据库服务器的通信,我们很少会直接和driver对象进行交互。而是使用drivermanager对象来管理这种类型的对象。

Connection:该接口具有连接数据库的所有方法。连接对象表示通信上下文,数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象来将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。

SQLException:此类处理数据库应用程序中发生的任何异常

使用jdbc应用程序的步骤:
  • 导入驱动包(需要下载包含数据库编程所需的jdbc的jar包)
  • 注册驱动程序(初始化驱动程序,以便能够打开与数据库的饿通信通道)com.mysql.jdbc.Driver
  • 创建连接(需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表示与数据库的物理连接)jdbc:mysql://localhost:3306/
  • 执行查询(需要使用statement的对象来构建和提交SQL语句到数据库)
  • 从结果集中提取数据(使用相应的ResultSet.getxxx()方法从结果集中检索数据)
  • 关闭连接释放资源(需要明确的关闭所有的数据库资源,而不依赖与jvm的垃圾收集)

创建一个statement后,可以使用它来执行一个SQL语句

  • boolean execute(String sql):如果可以检索到ResultSet对象,则返回一个布尔值true;否则返回false。
  • int executeUpdate(String sql):返回受影响的行数,例如insert,update ,delete语句
  • ResultSet executeQuery(String sql):返回一个ResultSet对象,例如select
PreparedStatement

preparedStatement接口扩展了statement接口,他为您提供了一个通用的statement对象有两个优点附加功能。

作用1:预编译,效率高 2安全 避免SQL注入

抽取数据库工具类

Dbutils类的功能:1注册驱动 2获取连接 3释放资源 4 执行命令

批处理

批处理允许将相关的的SQL语句分组到批处理中,并通过对数据库的一次调用来提交他们。当需要一次向数据库发送多个SQL语句时,可以减少数据库的开销

Statement批处理的步骤
  • 注册驱动获取连接
  • 使用createStatement()方法来创建statement对象
  • 使用setAutoCommit()将auto-commit属性设置为false
  • 使用addBatch()方法在创建的语句对象上添加你喜欢的SQL语句到批处理中
  • 在创建的语句对象上使用executeBatch()方法执行所有的SQL语句
  • 使用commit()方法提交所有的更改
  • 释放资源
JDBC操作二进制:

setAsciiStream():此方法用于提供大的ASCII值

setCharacterStream():此方法用于提供UNICODE值

setBinaryStream():此方法用于提供较大的二进制值

数据库事务:

一组要么同时执行成功,要么同时失败的SQL语句。是数据库操作的一个不能分割执行单元

事务的四大特点:

  • 原子性:Atomicity。表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
  • 一致性:Consistency。表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态
  • 隔离性:Isolation。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
  • 持久性:Durability。事务完成之后,它对于系统的影响是永久性的。

Read Uncommitted(读取未提交内容)

Read Committed(读取提交内容)

Repeatable Read(可重读)

Serializable 可串行化

查看事务的隔离级别:select @@tx_isolation

修改事务的隔离级别:set [session|global] transaction isolation level [隔离级别]

jdbc中事务的应用

jdbc连接默认处于自动提交模式,则每个SQL语句在完成后都会自动提交到数据库。

事务使你能够控制是否和何时更改应用于数据库。它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,则整个事务将失败。

要启动手动事务支持,使用Connection对象的setAutoCommit()方法,如果将false传给setAutoCommit()则关闭自动提交,可以传递一个true值来重新打开

事务的提交和回滚

事务的提交:conn.commit()

事务的回滚:conn.rollback()

SavePoint接口为您提供了额外的事务控制,setSavepoint()可以设置一个新的保存点,还会返回一个savepoint对象,有了保存点,可以回滚到相应的保存点

封装DbUtils:注册驱动、获取连接、执行命令、执行查询、释放资源

DAO设计模式:实现业务逻辑和数据库的分离,dao组件依赖于数据库系统,提供数据库的访问接口,隔离了不同的数据库表现。

DAO模式的组成部分:

  • DAO接口(增删改查)

  • DAO实现类

  • 实体类(domain(领域)、beans、entiry、pojo、model)。作用:在数据访问和业务逻辑代码之间通过实体类来传输数据

    • 实体类的特征:
    • 属性用private修饰
    • 提供public修饰的get和set方法
    • 实体类提供无参构造方法,根据业务提供有参构造
    • 实现Serializable接口,支持序列化机制
  • 数据库连接和关闭工具

DBCP连接池

是Apache上的一个java连接池项目需要的jar包有:commons-dbcp.jar,commons-pool.jar.

硬编码
BasicDataSource source=new BasicDataSource();
软编码
DataSource source=BasicDataSourceFactory.createDataSource(properties)
C3P0连接池

c3p0与dbcp的区别:

  1. dbcp没有自动回收空闲的连接。c3p0有自动回收空闲连接功能
  2. dbcp需要手动加载配置文件。c3p0会自动加载

需要添加的jar包:c3p0-xx.jar、mchange-commons-java-xx.jar

c3p0是在外部添加配置文件,工具类直接进行应用,因为直接引用,所以要求固定的命名和文件位置

如果xml配置文件和属性文件都存在的时候,xml优先级高于属性文件

ComboPooledDataSource dataSource=new ComboPooledDataSource();
Druid连接池

需要的jar包:druid-xxx.jar

DruidDataSource dataSource=DruidDataSourceFactory.creatDataSource(properties)

DbUtils使用

DbUtils是Apache组织提供的一个对jdbc进行简单封装的开源工具类库,使用它能够简化jdbc应用程序的开发,同时也不会影响程序的性能

DbUtils包括的主要类

DbUtils类:启动类

ResultSetHandler接口:转换类型接口

  • ArrayHandler类:实现类,把记录转化成数组
  • ArrayListHandler类:把记录转化成数组,并放入集合中
  • ColumnListHandler类:读取某一列的数据,封装到List中
  • ScalarHandler类:适合获取一行一列数据
  • BeanHandler类:实现类,把记录转换成对象
  • BeanListHandler类:实现类,把记录转换成list,使记录为JavaBean类型的对象

QueryRunner类:执行SQL语句的类

需要的jar包:

commons-dbutils-xx.jar、druid-xx.jar

Druid连接池的应用
public class DbUtils_Druid 
    private static DruidDataSource dataSource;
    static
        try 
            Properties properties=new Properties();
            InputStream is = DbUtils_Druid.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);
            is.close();
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
         catch (Exception e) 
            e.printStackTrace();
        
    
    public static Connection getConnection()
        try 
            return dataSource.getConnection();
         catch (SQLException e) 
            e.printStackTrace();
        
        return null;
    

DbUtils的使用
public class DataSourceUtil 
    private static DruidDataSource dataSource;
    static 
        try 
            Properties properties=new Properties();
            InputStream is = DataSourceUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);

            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
         catch (Exception e) 
            e.printStackTrace();
        

    

    public static DataSource getDataSource()
        return dataSource;
    


public class EmpDaoImpl implements EmpDao 


    @Override
    public List<Emp> findAll() 
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        try 
            List<Emp> query = qr.query("select * from emp", new BeanListHandler<Emp>(Emp.class));
            return query;
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("查询失败",e);
        
    

    @Override
    public Emp findByEmpno(Integer empno) 
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        try 
            return qr.query("select * from emp where empno=?", new BeanHandler<Emp>(Emp.class),empno);
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("查询失败",e);
        
    

    @Override
    public void add(Emp emp) 
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());

        Object[] params=emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno();
        String sql="insert into emp values(?,?,?,?,?,?,?,?)";
        try 
            qr.update(sql, params);
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("添加失败",e);
        

    

    @Override
    public void update(Emp emp) 
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        Object[] params=emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno();
        String sql="update emp set ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno=?";
        try 
            qr.update(sql, params);
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("更新失败",e);
        
    

    @Override
    public void delete(Integer empno) 
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        String sql="delete from emp where empno=?";
        try 
            qr.update(sql,empno );
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("删除失败",e);
        
    

    public long getCount()
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        try 
            Long count = qr.query("select count(*) from emp", new ScalarHandler<>());
            return count;
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("查询失败",e );
        
    

    public Object[] getArray(Integer empno)
        QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
        try 
            Object[] query = qr.query("select * from emp where empno=?", new ArrayHandler(),empno);
            return query;
         catch (SQLException e) 
            e.printStackTrace();
            throw new RuntimeException("查询失败",e );
        
    


public class EmpDaoImplTest 
    @Test
    public void testFindAll()
        EmpDao empDao=new EmpDaoImpl();
        List<Emp> all = empDao.findAll();
        for (Emp emp : all) 
            System.out.println(emp.toString());
        

    
    @Test
    public void testFindByEmpno()
        EmpDao empDao=new EmpDaoImpl();
        Emp emp = empDao.findByEmpno(1235);
        System.out.println(emp.toString());

    
    @Test
    public void testUpdate()
        EmpDao empDao=new EmpDaoImpl();
        Emp emp = new Emp(1234, "张三", "拍电影", 6666, new Date(), new BigDecimal(10000.0), new BigDecimal(1000.0), 20);
        empDao.update(emp);
    
    @Test
    public void testAdd()
        EmpDao empDao=new EmpDaoImpl();
        Emp emp = new Emp(1235, "张三", "拍电影", 6666, new Date(), new BigDecimal(10000.0), new BigDecimal(1000.0), 20);
        empDao.add(emp);
    
    @Test
    public void testDelete()
        EmpDao empDao=new EmpDaoImpl();
        empDao.delete(1234);
    
    @Test
    public void testGetCount()
        EmpDao empDao=new EmpDaoImpl();
        long count = ((EmpDaoImpl) empDao).getCount();
        System.out.println(count);
    

    @Test
    public void testGetArray()
        EmpDao empDao=new EmpDaoImpl();
        Object[] array = ((EmpDaoImpl) empDao).getArray(1235);
        System.out.println(Arrays.toString(array));
    


以上是关于数据库相关知识总结的主要内容,如果未能解决你的问题,请参考以下文章

yii框架缓存知识总结(转载)

PHP课程总结20161229

爆肝整理JVM十大模块知识点总结,不信你还不懂

对大数据知识架构的梳理

Docker学习总结(68)—— Docker 数据卷相关知识总结

数据库相关知识总结