第6章 数据库事务 第7章 DAO及相关实现类

news2025/1/16 20:02:56

第6章 数据库事务 

1.数据库事务介绍

*事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态

*事务处理:保证所有事务都作为一个工作单元来执行

2.JDBC事务处理

*数据一旦提交则不可回滚

*导致数据自动提交的操作:DDL操作、DML默认情况、关闭连接时

3.事务的ACID属性

(1)ACID属性

原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态

隔离性:一个事务的执行不能被其他事务干扰

持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的

(2)数据库的并发问题

   脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。

   不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后 T2 更新了该字段。之后, T1再次读取同一个字段,值就不同了。

   幻读:对于两个事务T1, T2, T1从一个表中读取了一个字段, 然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。

(3)四种隔离级别

*Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。

Oracle 默认的事务隔离级别为: READ COMMITED

*Mysql 支持 4 种事务隔离级别。

Mysql 默认的事务隔离级别为: REPEATABLE READ

(4)在MySQL中设置隔离级别

第7章 DAO及相关实现类

*BaseDAO:装针对于数据表的通用操作;使用abstract修饰,表示不能被实例化;针对不同的表提供具体的DAO

*xxDAO接口:用于规范针对某数据表的常用操作

*xxDAOImpl抽象类:继承BaseDAO,实现xxDAO接口

BaseDAO:

package chapter7;

import utils.JDBCUtiles;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.ArrayList;

/*封装针对于数据表的通用操作*/
/*使用abstract修饰,表示不能被实例化*/
/*针对不同的表提供具体的DAO*/
public abstract class BaseDAO<T> {
    private Class<T> clazz=null;

    {
        //获取当前子类的泛型
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType paramType= (ParameterizedType) genericSuperclass;
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
        clazz=(Class<T>) actualTypeArguments[0];
    }

    //通用的查询操作,用于返回查询结果集(考虑事务)
    public ArrayList<T> getInstance(Connection conn, String sql, Object ...args){
        ArrayList<T> ts = null;
        PreparedStatement pr = null;
        ResultSet resultSet = null;
        try {
            ts = new ArrayList<>();
            pr = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                pr.setObject(i+1,args[i]);
            }
            resultSet = pr.executeQuery();
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            while (resultSet.next()){
                T t = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    Object value = resultSet.getObject(i + 1);
                    String name = metaData.getColumnLabel(i + 1);
                    Field declaredField = clazz.getDeclaredField(name);
                    declaredField.setAccessible(true);
                    declaredField.set(t,value);
                }
                ts.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtiles.closeResource(null,pr,resultSet);
        }
        return ts;
    }
    //通用的增删改操作,获取连接和关闭连接都在外部进行
    public int update(Connection conn,String sql,Object... args){
        PreparedStatement pr=null;
        try {
            pr = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                pr.setObject(i+1,args[i]);
            }
            return pr.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtiles.closeResource(null,pr);
        }
        return 0;
    }
    //用于查询特殊值的通用方法
    public <E> E getValue(Connection conn,String sql,Object... args){
        PreparedStatement pr = null;
        ResultSet resultSet = null;
        try {
            pr = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                pr.setObject(i+1,args[i]);
            }
            resultSet = pr.executeQuery();
            if(resultSet.next()){
                return (E)resultSet.getObject(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtiles.closeResource(null,pr,resultSet);
        }
        return null;
    }

}

xxDAO接口

package chapter7;

import bean.Customer;

import java.sql.Connection;
import java.util.Date;
import java.util.List;

/*此接口用于规范针对于customers表的常用操作*/
public interface CustomerDAO {
    //将cust对象添加到数据库中
    void insert(Connection conn, Customer cust);
    //根据指定的ID删除表中的一条记录
    void deleteByID(Connection conn,int id);
    //根据指定的ID修改数据表中的记录
    void updateByID(Connection conn,int id,Customer cust);
    //根据指定的ID查询对应的Customer对象
    Customer getCustomerByID(Connection conn,int id);
    //查询表中的所有记录构成的集合
    List<Customer> getAll(Connection conn);
    //返回数据表中数据的条目数
    Long getCount(Connection conn);
    //返回数据表中最大的生日
    Date getMaxBirth(Connection conn);
}

xxDAOImpl抽象类:

package chapter7;

