JavaSE--jdbc编程
JDBC全称为:Java Data Base Connectivity (java数据库连接),可以为多种数据库提供统一的访问。JDBC是sun开发的一套数据库访问编程接口,是一种SQL级的API。它是由java语言编写完成,所以具有很好的跨平台特性,使用JDBC编写的数据库应用程序可以在任何支持java的平台上运行,而不必在不同的平台上编写不同的应用程序,功能类似于windows操作系统提供的ODBC服务,目前主流的数据库操作框架都是以JDBC为基础进行开发的,所以JDBC是JAVA连接数据以及操作的基础入口。
一、连接数据库
1.导入驱动jar包
2.连接数据库
①加载驱动程序:Class.forName(driverClass) //将类加载到内存中
加载mysql驱动:Class.forName("com.mysql.jdbc.Driver");
加载oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
②获得数据库连接
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db",u ser,password);
DriverManager.gerConnection(URL,user,password);
③创建Statement对象:conn.createStatement();
④向数据库发送SQL命令
⑤处理数据库的返回结果(ResultSet类)
二、事务Transaction(ACID)
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么完全执行要么一个都不执行。对于数据库来说事务是对数据操作的一种确认手段,以保证数据库操作的正确性。对于事务来说它存在的条件是一个相同数据库连接,所以保证事务的前提是提供一个一致的数据库连接。
1.事物的特性
①原子性(Atomicity)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
②一致性(Consistency)
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
③隔离性(Isolation)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
④持久性(Durability)
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
2.事务的隔离级别
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交(Read Uncommitted) |
√ |
√ |
√ |
读已提交(Read Committed) |
× |
√ |
√ |
可重复读(Repeatable Read) |
× |
× |
√ |
可串行化(Serializable) |
× |
× |
× |
3.事务执行操作
Connect.setAutoCommit(false); //关闭SQL自动提交,开启事务
Connect.commit(); //提交事务
Connect.rollback(); //回滚事务
三、常见问题
1.SQL注入
SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
①防护手段
对用户提交的数据进行安全性验证,数据合法才能提交到服务器,其次是尽量不使用Statement对象处理SQL语句,不使用动态生成的的SQL拼接语句,尽量使用能对SQL语句进行预编译的PrepareStatement对象处理SQL语句。
2.日期存储
在JDBC中使用java.sql.Date类型来才做日期,它继承与java.util.Date,它是一种为数据库存储日期而设计的一种类型,所以要向数据库直接保存日期格式的话就需要将日期类型做相应的转换,当然使用日期浮点数表示来存储当前具体时间也是合理的,而且数据较为精确。
3.大数据长文本存储
对于一般的字符串存储使用VARCHAR足以应付,但对于超大的字符串文本使用VARCHAR就不太合理了,此时应当使用数据库的CLOB类型保存超大型文本,使用setCharacterStream()设置文本字符流到数据库,使用getClob()方法取出Clob对象,然后再取出流转为字符串对象。
对于超大的二进制数据一般使用Blob类型进行保存,使用字节输入输出流对数据进行存取操作,使用setBinaryStream()方法设置数据到数据库,使用getBlob取得Blob对象,取得输出流即可读出数据。
4.批处理操作
对于短时间内进行的大量数据操作不应该多次的访问数据库,应该将所有的数据操作指令结合在一起后统一对数据库进行操作,使用PreparedStatement的addBatch()将数据循环封装到Statement当中,最后用PreparedStatement的executeBatch()执行所有的操作。
5.可更新和可滚动的结果集
①取得结果集
Statement s = conn.createStatement(type,concurrency);
PreparedStatement s =conn.preparedStatement(command,type,concurrency);
type |
TYPE_FORWARD_ONLY |
结果集不能滚动(默认值) |
TYPE_SCROLL_INSENSITIVE |
结果集可以滚动,但对数据库变化不敏感 |
|
TYPE_SCROLL_SENSITIVE |
结果集可以滚动,对数据库变化敏感 |
|
concurrency |
CONCUR_READ_ONLY |
结果集不能用于更新数据库(默认值) |
CONCUR_UPDATABLE |
结果集可以用于更新数据库 |
②滚动操作
- 向后滚动:rs.previous();如果游标位于一个实际的行上,那么该方法将返回true;如果游标位于第一行之前,那么就返回false;
- 将游标向后或向前移动多行:rs.relative(n);n为正数,向前移动;或负数,向后移动;n为0,不移动;
- 将游标设置到指定的行号上:rs.absolute(n);
- 调用以下方法将返回当前行的行号:int curRow = rs.getRow();
- 结果的第一行是1,而不是0;如果返回0,那么当前游标不在任何行上,它要么位于第一行前,或最后一行之后;(干货——可滚动结果集的第一行的index是1,而不是0)
- 其他操作:first,last,beforeFirst,afterLast方法,与isFirst ,isLast, isBeforeFirst,isAfterLast方法;
③更新操作
并非所有的查询都会返回可更新的结果集,如果查询涉及多个表的连接操作,那么它所产生的结果集将是不可更新的,可以调用 ResultSet 接口中的 getConcurrency方法来确定结果集是否是可更新的;
6.分页查询
①MySQL 数据库分页查询
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数,第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
select * from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
②ORCALE数据库分页查询
ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法。
- 第一种:利用分析函数row_number() 方法
select * from ( select t.*,row_number() over (order by t1.id) rowno from TABLE1 )
where rowno between 21 and 40;
- 第二种:直接使用rownum 虚列
select * from (select t.*,rownum as rowno from TABLE1 )
where rowno between 10 and 20;
这两种方法比较,显然第二种方法比较好。因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。
JavaSE--jdbc编程的更多相关文章
- 单独使用jdbc编程问题总结(一)
在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...
- 浅谈JDBC编程
一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...
- 02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
我们先用jdbc去编写一个例子: 第一步:建表 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - mybatis ************** ...
- JDBC编程的方式
JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...
- JAVA基础知识之JDBC——编程步骤及执行SQL
JDBC编程步骤 下面以mysql数据库为例, 1.加载驱动 首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-con ...
- JDBC编程 之 增删改查
JDBC编程之数据增加,更改,查询,删除 package com.good.jdbc; import java.sql.Connection; import java.sql.DriverManage ...
- JDBC编程步骤
JDBC编程步骤 加载数据库驱动. 通常使用Class类的forName()静态方法来加载驱动. Class.forName(driverClass) dirverClass: mysql---Cla ...
- 【Java】JDBC编程套路
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5847020.html 学习Java开发,一个必须掌握的知识点,就是数据库操作.当程序需要用到的数据达到一定程度 ...
- 用JDBC编程的执行时错误及其解决大全
用JDBC编程的执行时错误及其解决 用JDBC编程的执行时错误及其解决 源码: .java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlser ...
- JDBC编程学习笔记之数据库连接池的实现
在JDBC编程的时候,获取到一个数据库连接资源是很宝贵的,倘若数据库访问量超大,而数据库连接资源又没能得到及时的释放,就会导致系统的崩溃甚至宕机.造成的损失将会是巨大的.再看有了数据库连接池的JDBC ...
随机推荐
- DB 分库分表(5):一种支持自由规划无须数据迁移和修改路由代码的 Sharding 扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
- php phpexcel 创建excel
public function createExcel($result=[],$fileName=''){ \think\Loader::import('extend.excel.PHPExcel', ...
- SpringBoot集成prometheus
1.Prometheus 1)介绍 Prometheus是一套开源的监控&报警&时间序列数据库的组合,基于应用的metrics来进行监控的开源工具 . 架构图: 2)下载 https: ...
- Nexus3.x帐号权限配置
一.使用admin登录后,点击上方齿轮图标 二.打开左侧导航,Security Privileges:具体的权限明细,比如我创建一个test仓库,这里就会生成 Roles:添加角色,设置每个角色可看到 ...
- koa 基础(十六)koa 中 session 的使用
1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...
- Dev中GridView——背景颜色改变
DevExpress.XtraGrid.Views 设置指定行的背景颜色 1.事件:CustomDrawCell2.示例: private void gridView1_CustomDrawCell( ...
- LoadRunner脚本编写之一
LoadRunner脚本编写之一 性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不 ...
- k8s报错解决
. Jul :: lab3 etcd[]: the server is already initialized as member before, starting as etcd member... ...
- 如何把本地文件上传至github?
(都说git好用,但我觉得git把我弄得像个git……在反反复复用git bash的命令行上传失败了N次之后,终于可以用命令行把文件上传到GitHub了 这中间,还要感谢网络上的各种git教程!!!) ...
- UnitTest之Xunit
Unit Test 1.建立单元测试 新建一个类库项目,在Nuget中搜索xunit,选择 xUnit.net 和 xunit.runner.visualstudio 插件包安装. xunit.run ...