时间:2019.08.26 作者:夏晓林 内容:数据库相关知识总结
创建数据库: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)
如果插入空值,请使用null
插入的时期和字符一样,都使用单引号括起来
insert into user() values (),(),();
update student set age=25;
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测试
DriverManager:此类管理数据库驱动程序列表。使用通信协议将来自java应用程序的连接请求与适当的数据库驱动老来进行匹配。
Driver:此接口处理与数据库服务器的通信,我们很少会直接和driver对象进行交互。而是使用drivermanager对象来管理这种类型的对象。
Connection:该接口具有连接数据库的所有方法。连接对象表示通信上下文,数据库的所有通信仅通过连接对象。
Statement:使用从此接口创建的对象来将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。
SQLException:此类处理数据库应用程序中发生的任何异常
创建一个statement后,可以使用它来执行一个SQL语句
preparedStatement接口扩展了statement接口,他为您提供了一个通用的statement对象有两个优点附加功能。
作用1:预编译,效率高 2安全 避免SQL注入
Dbutils类的功能:1注册驱动 2获取连接 3释放资源 4 执行命令
批处理允许将相关的的SQL语句分组到批处理中,并通过对数据库的一次调用来提交他们。当需要一次向数据库发送多个SQL语句时,可以减少数据库的开销
setAsciiStream():此方法用于提供大的ASCII值
setCharacterStream():此方法用于提供UNICODE值
setBinaryStream():此方法用于提供较大的二进制值
一组要么同时执行成功,要么同时失败的SQL语句。是数据库操作的一个不能分割执行单元
事务的四大特点:
Read Uncommitted(读取未提交内容)
Read Committed(读取提交内容)
Repeatable Read(可重读)
Serializable 可串行化
查看事务的隔离级别:select @@tx_isolation
修改事务的隔离级别:set [session|global] transaction isolation level [隔离级别]
jdbc连接默认处于自动提交模式,则每个SQL语句在完成后都会自动提交到数据库。
事务使你能够控制是否和何时更改应用于数据库。它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,则整个事务将失败。
要启动手动事务支持,使用Connection对象的setAutoCommit()方法,如果将false传给setAutoCommit()则关闭自动提交,可以传递一个true值来重新打开
事务的提交和回滚
事务的提交:conn.commit()
事务的回滚:conn.rollback()
SavePoint接口为您提供了额外的事务控制,setSavepoint()可以设置一个新的保存点,还会返回一个savepoint对象,有了保存点,可以回滚到相应的保存点
DAO设计模式:实现业务逻辑和数据库的分离,dao组件依赖于数据库系统,提供数据库的访问接口,隔离了不同的数据库表现。
DAO模式的组成部分:
DAO接口(增删改查)
DAO实现类
实体类(domain(领域)、beans、entiry、pojo、model)。作用:在数据访问和业务逻辑代码之间通过实体类来传输数据
数据库连接和关闭工具
是Apache上的一个java连接池项目需要的jar包有:commons-dbcp.jar,commons-pool.jar.
硬编码
BasicDataSource source=new BasicDataSource();
软编码
DataSource source=BasicDataSourceFactory.createDataSource(properties)
c3p0与dbcp的区别:
需要添加的jar包:c3p0-xx.jar、mchange-commons-java-xx.jar
c3p0是在外部添加配置文件,工具类直接进行应用,因为直接引用,所以要求固定的命名和文件位置
如果xml配置文件和属性文件都存在的时候,xml优先级高于属性文件
ComboPooledDataSource dataSource=new ComboPooledDataSource();
需要的jar包:druid-xxx.jar
DruidDataSource dataSource=DruidDataSourceFactory.creatDataSource(properties)
DbUtils是Apache组织提供的一个对jdbc进行简单封装的开源工具类库,使用它能够简化jdbc应用程序的开发,同时也不会影响程序的性能
DbUtils类:启动类
ResultSetHandler接口:转换类型接口
QueryRunner类:执行SQL语句的类
需要的jar包:
commons-dbutils-xx.jar、druid-xx.jar
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;
}
}
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));
}
}