javaweb-JDBC_3

一、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优化工具类

在这里插入图片描述

在这里插入图片描述

六、三层架构

  1. 三层架构是指: DAO层、 Service层 、 View层
  2. 每层的职责:
    2.1 DAO层: 数据访问层, 主要完成对数据库表的CRUD。
  • DAO层要接收Service层传递的相关数据
  • 完成对表的增、删、改、查,将结果返回给Service
    2.2 Service层: 业务层, 主要完成具体的业务功能操作。
  • Service层接收View层传递的数据
  • 通过对DAO的一到多次调用完成具体的业务功能
  • Service中必须做事务控制。
    2.3 View层: 视图层, 主要与用户进行交互。
  • 向用户展示结果数据
  • 收集用户的信息
  1. 三层架构的好处:
    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: 测试功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值