JDBC笔记-李伟杰版

JDBC 03

2019/8/1 9:51:41


笔记网站

全球加速:   http://zaixianke.com
北京节点:   http://itdage.cn

JDBC 事务 ***

在dos命令行操作oracle时 , 执行DML , 需要结束事务 (commit提交 或 rollback回退)
在JDBC中, 事务是自动提交的, 每执行一条DML语句, 事务就自动提交一次. 

我们可以通过JDBC的事务API , 开始事务的手动提交, 将多条DML语句看作一个整体, 要么一起成功, 要么一起失败.

JDBC事务操作格式:

注意: 开启事务的手动提交 ,是通过连接对象完成的. 某个数据连接对象的事务开启手动提交后, 这个连接对象的事务需要手动控制.  其他连接对象不受影响.

操作方法:
1. 开始事务的手动提交:
conn.setAutoCommit(boolean flag);
参数含义: true表示自动提交 . false表示手动提交.

2.  提交事务:conn.commit();3.  回退事务:rollback();

事务案例:

    public class Demo {public static void main(String[] args) throws Exception {//1.    加载数据库的驱动Class.forName("oracle.jdbc.OracleDriver");//2.    获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "123");//2.1   设置连接对象的事务 为 手动提交conn.setAutoCommit(false);//3.    开始描述逻辑System.out.println("金刚: 转账中...");//3.1   减少金刚账户的余额 500 | 3.1.1   预编译SQL执行环境PreparedStatement state = conn.prepareStatement("update user33 set money=500 where id=2");//3.1.2 执行SQL语句boolean success = state.executeUpdate()>0?true:false;if(success) {System.out.println("后台逻辑: 金刚余额减少完毕.");if(1==2) {conn.rollback();throw new RuntimeException("后台服务器... 停电了");}//3.2   增加豪杰账户的余额 500 //3.2.1 预编译SQL执行环境PreparedStatement state2 = conn.prepareStatement("update user33 set money=600 where id=1");//3.2.2 执行SQ语句boolean success2 = state2.executeUpdate()>0?true:false;if(success2) {System.out.println("后台逻辑: 豪杰余额增加完毕");conn.commit();}state2.close();}state.close();}
}

批处理 了解

将多条SQL语句 放到一起批量处理.

批处理将多次对于数据库的操作次数 , 减少到了一次 ! 提高了大量SQL语句一起执行时的性能.

使用步骤:

批处理使用Statement类操作步骤1.    将一条SQ语句加入到批处理中statement.addBatch(String sql);步骤2.    执行批处理中的所有语句statement.executeBatch();

批处理案例:

    //1.    加载数据库的驱动Class.forName("oracle.jdbc.OracleDriver");//2.    获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "123");//3.    创建SQL的执行环境Statement state = conn.createStatement();//4.    加入SQL语句 到批处理中for(int i=0;i<1000;i++) {state.addBatch("insert into user33 values(SEQ_USER33_ID.NEXTVAL,'name"+i+"',1000)");}//5.    执行批处理state.executeBatch();state.close();conn.close();System.out.println("执行完毕");

连接池 *

概述 熟悉

由连接池创建连接, 维护连接 
我们需要使用连接时, 从连接池中获取连接. 
如果池中存在空闲连接, 则拿去使用. 
如果不存在空闲连接, 且池未满 , 则在连接池中创建新的连接使用.
如果不存在空闲连接, 且池已满 , 则排队等待空闲连接.

Properties 文件 与 类 熟悉

properties文件 常用于Java中的配置文件.
因为Properties文件 可以快速的 与 Properties类 进行转换.    

文件:
注释: #开头表示注释行
键值对: 键与值之间使用等号连接, 多个键值对之间使用换行分割

如何将一个Properties文件, 转换为java中的Map集合对象:

步骤:1.  创建Properties对象Properties ppt = new Properties();          2.  得到Properties文件的字节输入流InputStream is = //可以通过new FileInputStream , 也可以通过ClassLoader 等等3.  将流加载到Properties对象ppt.load(is);

使用步骤: *

1.  引入相关的jar文件-   dbcp    :   连接池的代码-   poll    :   连接池的依赖库
  1. 创建一个properties文件, 描述连接池的配置 , 内容如下:
    #数据库连接地址
    url=jdbc:oracle:thin:@localhost:1521:XE
    #数据库驱动地址
    driverClassName=oracle.jdbc.OracleDriver
    #数据库帐号
    username=system
    #数据库密码
    password=123

    #扩展配置:
    #初始化连接池时, 创建的连接数量:
    initialSize=5
    #最大允许存在的连接数量
    maxActive=200
    #空闲时允许保留的最大连接数量
    maxIdle=10
    #空闲时允许保留的最小连接数量
    minIdle=5
    #排队等候的超时时间
    maxWait=20000

  2. 将properties文件, 转换为Properties对象.
    Properties ppt = new Properties();
    ppt.load(文件输入流);

  3. 通过连接池工厂类(BasicDataSourceFactory) , 创建连接池对象 (一次程序启动, 创建一个连接池就够了.)
    DataSource ds = BasicDataSourceFactory.createDataSource(ppt);

  4. 通过连接池对象, 获取池中的连接
    Connection conn = ds.getConnection();

  5. 正常JDBC操作

连接池案例:*

    //3.    将properties文件 转换为Properties对象Properties ppt = new Properties();//4.    加载文件的输入流InputStream is = Demo.class.getClassLoader().getResourceAsStream("dbcp.properties");//空指针异常ppt.load(is);//5.    通过工厂类, 创建连接池DataSource ds = BasicDataSourceFactory.createDataSource(ppt);//6.    通过连接池, 获取其中的连接 , 并使用Connection conn = ds.getConnection();//正常的JDBC操作PreparedStatement state = conn.prepareStatement("insert into user33 values(seq_user33_id.nextval,'嘿嘿嘿',188)");int count = state.executeUpdate();System.out.println(count>0?"数据插入成功":"数据插入失败");

DBCPUtil工具类 *

public class DBCPUtil {
private static DataSource dataSource;static {//在类加载时, 读取配置文件, 配置连接池//1.    创建Properites对象Properties ppt = new Properties();//2.    读取配置文件, InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream(&quot;dbcp.properties&quot;);//3.    将配置文件 加载到Properties对象中try {ppt.load(is);//4.    通过连接池工厂类, 创建连接池dataSource = BasicDataSourceFactory.createDataSource(ppt);} catch (Exception e) {e.printStackTrace();}
}/*** 用于从连接池中 获取一个连接对象* @return 连接对象 , 如果获取失败返回null*/
public static Connection getConnection() {try {return dataSource.getConnection();} catch (Exception e) {e.printStackTrace();return null;}
}
/*** 用于释放资源* @param conn  连接对象* @param state 执行环境* @param result 结果集*/
public static void close(Connection conn , Statement state ,ResultSet result) {if(result!=null) {try {result.close();} catch (SQLException e) {e.printStackTrace();}}if(state!=null) {try {state.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

}

数据库优化 *

1.  在进行表格查询时 , where子句中的条件执行顺序是从左至右 , 清除数据量较大的条件应该放在左边.(特别注意: 笛卡尔积消除条件必须放在最左边)
  1. 在进行表格查询时 , 列名列表应避免使用号 ! 数据库在执行查询操作时, 会先将号展开, 转换为所有的列名, 再进行查询.

  2. 在进行表格查询时 , 能使用where条件筛选的数据, 应尽量避免使用having子句来筛选. 因为where条件执行在having之前 , 在早期筛选掉大量数据, 可以让程序执行的更顺畅.

  3. 在进行多表查询时 , 查询的表顺序是从右至左的. 应把表中数据量最少的表放在查询的最右边.

  4. 在进行多表查询时 , 应尽可能的给所有的表添加别名, 能明确的区分有冲突的列.

  5. 在使用事务时 , 应尽量多的commit , 尽量早的commit ! 原因是: 事务在未提交时, 数据库会耗费大量的内存 , 来缓存未提交的SQL结果 !

  6. 尽可能多的使用函数 来提高SQL执行的效率.

  7. SQL语句编写时, 除字符串以外 , 应使用大写字母 ! 因为SQL语句执行时, 会先将小写字母 转换为 大写字母, 再执行.

  8. 应尽可能少的访问数据库 (多次数据访问的结果可能相同, 如果缓存起来 ,可以提高程序的执行效率)

  9. 在索引列上 , 尽可能避免使用not来判断. not关键字如果判断了索引列 , 会导致此次查询索引失效 , 转而使用全表扫描的方式查询.

  10. 在索引列上, 不能使用算数运算 , 算数运算也会导致索引列使用, 使用全表扫描的方式进行查询.

  11. 在查询数据时, 如果需要使用>或<的条件, 应替换为>= 或 <= !
    原因是>和<符号 , 查询时, 是按照>= 和 <= 进行查询, 然后在撇去=的结果.

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

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

相关文章

局域网网络风暴检测工具_【思唯网络学院】从原理到配置,最全的VLAN说明就在这了!...

有关VLAN的技术标准IEEE 802.1Q早在1999年6月份就由IEEE委员正式颁布实施了&#xff0c;而且最早的VLNA技术早在1996年Cisco(思科)公司就提出了。随着几年来的发展&#xff0c;VLAN技术得到广泛的支持&#xff0c;在大大小小的企业网络中广泛应用&#xff0c;成为当前最为热门的…

SQL server 基本语句

--查询数据库是否存在 if exists ( select * from sysdatabases where [name]TestDB) print Yes, the DB exists else print No, need a new one? --新建一个数据库 create database TestDB on ( name TestData, filename G:\DBS\KeyTest.mdf, size 3, filegrowth 2 ) log…

pythonselenium模拟登陆爬取信息_python3 使用selenium模拟登陆天眼查抓取数据

由于之前用Scrapy 抓了一些公司的名称&#xff0c;但是没有准确的联系方式&#xff0c;所以就自己就学习了一下使用selenium自动化工具&#xff0c;速度比较慢&#xff0c;网上也有很多这方面的代码&#xff0c;但是大部分的网页解析部分都出错了&#xff0c;可能是这种网站定时…

mp4格式

下面的软件下载地址&#xff1a;http://download.csdn.net/source/2607382 ftyp: 这是一个筐&#xff0c;可以装mdat等其他Box。 例&#xff1a;00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 02 00 6D 70 34 31 语义为&#xff1a;ftyp: Major brand: isom Minor version: 5…

PyQt5案例汇总(简洁版)

01菜单栏 import sys from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):exitAct QAction(QIcon(exit.png), &Exit,…

个人关于浮动的理解

浮动带来的影响&#xff1a; ①. 能够让浮动之后的元素布局产生混乱 &#xff08;元素浮动后脱离了标准文档流&#xff0c;它的布局也就不再遵循标准文档流的规则&#xff0c;多个浮动元素在一起的时候就会随着窗口的变化而变化&#xff0c;也就失去了稳定的布局&#xff09; ②…

接口测试 rest-assured 使用指南

转载&#xff1a;https://testerhome.com/topics/7060 原文&#xff1a;https://github.com/rest-assured/rest-assured/wiki/Usage本文github地址&#xff1a;https://github.com/RookieTester/rest-assured-doc 注意&#xff0c;如果您正在使用1.9.0或者更早的版本请参考旧文…

python中格式化字符串的作用_python中字符串格式化的意义(化妆)

格式 描述%%百分号标记 #就是输出一个%%c字符及其ASCII码%s字符串%d有符号整数(十进制)%u无符号整数(十进制)%o无符号整数(八进制)%x无符号整数(十六进制)%X无符号整数(十六进制大写字符)%e浮点数字(科学计数法)%E浮点数字(科学计数法&#xff0c;用E代替e)%f浮点数字(用小数点…

MongoDB的快速手动安装

就是关于MongoDB主从库的安装配置和启动。网上关于MongoDB的安装有大量的文章供大家学习。我这里提供一个Windows环境下MongoDB主从库的快速手动安装的方法&#xff0c;只需要三步即可。 先下载的安装包&#xff0c;解压缩后找到bin文件夹&#xff0c;将bin文件夹拷贝至你自己的…

MP4音频解码信息

文章转载自&#xff1a;http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者&#xff0c;编辑&#xff1a;小乙哥 MP4文件格式分为头部和数据两部分&#xff0c;头部是由许多被称作Atom的结构单元嵌套或排列而成&#xff0c;数据部分则完全为实际数据…

时序图 分支_UML用例图

UML用例图用例图有以下东东:用例参与者关联系统边界用例使用椭圆来表示&#xff0c;椭圆里边写上用例的名称:这里的用例可以理解为一个动作或行为,或者一个对象。参与者用一个小人儿,在小人儿下面写上参与者名称,例如学生:关联用一条线表示:把很多个用例放到一个大的矩形框里。…

Python脚本实现汉子转拼音

起步 中华文化博大精深&#xff0c;是中华民族的财富&#xff0c;吸收和继承发扬中 华文化&#xff0c;是现代每个炎黄子孙无可推卸的天职。 今天小编就交大家用python写一个脚本,实现汉子和拼音之间的转换 pinyin.py 汉字转拼音,With Python Example: from pinyin impor…

MySQL innodb_table_stats表不存在的解决方法

在做实验时&#xff0c;使用mysqldump命令报错[rootlinux-mysql02 3306]# mysqldump -uroot -p123456 -S /u02/data/3306/mysql.sock -A -B --events | gzip > /opt/rep.sql.gzmysqldump: Got error: 1146: Table mysql.innodb_index_stats doesnt exist when using LOCK TA…

自定义封装 banner 组件

1. 效果图预览 2.基本功能 一个简单方便的轮播图组件&#xff0c;基于viewpager 基础上进行的封装。可设置 项目中图片&#xff0c;网络图片&#xff0c; View&#xff1b;支持循环自动播放&#xff0c;手势滑动切换&#xff0c;item点击事件,可设置 点点的样式宽高、颜色、大小…

vb.net服务器启动后cpu占用了70_记一次服务器被异常程序占用的解决过程(怀疑黑客攻击)...

最近在跑实验&#xff0c;但是突然发现程序运行变慢&#xff0c;然后top命令查看程序运行情况&#xff0c;发现有异常进程&#xff0c;名字叫 bash&#xff0c;占用 2400% CPU计算资源。刚开始怀疑是挖矿程序&#xff0c;因实验室网络IP为教育网公网&#xff0c;怀疑被攻击&…

3gp文件格式研究 (转windcao的专栏)

序言 06我开始做3gp文件的播放器,但是关于3gp的文档太少了也很难找,在网友luxh的帮助下,我终于有了第一份关于3gp文件格式的文档《ISO/IEC 14496-12&#xff0c;ISO媒体文件格式》.在此真心感谢luxh的贡献.当然了是英文版的,有文档就不错了.为了便于查阅和理解,我把之后陆续找…

Android开发必用工具及其进阶途径

三百六十行&#xff0c;行行出状元&#xff0c;怎么样才能在Android行业中当个状元了&#xff0c;开发过程中的高效、自我能力的提升显得至关重要&#xff0c;步入IT行业更是要时时刻刻学习&#xff0c;新技术更新快&#xff0c;今天将介绍一下Android开发中必用工具及其进阶途…

MySQL遇到check the manual that corresponds to your MySQL server version for the right syntax错误

原来是MySQL表中不能包含关键字 转载于:https://www.cnblogs.com/flycoding/p/7088465.html

Python脚本实现图片加水印

起步 图片是指由图形、图像等构成的平面媒体,有形式的事物&#xff0c;我们看到的&#xff0c;是图画、照片、拓片等的统称。 为了保护一些原创图片的版权,某些时候我们需要在图片上面,加上水印,当然你可以用Photoshop来做,只不过如果图片数量过多,亦或者图片的动态生成的时候…

yarn 怎么查看有多个job在跑_flink on yarn 模式下提示yarn资源不足问题分析

背景在实时计算平台上通过YarnClient向yarn上提交flink任务时一直卡在那里&#xff0c;并在client端一直输出如下日志&#xff1a;(YarnClusterDescriptor.java:1036)- Deployment took more than 60 seconds. Please check if the requested resources are available in the Y…