import bean.Customer;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO{


    //将cust对象添加到数据库中
    @Override
    public void insert(Connection conn, Customer cust) {
        String sql="insert into customers(name,email,birth) values(?,?,?)";
        update(conn,sql,cust.getName(),cust.getEmail(),cust.getBirth());
    }
    //根据指定的ID删除表中的一条记录
    @Override
    public void deleteByID(Connection conn, int id) {
        String sql="delete from customers where id=?";
        update(conn,sql,id);
    }
    //根据指定的ID修改数据表中的记录
    @Override
    public void updateByID(Connection conn, int id, Customer cust) {
        String sql="update customers set name=?,email=?,birth=? where id=? ";
        update(conn,sql,cust.getName(),cust.getEmail(),cust.getBirth(),id);
    }
    //根据指定的ID查询对应的Customer对象
    @Override
    public Customer getCustomerByID(Connection conn, int id) {
        String sql="select name,email,birth from customers where id=?";
        ArrayList<Customer> instance = getInstance(conn, sql, id);
        return instance.get(0);
    }
    //查询表中的所有记录构成的集合
    @Override
    public List<Customer> getAll(Connection conn) {
        String sql="select name,email,birth from customers ";
        ArrayList<Customer> instance = getInstance(conn, sql);
        return instance;
    }
    //返回数据表中数据的条目数
    @Override
    public Long getCount(Connection conn) {
        String sql="select count(1) from customers";
        Object value = getValue(conn, sql);
        return (Long) value;
    }
    //返回数据表中最大的生日
    @Override
    public Date getMaxBirth(Connection conn) {
        String sql="select max(birth) from customers";
        Object value = getValue(conn, sql);
        return (Date) value;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4 回合游戏项目 17- 进入指定区域触发战斗事件

在上一节&#xff08;UE4 回合游戏项目 16- 控制玩家&#xff09;基础上&#xff0c;增加角色走进指定区域从而触发战斗场景的功能 主要思想是添加一个碰撞区域&#xff0c;当玩家与该区域碰撞时&#xff0c;触发战斗事件 效果&#xff1a; 步骤&#xff1a; 1.新建蓝图类 选…

循环检测算法(哈希,双指针)

文章目录快乐数环形链表环形链表II快乐数 寻找快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环…

简明 Python 教程

文章目录参考书籍1、安装和输出2、注释3、常量和变量4、格式化方法5、案例&#xff1a;使用变量与字面常量6、运算符7、数值运算与赋值的快捷方式8、计算命令9、if 语句10、while 语句11、for 循环12、break 语句13、continue 语句14、函数15、函数参数16、局部变量17、**globa…

记一次G1垃圾回收线上调优的实践

背景 有个项目最近上线了&#xff0c;为了避免后面访问量突增引发不可预知的问题&#xff0c;按照惯例需要进行压测。我选取了几个请求比较频繁的接口进混合压测&#xff0c;发现了一个性能瓶颈&#xff0c;是垃圾回收配置不合理导致的。 我使用的是G1垃圾回收策略。 正文 …

log4j日志漏洞问题

去年&#xff0c;log4j被爆出了一个漏洞&#xff0c;说可以通过利用日志格式化中的远程注入控制主机。当时&#xff0c;这个漏洞被形容为史诗级漏洞&#xff0c;因为这个远程操作可以执行一些操作&#xff0c;如果这个操作有恶意&#xff0c;那么就可以干任何事情&#xff0c;其…

jsonp介绍

为什么要知道jsonp&#xff0c;jsonp的作用是什么&#xff1a; Jsonp(JSON with Padding) 是 json 的一种"使用模式"&#xff0c;可以让网页从别的域名&#xff08;网站&#xff09;获取资料&#xff0c;即跨域读取数据。原则上浏览器是不允许请求不同域名的数据的&…

知识付费小程序的作用_知识付费小程序有哪些功能

在线知识付费产业的主要业务逻辑是基于用户的主动学习需求&#xff0c;为其提供以跨领域基础知识与技能为核心的在线知识服务&#xff0c;提升其达到求知目的的效率。公众号和小程序的迅速发展&#xff0c;又为知识付费提供了技术支持&#xff0c;从而促进了行业的进一步发展。…

skywalking部署

一.到apache 上下载 skywalking的git上下载包&#xff0c;选择对应的版本 Downloads | Apache SkyWalking 二.选择完后会跳转到对应的apache下载地址&#xff0c;点击下载 Apache Downloads 三.将下载好的压缩包进行解压&#xff0c;我下载的是8.8.1版本 tar -xf apache-sky…

C++11初篇(快速了解)

文章目录1. C11简介2. 统一的列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list3. 声明3.1 auto3.2 decltype3.3 nullptr4 范围for循环1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C1…

爱婴室主要股东再现减持:莫锐伟、王云亦是如此,业绩表现不理想

一波刚平&#xff0c;一波又起。 11月15日&#xff0c;爱婴室&#xff08;SH:603214&#xff09;发布《关于持股5%以上股东减持股份计划公告》&#xff0c;称该公司持股16.09%的股东合众投资拟通过集中竞价、及/或大宗交易方式减持持有的公司股份不超过843.1015万股&#xff0…

基于Java+JSP+MySQL基于SSM的物流公司物流订单管理系统-计算机毕业设计

项目介绍 随着我国经济的高速增长&#xff0c;物流快递的数量也在不断的增加&#xff0c;同时面临的就是如何更加方便快捷和高效的管理物流订单的问题&#xff0c;传统模式的物流订单管理模式明显已经不能够满足当下的需求&#xff0c;于是我们提出了基于B/S的贴心物流公司物流…

leetcode118 -- 杨辉三角

文章目录一. 问题描述示例 1示例 2提示二. 解决问题主函数&#xff1a;法一&#xff1a;递归1. 解题思路2. 解题代码法二&#xff1a;动态规划1. 解题思路2. 解题代码法三&#xff1a;暴力破解1. 解题思路2. 解题代码一. 问题描述 给定一个非负整数 numRows&#xff0c;生成「…

案例驱动,手把手教你学PyTorch(一)

通过案例学PyTorch。 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 介绍 PyTorch是增长最快的深度学习框架&#xff0c; Fast.ai在其 MOOC、Deep Learning for Coders及其库中也使用了它。 PyTorch 也非常Python 化&#xff0c;也就是说&am…

ubuntu18.04编译GB28181Server

目录一、简绍二、项目依赖的第三方库2.1 jrtplib2.1.1 编译JRTPLIB2.2 mxml2.2.1 编译mxml2.3 osip2/exosip22.3.1 编译osip22.3.2 编译exosip22.4 ffmpeg2.5 提示三、修改GB28181Server3.1 修改GB28181Server.pri3.2 修改AppConfig.cpp3.3 修改GB28181Server.cpp3.4 修改RtpRe…

Java 查漏补缺

文章目录1. Rest风格# 传统访问# Rest风格# Restful开发中的注解介绍2. controller中路径参数3. 约束Controller中方法的请求类型4. 视图跳转5. java.sql.Date 和 java.util.Date 的联系和区别6. 使用 Slf4j 日志7.定时任务81. Rest风格 Rest也叫做范文资源的形式&#xff0c;…

最简单的git图解(系列一)

git clone: 这个命令用于将远程代码仓库克隆到本地&#xff0c;这是对任何项目进行开发前的第一步。 比如你本地本来并没有某个项目的代码仓库&#xff0c;此时随便找一个文件目录并进入cmd命令窗口&#xff0c;执行命令git clone [remote address]&#xff0c;[remote addres…

SQL 50 题(MySQL 版,包括建库建表、插入数据等完整过程,适合复习 SQL 知识点)

目录1.建库建表2.插入数据3.SQL 50 题3.1.SQL 01——查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.2.SQL 02——查询"01"课程比"02"课程成绩低的学生的信息及课程分数3.3.SQL 03——查询平均成绩大于等于 60 分的同学的学生编…

SMP多核启动(一):spin-table

前言 看这篇文章&#xff0c;你必备的一些前置知识有如下 1、ATF启动流程 2、PSCI电源管理的概念 3、设备树 如果没有&#xff0c;可以去我的专栏目录下逛逛&#xff0c;会有所收获。 1、SMP是什么&#xff1f; SMP 英文为Symmetric Multi-Processing &#xff0c;是对称多…

Vscode环境下的PyQt

一、环境配置 ①在Conda控制台下执行以下两条命令&#xff0c;添加开发环境 pip install PyQt5 pip install PyQt5-Tools ②找到designer.exe并运行 文件在哪网上说法千奇百怪&#xff0c;我建议还不如装个everything直接在C盘做全局搜索来得快&#xff0c;实在不想装的话可以…

C轮累积融资1亿美金 禾多科技如何靠自我造血能力赢得资本青睐?

自动驾驶当前在全球范围内受到广泛关注&#xff0c;是汽车行业正在集中力量攻克的新领域。据英特尔预计&#xff0c;2050年仅自动驾驶汽车的市场规模将达到7万亿美元。引得资本和科技巨头们纷纷“下注”。 近日&#xff0c;全栈自动驾驶科技公司禾多科技宣布&#xff0c;已完成…