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

JDBC笔记-李伟杰版相关推荐

  1. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  2. 浪潮式发售实操笔记(中国版)

    浪潮式发售实操笔记(中国版) 覃小龙 中国互联网权威营销专家 沃克其人 产品发售公式的发明人叫杰夫·沃克,一个精彩的吊丝逆袭人生,他堪称互联网赚钱速度最快的人,目前是亚马逊创始人贝佐斯的创业教练. 杰 ...

  3. 人工智能导论笔记——江湖救急版

    人工智能导论笔记--江湖救急版 Powered by DZY 以下部分图片来源于老师课件,仅供学习交流使用,侵权致删! 一.绪论 感觉并无考点,列出提纲 人工智能的基本概念 人工智能的发展简史 人工智 ...

  4. 软件质量保证与测试笔记——江湖救急版

    软件质量保证与测试笔记--江湖救急版 Powered by DZY 以下部分图片来源于老师课件,仅供学习交流使用,侵权致删! Ch1 软件质量与测试概念 软件质量的定义 软件质量是"反映实体 ...

  5. Redis 设计与实现 读书笔记(菜鸟版)

    Redis 设计与实现 读书笔记(简略版) 写在前面 第一章(内部数据结构) SDS List Dictionary Rehash Rehash 与 COW 渐进式Rehash 字典收缩 Skipli ...

  6. 数值分析思考题(钟尔杰版)参考解答——第七章

    数值分析思考题(钟尔杰版)参考解答--第七章 1. 第一型曲线积分的左矩形公式和右矩形公式有何区别? 2. 简单梯形公式与两点线性插值公式是如何联系的? 3. 插值型求积公式与插值公式是如何联系的? ...

  7. Java中如何创建自定义的注解学习笔记(MD版)

    概要 Java中如何创建自定义的注解学习笔记(MD版). 博客 博客地址:IT老兵驿站. 前言 记得这篇笔记还是在泉州的龙玲酒店记录的,是一个周六的晚上,坐飞机从上海到泉州,从笔记中能勾起一些旅游的回 ...

  8. 数值分析思考题(钟尔杰版)参考解答——第八章

    数值分析思考题(钟尔杰版)参考解答--第八章 题目: 1. 人口模型中马尔萨斯模型与逻辑斯模型有何区别? 2. 牛顿谐振动和小阻尼振动的微分方程之间有何区别和联系? 3. 单摆的常微分方程如何求近似解 ...

  9. 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版

    原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...

最新文章

  1. 我是怎么读源码的,授之以渔
  2. cocos2d-x环境配置和常见问题
  3. P4245 【模板】任意模数NTT
  4. Android7.1选择时区由默认的GMT+00:00改为GMT+08:00中国标准时间
  5. word2vect 输出是什么
  6. Servlet的PrintWriter out = response.getWriter()使用
  7. 【Python爬虫】知识点简单总结
  8. c语言共享内存,在爷儿俩进程间使用共享内存(共享内容含指针)
  9. 【C语言重点难点精讲】C语言文件
  10. 贝叶斯网的R实现( Bayesian networks in R)bnlearn(3)
  11. elementUI select组件value值注意事项
  12. WPF 加载Gif动态图片的方法
  13. web项目上云_披荆斩棘向云端 — 职能业务上云踩坑实战
  14. Python自动化处理和分析Excel数据的基本方法
  15. 微信 html自动加载js,微信小程序实现图片预加载组件
  16. [CF1421E]Swedish Heroes
  17. 阿里巴巴离职DBA 35岁总结的职业生涯(转)
  18. Maya: Rendering with Arnold 5 Maya教程之Arnold5渲染 Lynda课程中文字幕
  19. 使用Java进行简单的DDos攻击(手动滑稽!!)
  20. C#使用itextsharp生成PDF文件

热门文章

  1. 哪些人不能要 哪些人不能留
  2. 创业必经之路——Paul Graham创业曲线
  3. 多媒体视频知识入门贴zt(一)
  4. 集合拷贝通用方法、list<A> 转换成 list<B> (属性相同)
  5. Node.js -- Stream 使用小例 ( 流运用 :读取、写入、写出、拷贝)
  6. 使用SpringBoot yml配置文件
  7. asp.net ajax的学习第一篇
  8. H3C 以太网集线器
  9. 轻量高效的开源JavaScript插件和库 【转】
  10. 【转】 JMeter学习(二十四)linux启动jmeter,执行./jmeter.sh报错解决方法