一、JDBC工具类
package com.bai.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class JDBCUtil3 {
private static Properties prop = new Properties();
static{
InputStream in = null;
try{
// 读取配置文件
in = JDBCUtil3.class.getResourceAsStream("/jdbc_oracle.properties");
// 解析流中的信息
prop.load(in);
//加载驱动
Class.forName(prop.getProperty("driver"));
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("读取资源失败!~");
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 创建ThreadLocal对象,将连接绑定到当前线程
private static ThreadLocal<Connection> tol = new ThreadLocal<Connection>();
public static Connection getConn() throws Exception{
System.out.println("util:"+Thread.currentThread().hashCode());
// 先到当前线程中获取一下Connection ,如果有直接返回, 没有则创建新的同时存入当前线程
Connection conn = tol.get();
if(conn==null){
conn = DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("username"),
prop.getProperty("password"));
// 存入当前线程
tol.set(conn);
}
return conn;
}
public static void close(ResultSet rs,PreparedStatement pstm,Connection conn) throws Exception{
if(rs!=null) rs.close();
if(pstm!=null) pstm.close();
if(conn!=null) {
conn.close(); // 将连接关闭
// 从当前线程移除已经关闭的连接对象
tol.remove();
}
}
public static void close(PreparedStatement pstm,Connection conn) throws Exception{
if(pstm!=null) pstm.close();
if(conn!=null) {
conn.close(); // 将连接关闭
// 从当前线程移除已经关闭的连接对象
tol.remove();
}
}
}
环境搭建
配置文件 jdbc_oracle.properties(必须.properties结尾哦)
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
password=hr
配置文件 jdbc_mysql.properties(必须.properties结尾哦)
#连接数据库的url,如果主机地址是localhost,端口是3306也可以写成url=jdbc:mysql:///databasename
url=jdbc:mysql://localhost:3306/databasename
#用户名
user=root
#密码
password=root
#MySQL数据库加载驱动
driverClass=com.mysql.jdbc.Driver
二、Service层【biz】
1、Service称为业务操作, Service层的主要作用就是为用户提供具体的业务功能 。
2、Service业务操作的核心实现
2.1 Service业务功能操作的实现需要通过 一 到多次的调用DAO来实现 。
2.2 Service中还需要根据业务需求,完成一些数据的运算和处理 。
3、Service开发的标准流程
3.1 创建表
3.2 封装实体类
3.3 定义DAO (定义接口、 编写实现类)
3.4 定义Service业务层(定义接口、编写实现类 )
4、对于转账业务功能的详细分析
4.1 Service 的设计
interface AccountService{
void transfer(Integer fromCardId,String password,Double money,Integer toCardId);
}
class AccountServiceImpl implements AccountService{
public void transfer(Integer fromCardId,String password,Double money,Integer toCardId){
//1. 验证本人账户信息
//2. 输入转账金额 | 验证余额是否充足
//3. 更新本人账户余额 | 减钱
//4. 验证对方账户是否存在
//5. 更新对方账户余额 | 加钱
}
}
4.2 DAO的设计
interface AccountDao{
Account selectByCardId(Integer cardId);
void updateAccount(Account acc);
}
class AccountDaoImpl implements AccountDao{
//实现接口中的方法
}
二、事务控制 : 为了保证数据的一致性和安全性。
1、 JDBC中的事务 : 默认一条SQL语句自成一个事务。 在JDBC中每执行完一条SQL语句, 便会自动提交事务。
PS: 一个事务其实就是生活中一个完整的业务操作, 一个完整的业务功能操作一般是由对DAO的一到多次调用完成的。为了保证业务功能操作的完整性, 必须做手动控制事务。
2、手动控制事务 | JDBC中管理事务的对象 Connection
2.1 设置手动提交事务 : conn.setAutoCommit(false);
2.2 业务操作完成,需要手动提交: conn.commit;
2.3 出现异常,回滚事务 : conn.rollback();
注意: 当我们在Service中给获取到的连接对象设置为手动提交事务后, DAO的连接对象没有收到任何影响, 导致事务没有控制住 。 原因是: 在一个业务操作中 Service和DAO使用的不是同一个连接对象。
解决方案: 可以将Connection作为参数在Service中传递给DAO,这样可以保证Service和DAO使用同一个连接对象,保证事务控制的完整性。 (当Service跟DAO使用同一个连接对象时,DAO不做关闭连接的操作, 在Service中完成业务功能最后关闭 )
三、Service小结
1.、Service的作用: 主要完成业务功能操作 。 用户需要业务功能,找Service层 。
2、 Service中的实现操作:
2.1 必须做事务控制
-设置手动控制事务: conn.setAutoCommit(false);
-业务完成: conn.commit();
-出现异常: conn.rollback();
2.2 需要调用DAO
2.3 完成一些数据的处理运算
四、ThreadLocal
1、 ThreadLocal对象的作用: 将一个对象绑定到当前线程中。
2、 基本使用:
2.1 创建: ThreadLocal tol = new ThreadLocal(); | 泛型用于指定向当前线程中绑定对象的类型。
2.2 绑定值到当前线程: tol.set(T value); | 参数为绑定的值
2.3 从当前线程取值: T value = tol.get(); | 返回值类型为存入值的类型
2.4 从当前线程移除值: tol.remove();
注意: 一个ThreadLocal对象只能绑定一个值到当前线程 。
3、 ThreadLocal的基本原理
3.1 存值: 将当前的ThreadLocalMap区获取到, 然后用当前ThreadLocal对象作为key 存入一个键值对。
3.2 取值: 先获取到当前线程的ThreadLocalMap区, 然后用当前的ThreadLocal对象作为key取值。
五、使用ThreadLocal优化工具类
六、三层架构
- 三层架构是指: DAO层、 Service层 、 View层
- 每层的职责:
2.1 DAO层: 数据访问层, 主要完成对数据库表的CRUD。
- DAO层要接收Service层传递的相关数据
- 完成对表的增、删、改、查,将结果返回给Service
2.2 Service层: 业务层, 主要完成具体的业务功能操作。 - Service层接收View层传递的数据
- 通过对DAO的一到多次调用完成具体的业务功能
- Service中必须做事务控制。
2.3 View层: 视图层, 主要与用户进行交互。 - 向用户展示结果数据
- 收集用户的信息
- 三层架构的好处:
3.1 各司其职
3.2 解耦合
3.3 利于协作开发
七、日期类型的转换
1、将日期类型 转换成 指定的字符串格式展示
2、 将字符串 转换成 日期类型(java.util.Date)
3、utilDate 转换成sqlDate
八、JDBC开发流程
1、搭建开发环境
1.1 引入jar 包 :ojdbc6.jar
1.2 引入配置文件 : jdbc_oracle.properties
1.3 引入工具类 : JDBCUtil3
2编码
2.1 创建表
2.2 封装实体类
2.3 编写DAO
- 定义接口
- 编写实现类
2.4 编写Service - 定义接口
- 编写实现类
PS: 测试功能