JDBCToolV1:

package com.dgd.test;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties; public class JDBCToolsV1 { public static DataSource ds;
//静态代码块,创建数据库连接池
static {
try {
Properties p=new Properties();
p.load(JDBCToolsV1.class.getClassLoader().getResourceAsStream("druid.properties"));
ds= DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
} public static Connection getConnection(){
//方式1: DriverManger.getConnection();
//方式2: 数据库连接池, ds.getConnection();
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
} public static void free( Connection conn){
try {
if(conn!=null)
{
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} //增删改,不能处理事务
public static int update1(String sql, Object...args) throws SQLException {
//获取连接
Connection conn= getConnection();
//创建PreparedStatement对象
PreparedStatement ps= conn.prepareStatement(sql);
//设置 ?
if(args!=null&& args.length>0)
{
for (int i = 0; i <args.length ; i++) {
ps.setObject(i+1,args[i]); }
}
//执行sql
int len=ps.executeUpdate();
//关闭
ps.close();
free(conn); return len;
}
  
  //处理事务的公共部分
public static int update2(Connection conn, String sql, Object... args) throws SQLException {
PreparedStatement ps=conn.prepareStatement(sql);
if(args!=null && args.length>0)
{
for (int i = 0; i <args.length ; i++) {
ps.setObject(i+1,args[i]);
}
}
int len=ps.executeUpdate();
ps.close();
return len;
} }

Test:

package com.dgd.test;

import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException; public class TestJDBCToolV1 {
@Test
public void test1(){
try {
String sql="INSERT INTO COURSE VALUES(NULL,?)";
int len=JDBCToolsV1.update1(sql,"天文");
System.out.println(len>0?"成功":"失败");
} catch (SQLException e) {
e.printStackTrace();
}
} @Test //处理事务,不能使用update1,因为update1中每次都是获取一个数据库连接对象,不能保证事务的ACID
public void test() throws SQLException {
String sql1="INSERT INTO COURSE VALUES(NULL,?)";
String sql2="INSERT INTO COURSE VALUES(NULL,?)";
Connection conn= JDBCToolsV1.getConnection();
conn.setAutoCommit(false); try {
int len1=JDBCToolsV1.update2(conn,sql1,"美术");
int len2=JDBCToolsV1.update2(conn,sql2,"体育");
if(len1>0 && len2>0)
{
conn.commit();
}
else
{
conn.rollback();
}
} catch (SQLException e) {
conn.rollback();
}
conn.setAutoCommit(true);
JDBCToolsV1.free(conn); } }

JDBCTools 第一个版本的更多相关文章

  1. CINATRA发布第一个版本

    cinatra是什么? cinatra是C++开源社区–purecpp发起的一个开源项目,现在正式发布第一个版本cinatra0.9.0,cinatra是一个现代C++写的web framework, ...

  2. 第一个版本库 Repository

    Git安装 Windows系统 Git 为 Windows 系统提供了简易的 .exe 安装包, 直接下载并安装就可以了(点这里->):https://git-scm.com/download/ ...

  3. CDNDrive 第一个版本发布 & 布客新知第二次备份完成

    CDNDrive 第一个版本发布,新适配五个图床 https://github.com/apachecn/CDNDrive 另外,布客新知第二次备份完成 TutorialsPoint:http://i ...

  4. 总结一下我的dmp第一个版本 也是最后一个版本

      刚刚接手了一个新项目-DMP,目前已经开发联调完成,等待测试上线,所以现在来总结一下. 本来是一个前辈在负责,四月底离职了,他离职前我花了一周把这个项目交接了过来,大致熟悉了项目的业务流程以及代码 ...

  5. 吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本

    有空就要慢慢练起~~~~脑袋动起来是很快乐的事儿....:) <易学PYTHON>演练一遍. from random import choice cave_numbers = range( ...

  6. MVAPI第一个版本架构图

    MVAPI采用矢量与栅格结合的方式进行移动地图的显示. 进过几个月,目前终于可以完成基本的地图显示及操作功能.还有待实现的是各种性能及效果优化.3D地物等. 发一个1.0的架构图留存一下.(虽然目前还 ...

  7. 轻量级ORM《sqlcommon》第一个版本发布了!!!

    一.sqlcommon的特色 1. 轻量级,整个包只有123kb. 2. 性能好,自测... 3. API和功能简单.代码简短.可维护性好基本都能看懂.这个点我认为很重要,你不用为了实现一个需求而四处 ...

  8. lms框架即将发布第一个版本了

    lms微服务框架介绍 LMS框架旨在帮助开发者在.net平台下,通过简单的配置和代码即可快速的使用微服务进行开发. LMS通过.net框架的主机托管应用,内部通过dotnetty/SpanNetty实 ...

  9. Nova PhoneGap框架 第一章 前言

    Nova PhoneGap Framework诞生于2012年11月,从第一个版本的发布到现在,这个框架经历了多个项目的考验.一直以来我们也持续更新这个框架,使其不断完善.到现在,这个框架已比较稳定了 ...

随机推荐

  1. vscode golang 不能自动补全问题

    问题描述: 使用vscode编辑go语言时,有时候会莫名其妙的代码不能自动补全,struct的属性值不能自动提示,这时候如果重新启动vscode也没有效果,就可能是gocode插件出了问题或者有了更新 ...

  2. XCTF练习题---MISC---再见李华

    XCTF练习题---MISC---再见李华 flag:Stay hungry, Stay foolish. 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一张图片,其中有MD5,破解一下没有 ...

  3. Vue报错: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'protocol')

    Vue报错: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'protocol') 报错信 ...

  4. 流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?

    大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友. 做业务开发,需要考虑业务的扩展性.做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务 ...

  5. 图的连通性--Tarjan算法

    一些概念 无向图: 连通图:在无向图中,任意两点都直接或间接连通,则称该图为连通图.(或者说:任意两点之间都存在可到达的路径) 连通分量: G的 最大连通子图 称为G的连通分量. 有向图 (ps.区别 ...

  6. JOISC2020 题解

    Day1T1 建筑装饰4 题目链接:Day1T1 建筑装饰4 Solution 我们先考虑朴素的\(dp\)方法: 设\(dp_{i,j,k}\)表示前\(i\)个数中,选了\(j\)个\(B\)数组 ...

  7. 服务器安装mysql遇到的坑

    服务器安装mysql遇到的坑 一.CentOS7安装MySQL 1.下载:MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mys ...

  8. 关于mybatis的应用

    导入依赖 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifact ...

  9. java基础题(3)

    5.面向对象 5.1封装 5.1.1修改Data类的定义 描述 现有一个Data类,内部定义了属性x和y,在main方法中实例化了Data类,并计算了data对象中x和y的和.但是,Data类的定义存 ...

  10. django框架6

    内容概要 神奇的双下划线查询 外键字段的创建 外键字段操作 多表查询 基于对象的跨表查询 基于双下划线的跨表查询 双下线查询扩展 如何查看SQL语句 内容详情 神奇的双下划线查询 1.查询年龄大于20 ...