数据库相关知识总结
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测试
- 测试方法上必须使用@test进行修饰
- 测试方法必须使用public void 进行修饰,不能带任何的参数
- 新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
- 测试类所在的包名应该和被测试类所在的包名保持一致
- 测试单元中的每个方法必须可以单独测试,测试方法间不能有任何的依赖
- 测试类使用Test作为类名的后缀(不是必须)
- 测试方法使用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的区别:
- dbcp没有自动回收空闲的连接。c3p0有自动回收空闲连接功能
- 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));
以上是关于数据库相关知识总结的主要内容,如果未能解决你的问题,请参考以下文章