什么是持久化
将内存中的数据永久保存在磁盘中,方便以后使用
JDBC是什么
java数据库连接
用于执行sql语句的java API
java官方提供接口,各大厂商提供实现类,程序员使用实现类的jar包
JDBC的开发流程
添加包:
mysql-connector-java-5.1.48.jar
lombok.jar
口诀:贾连欲执事
本机url:jdbc:mysql://localhost:3306/jdbc
1.加载注册驱动:Class.forname
2.获取连接对象:Connection conn=DriverManager.getConnection(url,username,password)
3.创建语句对象:Statement ps=conn.creatStatement()
4.执行sql语句ps.executeUpdate(“sql语句”)
释放资源:ps.close(),conn.close()
DAO(java access objiect)
是什么:数据访问对象,面向对象的数据库接口
作用:让我们更规范的编写数据连接的代码
规范如下:
DAO 接口 : 表示对某个模型的 CRUD 操作做规范,以 I 开头,interface
标准:IXxxDAO
例: IEmployeeDAO/IStudentDAO
DAO 实现类: 表示对某个 DAO 接口的实现
标准:XxxDAOImpl
例:EmployeeDAOImpl/StudentDAOImpl
DAO 测试类: 测试 DAO 组件中的所有方法
标准:XxxDAOTest: XxxDAO 组件的测试类,
例:EmployeeDAOTest,StudentDAOTest
创建DAO项目的步骤
-
创建项目
-
导入数据库驱动包
-
创建表和模型包以及模型对象 (domain/Student)
-
创建 DAO 包和 DAO 接口,设计 DAO 接口方法 (dao/IStudentDAO)
-
创建 DAO 实现包,实现 DAO 接口(dao.impl/StudentDAOImpl)
-
创建测试目录,生成测试类和方法(test/StudentDAOTest)
-
书写实现,实现一个方法测试一个方法并且测试通过
预编译语句对象(pretaredStatement(String sql))
好处:告别繁琐的字符创拼接,sql语句中使用**?**占作为占位符表示数据,占位符的开始位置是1
格式如下:
String sql=“insert into t_student values(null,?,?,?)”
PrapraredStatement ps=conn.PraparedStatement(sql)
ps.setString(1,s.getName);
JDBC的DQL(查询),返回的是一个对象或者集合
增删改使用的方法时executeUpdate(),查询使用的是executeQuery()
executeQuery():获得的数据被存放在ResultSet的对象中
ResultSet对象指向当前行的光标,从第一行开始,使用next()方法移动光标,下一行有值时返回true,否则返回false,求所有的对象使用while循环迭代结果集
使用rs.getxxx来获取想要的字段,再new对象将字段进行封装
单查询
public Student selectById(long id) throws ClassNotFoundException, SQLException, IOException {
Connection conn = DruidUtil.getConnection();
String sql="select * from t_student where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1,id);
ResultSet rs = ps.executeQuery();
//处理结果集,将数据从结果集中取出,封装到指定的对象中
//next():判断是否有数据,如果有则取出这一行
//getxxx():获取当前行指定列的数据,xxx表示的是列的类型
if(rs.next()) {
//根据列的位置获取数据,位置从1开始
//long id1 = rs.getLong(1);
//根据列名获取数据
String name = rs.getString("name");
int age = rs.getInt("age");
String email = rs.getString("email");
Student student = new Student(id, name, age, email);
System.out.println(student);
return student;
}
查询所有的信息和单查询相同,只是sql语句不同,使用list集合进行封装
抽取JDBC工具类
作用:抽取项目中的相同的代码,减少代码量,防止每次与数据库建立连接时url,username,password写错
**工具类的设计步骤:**看调用者是否需要使用对象,如果不需要,将该工具类的构造器进行私有化(private),同时将里面的方法也设置为静态(static)方法,调用时使用"类名.方法名".如果需要对象就使用单例模式
示例
抽取配置文件(properties),在工具类Util中抽取
出现情况:java中的数据库账号密码会被编译成字节码文件,用户去修改时不方便,出现硬编码问题
作用:解决硬编码问题,方便用户在配置文件中修改数据库的信息
示例
JDBC事务(基于InnoDB)
事务(Transactin),简写为tx
含义:将一组操作作为一个整体,确保数据的一致性,一个操作失败则整个事务视为失败,只有所有操作成功整个事务才算成功
对多组数据的增删改使用事务
事务的ACID属性(作用)
原子性:一个事务中的操作要么都发生,要么都不发生,整个操作是一个整体
一致性:保证数据的完整性,数据的总和不变
隔离性:一个事务不能被其他事务所干扰
持久性:事务一旦被提交,数据的改变是永久型的,无法回滚到最初状态
事务操作的步骤
1.先定义一个需要增删改的事务,从事务的开始处事务设置为手动提交setAutoCommit(false)
2.执行过程中事务没有问题就手动提交**(commit)**事务,此时数据已永久保存
3.如果执行过程中有异常,事务就会回滚**(rollback)**到最初状态
示例
try{
//取消事务自动提交机制,设置为手动提交
connection的对象.setAutoCommit(false);
//操作1
//操作2
//异常
//操作3
..........
//所有操作成功,手动提交异常
connection的对象.Commit();
}catch(Exceptin e)
//处理异常
//回滚异常
connection的对象.rollback();
}
事务的注意事项:
1.默认情况下事务是执行DML后自动提交
**2.**在开发中,代码没有异常,但是数据库中的数据没与发生改变
主要原因:事务没有提交
**3.**在Mysql中,只有InnoDB支持事务,MySIAM不支持事务
4.事务一般不在dao层处理,在service控制
连接池
java官方只提供接口,服务器厂商提供实现类
**出现的原因:**每一次与数据库建立连接后会花费较长时间进行身份验证,并且使用后还得频繁断开连接,不能控制被创建的连接对象的数量,等待的时间太长
使用连接池的好处:不用频繁与数据库建立连接,提高使用效率,充分利用连接对象,直接从连接池里面拿,断开就将连接还给连接池
连接池使用
以前使用的是connection conn=DriverManage.getconnection获取的连接
1.在项目中导入jar:druid-1.1.015.jar
//创建连接池对象
DruidDataSource() ds=new DruidDataSource()
//设置连接对象的四要素
ds.getDricerClassName("com.mysql.jdbc.Driver")
ds.getUrl("jdbc:mysql://localhost:3306/jdbc")
ds.getUsername("root")
ds.getPassword("123456")
//获取连接
connection conn=ds.getConnection()
但是数据库的连接方式一般写在配置文件中,所以需要从配置文件(properties)中抽取字段对应的数据
示例
连接池的使用(方式二,使用工厂)
比最开始的方法多了一个创建工厂的方法,极大地简化了代码
properties配置文件的的key必须和DataSourse中的属性一致,否则就会报错
部分例如:driverClassName,username,url,password
sql注解(startement和preparestatement的区别)
sql的执行流程:
安全性分析–>sql语法分析–>sql语句的编译–>选择并执行一个计划
statement:整个流程每次都要执行
preparestatement:第一条执行整个流程,第二条就只执行第4步
sq注入的原因:用户输入的数据可能会修改sql的语法结构
例如:
preparestatement的优势:
1.更好的可读性,可维护性
2.更好的性能,但是mysql不支持
3.更安全可以防止sql注入的问题
安全性分析–>sql语法分析–>sql语句的编译–>选择并执行一个计划
statement:整个流程每次都要执行
preparestatement:第一条执行整个流程,第二条就只执行第4步
sq注入的原因:用户输入的数据可能会修改sql的语法结构
例如:
preparestatement的优势:
1.更好的可读性,可维护性
2.更好的性能,但是mysql不支持
3.更安全可以防止sql注入的问题