JDBC简介(二)

本文介绍了数据库操作中的关键概念和技术,如DAO模式、事务管理、批量处理等,并探讨了工厂模式的应用,帮助开发者理解如何有效地进行数据库交互。
 

1、接口DAO

在实际应用中我们的JDBC代码通常都是在数据访问层也就是DAO

为了解除Service层和DAO之间的耦合通常会定义一个DAO接口其中包含各种对实体的操作

由于实际操作数据库可能使用各种不同技术但只要都实现之前定义好的接口, Service层通过接口就可以调用DAO层的代码了

在更换底层DAO的时候, Service层的代码由于都是针对接口调用而不需要改变.

2、工厂模式

场景和问题:java程序开发讲究面向借口,隐藏具体的实现类。

解决方案:可以使用工厂方法,又成为简单工厂的设计模式。

工厂模式中主要用createXXX()或getFactory()方法来返回接口,并且在该方法内部创建实现类。

工厂模式中主要涉及:接口,实现类,工厂类(返回接口并且创建实现类)和调用类。

工厂模式的本质:重在选择,在工厂模式中起重要作用的是各种类,工厂只提供功能接口;选择功能的实现:外部传入参数或者从配置文件中获取。

工厂模式使用的步骤:首先创建一个接口,然后创建若干个实现接口的类,第三创建工厂类并且提供返回接口的方法createXXX();最后在其他的类中调用工厂中的接口。

工厂模式是指在Service层中不直接创建DAO层对象而是通过一个工厂类来读取配置文件创建

3、事物ACID

原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。 

一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。 

隔离性(isolcation):一个事务处理对另一个事务处理没有影响。 

持续性(durability):事务处理的效果能够被永久保存下来 。

1常用API

connection.setAutoCommit(false);

关闭自动提交打开事务。

connection.commit();

提交事务。 

connection.rollback();

回滚事务。

Savepoint sp = conn.setSavepoint();

设置保存点

conn.rollback(sp);

回滚到保存点

conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

设置隔离级别可以通过Connection中的常量设置

2)隔离级别

在多线程并发访问数据库并且使用事务的时候可能会遇到脏读不可重复读幻读的情况需要设置隔离级别来避免

脏读读到的线程未提交的数据

不可重复读在一个事务中读取同一个记录两次获取数据不同

幻读在一个事务中读取到的记录数不同

隔离级别

脏读

不可重复读

幻读

读未提交 Read Uncommitted

   √

读已提交 Read Committed

   √

   √

可重复读 Repeatable Read

   √

可序列化 Serializable

   

   

   

select @@tx_isolation;

查看隔离级别

set transaction isolation level read uncommitted;

设置读未提交

set transaction isolation level read committed;

设置读已提交

set transaction isolation level repeatable read;

设置可重复读

set transaction isolation level serializable;

设置可序列化

start transaction;

开始事务

rollback;

回滚事务

commit;

提交事务

4、获取插入的ID

conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

ResultSet rs = ps.getGeneratedKeys();

if (rs.next())

user.setId(rs.getInt(1));

5批处理

由于建立连接, 以及发送数据非常消耗性能, 如果有大批SQL命令需要处理, 最好使用批处理

ps = conn.prepareStatement("insert into user(name,password,email,birthday) values(?,?,?,?)");

for (User user : list) {

ps.setString(1, user.getName());

ps.setString(2, user.getPassword());

ps.setString(3, user.getEmail());

ps.setDate(4, new Date(user.getBirthday().getTime()));

ps.addBatch();

}

ps.executeBatch();

6分页

通过ResultSet的滚动可以设置获取记录的位置但这样是从数据库中查询出所有数据然后再从结果中筛选结果性能非常低.

MySQL提供了分页语法在查询语句后可使用LIMIT关键字完成分页功能例如:

select * from user limit 40,20

查询从user表中取出从第41条开始的20条记录第一个参数表示忽略前面多少个第二个参数代表取多少个.

可更新结果集、敏感结果集

conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet.TYPE_SCROLL_SENSITIVE

表示获得ResultSet之后是敏感的随数据库更新的MySQL没有支持这项功能

ResultSet.CONCUR_UPDATABLE

表示获得ResultSet之后是可更新的例如:

rs.next();

rs.updateString("name", "updateName");

rs.updateRow();

可以将当前行的name属性改为updateName.

7、反射基础

Class.getConstructors()

获取所有构造函数

Class.getConstructor(Class...);

获取到class中带有指定类型参数的构造函数

Constructor.newInstance(Object...);

使用构造函数创建对象传入指定参数

1方法

Class.getMethods()

获取所有公有方法包括继承的

Class.getDeclaredMethods()

获取所有类中定义的方法包括私有的

Class.getMethod(String, Class...)

获取指定方法名和参数类型的方法(公有的)

Class.getDeclaredMethod(String, Class...)

获取指定方法名和参数类型的方法(类中定义的)

Method.invoke(Object, Object...)

在制定对象上运行方法将制定参数传入

2属性

Class.getFields()

获取所有公有属性(包括父类继承的)

Class.getDeclaredFields()

获取所有定义的属性(包括私有的)

Class.getField(String)

获取指定属性(公有属性)

Class.getDeclaredField(String)

获取指定属性(定义属性)

Field.set(Object, Object)

设置指定对象的属性值

Field.get(Object)

获取指定对象的属性值

Filed.setAccessible(Boolean)

设置访问权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值