JDBC数据库常用操作(mysql)
JDBC
英文名称:JavaDataBaseConnectivity
中文名称:java数据库连接
简称:JDBC
JDBC是一种用于执行SQL语句的JavaAPI,
可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用
程序。
一、建立数据库连接
1、引用jar文件(http://dev.mysql.com/downloads/connector/j/ 下载jar文件)
2、注册驱动Class.forName(“com.mysql.jdbc.Driver”)(只需注册一次)
3、定义数据库连接字符串URL="jdbc:mysql://127.0.0.1:3306/数据库名称?user=用户名&password=密码&useUnicode=true&characterEncoding=utf-8";
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
user:用户名
password:密码
useUnicode:是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true
characterEncoding:当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk
autoReconnect:当数据库连接异常中断时,是否自动重新连接。(默认:false)
autoReconnectForPools:是否使用针对数据库连接池的重连策略。(默认:false)
failOverReadOnly:自动重连成功后,连接是否设置为只读。(默认:true)
maxReconnects:autoReconnect设置为true时,重试连接的次数 (默认3:)
initialTimeout:autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2
connectTimeout:和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 0
socketTimeout:socket操作(读写)超时,单位:毫秒。 0表示永不超时
二、常用数据库操作
//数据库连接字符串
public static final String DRIVER="com.mysql.jdbc.Driver";
public static final String URL="jdbc:mysql://127.0.0.1:3306/MyLibrary?user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
1、添加数据
public static void insert()throwsSQLException{
Connectioncon=null;
Statementst=null;
try{
Class.forName(DRIVER);
con=DriverManager.getConnection(URL);
st=con.createStatement();
st.execute("insertintoarticle(title)values('标题');");
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}finally{
con.close();
st.close();
}
}
2、删除数据
public static void delete(intid)throwsSQLException{
Connectioncon=null;
Statementst=null;
try{
Class.forName(DRIVER);
con=DriverManager.getConnection(URL);
st=con.createStatement();
st.executeUpdate("deletefromarticlewhereid="+id+";");
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}finally{
con.close();
st.close();
}
}
3、修改数据
public static void update()throwsSQLException{
Connectioncon=DriverManager.getConnection(URL);
Statementst=con.createStatement();
st.executeUpdate("updatearticlesettitle='新标题'whereid=1;");
con.close();
st.close();
}
4、查询数据
public static void select()throwsSQLException{
Connectioncon=null;
Statementst=null;
try{
Class.forName(DRIVER);
con=DriverManager.getConnection(URL);
st=con.createStatement();
ResultSetrs=st.executeQuery("select*fromarticle;");
while(rs.next()){
System.out.print(rs.getInt("id"));
System.out.println(rs.getString("title"));
}
//按表结构自动输出
// ResultSetMetaDatarsmd=rs.getMetaData();
// for(inti=1;i<rsmd.getColumnCount();i++){
// System.out.print(rsmd.getColumnName(i));
// System.out.println(rsmd.getColumnTypeName(i));
// }
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}finally{
st.close();
con.close();
}
}
5、参数预处理
public static void insert(Stringtitle)throwsSQLException{
Connectioncon=DriverManager.getConnection(URL);
PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);");
pst.setString(1,title);
pst.executeUpdate();
con.close();
pst.close();
}
6、批处理
public static void insertBatch(String[]title)throwsSQLException{
// Connectioncon=DriverManager.getConnection(URL);
// Statementst=con.createStatement();
// for(inti=0;i<title.length;i++){
// st.addBatch("insertintoarticle(title)values('"+title[i]+"');");
// }
// st.executeBatch();
// con.close();
// st.close(); //参数预处理+批处理
Connectioncon=DriverManager.getConnection(URL);
PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);");
for(inti=0;i<title.length;i++){
pst.setString(1,title[i]);
pst.addBatch();
}
pst.executeBatch();
con.close();
pst.close();
}
7、事务操作
7.1、数据库事务的特性:
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
7.2、JDBC事务操作
(1)setAutoCommit(Booleanauto Commit):设置是否自动提交事务;
(2)commit():提交事务;
(3)rollback():撤消事务;
默认的情况为自动提交事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用commit()来提交,否则将调用rollback()来撤消事务。在jdbc中,可以通过调用setAutoCommit(false)来禁止自动提交事务。然后就可以把多条更新数据库的sql语句做为一个事务,在所有操作完成之后,调用commit()来进行整体提交。倘若其中一项sql操作失败,就不会执行commit()方法,而是产生相应的sqlexception,此时就可以捕获异常代码块中调用rollback()方法撤消事务。
public static void transaction()throwsSQLException{
Connectioncon=DriverManager.getConnection(URL);
Statementst=con.createStatement();
try{
con.setAutoCommit(false);//更改JDBC事务的默认提交方式
st.executeUpdate("deletefromarticlewhereid=1;");
//Savepoint sp = conn.setSavepoint();设置回滚点
st.executeUpdate("deletefromarticlewhereid=2;");
con.commit();//提交JDBC事务
con.setAutoCommit(true);//恢复JDBC事务的默认提交方式
}catch(Exceptionexc){
con.rollback();//回滚JDBC事务
}finally{
st.close();
con.close();
}
}
8、调用mysql存储过程
public static void callProcedure()throwsSQLException{
Connectioncon=DriverManager.getConnection(URL);
CallableStatementcst=con.prepareCall("{callproc_select(?)}");
//传入参数值
cst.setInt(1,3);
//如果第一个结果是ResultSet对象,则返回true;如果第一个结果是更新、添加、修改或者没有结果,则返回false
booleanissuccess=cst.execute();
//成功返回true,失败返回false
System.out.println(issuccess);
}
三、JDBC执行sql语句方法
1、executeQuery(String sql): 执行SQL查询,并返回ResultSet 对象。
2、executeUpdate(String sql): 可执行增,删,改,返回执行受到影响的行数。
3、execute(String sql);:可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。
四、JDBC Statement类型
1、Statement:接口提供了执行语句和获取结果的基本方法,用于执行不带参数的简单SQL语句,每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。
2、PrepareStatement:可变参数的SQL,编译一次,执行多次,效率高;安全性好,有效防止Sql注入等问题;支持批量更新,批量删除;执行的SQL语句中是可以带参数的,并支持批量执行SQL。由于采用Cache机制,则预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来。
3、CallableStatement:用于执行对数据库已存储过程的调用,继承自PreparedStatement,支持带参SQL操作;支持调用存储过程,提供了对输出和输入/输出参数的支持;
在JDBC中调用存储过程的语法如下所示:
{call过程名[(?,?)]}
返回结果参数的过程的语法为:
{?=call过程名[(?,?,...)]}
不带参数的存储过程的语法类似:
{call过程名}
CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBCNULL。
JDBC数据库常用操作(mysql)的更多相关文章
- 数据库常用操作(mysql)
创建 create database 库名 create table 表名(列名 type(varchar(size),int(size),decimal(size,d))) "size&q ...
- DBA必备:MySQL数据库常用操作和技巧
DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...
- centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课
centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课 mysq ...
- php模拟数据库常用操作效果
test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...
- MySQL数据库常用操作和技巧
MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...
- Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy
Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...
- mysql常用操作 mysql备份与恢复
先登录mysql ==>mysql -uroot -p 查看数据库的版本 select version(); 查看有哪些库 show datases; 查看当前处于哪个库 select da ...
- mysql数据库----python操作mysql ------pymysql和SQLAchemy
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQ ...
- MySQL数据库4Python操作mysql、索引、慢查询日志
目录 一.Python 操作 mysql 1.1python 操作 mysql 1.2查询数据 1.3增加(添加.更新)数据 1.4修改数据 1.5删除数据 1.6SQL注入问题 1.6.1问题的引入 ...
随机推荐
- Mysql中使用存储过程返回查询多个表的数据信息
-- 测试手机号 call P_Base_CheckLogin('); -- 测试登录名 call P_Base_CheckLogin('sch000001') -- 测试身份证号 call P_Ba ...
- oracle 11g在大表中添加字段及默认值--加速
今天遇到这个问题了.简单的增加语句,默认SQLPLUS执行,却会超时. 要增加客户端的TIMEOUT时间才可以解决.(感觉超过两三分钟,默认超时30秒) 另外, 也可以用两步操作(1,增加字段,2,修 ...
- (七)MySQL数据操作DQL:单表查询1
(1)单表查询 1)环境准备 mysql> CREATE TABLE company.employee5( id int primary key AUTO_INCREMENT not null, ...
- PHP开发经常遇到的几个错误
错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: $arr = array(1,2,3,4); foreach($a ...
- Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- 洛谷——P1586 四方定理
P1586 四方定理 题目描述 四方定理是众所周知的:任意一个正整数nn,可以分解为不超过四个整数的平方和.例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=12+22+22+42,当然 ...
- 容斥原理 求M以内有多少个跟N是互质的
开始系统的学习容斥原理!通常我们求1-n中与n互质的数的个数都是用欧拉函数! 但如果n比较大或者是求1-m中与n互质的数的个数等等问题,要想时间效率高的话还是用容斥原理! 本题是求[a,b]中与n ...
- centos7下mail邮件的查看删除、禁止部分应用发邮件
查看与删除 mail命令进入 & p #显示当前邮件& 2 #显示标号为2的文件 & d 1-100 ...
- [PKUSC2018]神仙的游戏(FFT)
给定一个01?串,对所有len询问是否存在一种填法使存在长度为len的border. 首先有个套路的性质:对于一个长度为len的border,这个字符串一定有长度为n-len的循环节(最后可以不完整) ...
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...