JDBC是什么
JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。
JDBC库中所包含的API任务通常与数据库使用:
1.连接到数据库
2.创建SQL或MySQL语句
3.在数据库中执行SQL或MySQL查询
4.查看和修改记录
Statement & PreparedStatement的区别
这个链接介绍十分详细
http://blog.youkuaiyun.com/jiangwei0910410003/article/details/26143977
连接到数据库、关闭连接
//从配置文件中读取数据连接到数据库中
package com.vvvvvv.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtil {
static Properties pros = null;// 可以帮助读取和处理资源文件中的信息
static { // 加载JDBCUtil类的时候调用
pros = new Properties();
try {
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getMysqlConn() {
try {
Class.forName(pros.getProperty("mysqlDriver"));
return DriverManager.getConnection(pros.getProperty("mysqlURL"), pros.getProperty("mysqlUser"),
pros.getProperty("mysqlPwd"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static void close(ResultSet rs, Connection conn, PreparedStatement ps) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Connection conn, PreparedStatement ps) {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//配置文件 Mysql
mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc\:mysql\://localhost\:3306/testjdbc?characterEncoding=utf8&useSSL=false
mysqlUser=root
mysqlPwd=vvvvvv
//oracle
oracleDriver=oracle.jdbc.driver.oracleDriver
oracleURL=jdbc\:oracle\:thin\:@localgost\:1521\:orcl
oracleUser=scott
oraclePwd=tiger
statement语句
public class Demo02 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接(连接对象内部其实包含了Socket对象,是一个远程的连接。比较耗时!这是Connection对象管理的一个要点!)
//真正开发中,为了提高效率,都会使用连接池来管理连接对象!
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
stmt = conn.createStatement();
// String name = "赵六";
// String sql = "insert into t_user (username,pwd,regTime) values ('"+name+"',66666,now())";
// stmt.execute(sql);
//测试SQL注入
String id = "5 or 1=1 ";
String sql = "delete from t_user where id="+id;
stmt.execute(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(stmt!=null){
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
测试PreparedStatement基本用法
package com.vvvvvv.jdbc;
/**
* 测试PreparedStatement的基本用法
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo3 {
public static void main(String[] args) {
ResultSet rs = null;
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
String sql = "insert into t_user(id,username,pwd,regTime) values(?,?,?,?)";// ?占位符
ps = conn.prepareStatement(sql);
ps.setInt(1, 5);
ps.setString(2, "wuhk");
ps.setString(3, "123456");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(System.currentTimeMillis());
String str = df.format(d);
ps.setString(4, str);
ps.setObject(2, "shijialing");
ps.setObject(3, "123123");
ps.setObject(1, 7);
ps.setDate(4, new java.sql.Date(System.currentTimeMillis()));
ps.setDate(4, new java.sql.Date(System.currentTimeMillis()));
ps.execute();
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(
rs.getInt(1) + "---->" + rs.getString(2) + "---->" + rs.getString(3) + "---->" + rs.getDate(4));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试结果集的基本用法
package com.vvvvvv.jdbc;
/**
* 测试PreparedStatement的excuteQuery()
* 结果集的基本用法
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo4 {
public static void main(String[] args) {
ResultSet rs = null;
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
String sql = "select * from t_user where id > 1";// ?占位符
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(
rs.getInt(1) + "---->" + rs.getString(2) + "---->" + rs.getString(3) + "---->" + rs.getDate(4));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
批处理
使用statement
package com.vvvvvv.jdbc;
/**
* 测试批处理Batch()
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo5 {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
try {
//连接
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
conn.setAutoCommit(false);
//批处理
st = conn.createStatement();
for(int i = 0; i < 20000; i++) {
st.addBatch("insert into t_user(id,username,pwd,regTime) values('"+(i+8)+"','wu"+(i+8)+"','123',now())");
}
st.executeBatch();
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//关闭连接
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用PreparedStatement
package com.vvvvvv.jdbc;
/**
* 测试批处理Batch()
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo9 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
conn.setAutoCommit(false);
String sql = "insert into t_user(id,username,pwd) values(?,?,?)";
ps = conn.prepareStatement(sql);
for(int i = 0; i < 20000; i++) {
ps.setInt(1, i + 8);
ps.setString(2, "name" + i);
ps.setString(3, "123123");
//添加进批
ps.addBatch();
//设置条件当i对10取余为0的话,先执行一次批语句,然后将批清除
if(i % 10 == 0) {
ps.executeBatch();
ps.clearBatch();
}
}
//将批中剩余的语句执行完毕
ps.executeBatch();
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
事务
一,JDBC当中事务的概念:
基本概念:
一组要么同时执行成功,要么同时执行失败的sql语句,是数据库操作的一个执行单元。
-事务开始于DML语句(insert ,update,delete);
-事务结束于:
.执行commit或者rollback语句
.执行一条DDL语句,
.执行一条DCL语句。例如:grant语句后会自动commit语句。
.断开与数据库的连接。
.执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的操作DML语句执行rollback语句。
二,事务的四大特点(ACID);
-atomicity(原子性);
-consistency(一致性);
-isolation(隔离性);
-durability(持久性);
三,事务隔离级别从低到高:
-读取未提交(Read Uncommitted);
-读取已提交(Read Committed);
-可重复读(Repeatable Read);
-序列化(Serializable);
四 ,对于事务的编写,要遵守一定的顺序的:
首先,.设置事务的提交方式为非自动提交:
conn.setAutoCommit(false);
接下来,.将需要添加事务的代码放入try,catch块中。
然后,.在try块内添加事务的提交操作,表示操作无异常,提交事务。
conn.commit();
尤其不要忘记,.在catch块内添加回滚事务,表示操作出现异常,撤销事务:
conn.rollback();
最后,设置事务提交方式为自动提交:
conn.setAutoCommit(true);
这样,通过简单的几步,我们就可以完成对事务处理的编写了。
Connection con =null;
Statement st=null;
ResultSet rs=null;
PreparedStatement ps=null;
publicvoid startTransaction(){
con = DBCManager.getConnect();//获取连接对象
try {
//设置事务的提交方式为非自动提交:
con.setAutoCommit(false);
//将需要添加事务的代码一同放入try,catch块中
//创建执行语句
String sql ="delete from me where id = 7";
String sql1 = "update me set name ='chengong' ,age ='34' where id =4";
//分别执行事务
ps = con.prepareStatement(sql);
ps.executeUpdate();
ps = con.prepareStatement(sql1);
ps.executeUpdate();
//在try块内添加事务的提交操作,表示操作无异常,提交事务。
con.commit();
} catch (SQLException e) {
try {
//.在catch块内添加回滚事务,表示操作出现异常,撤销事务:
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
//设置事务提交方式为自动提交:
con.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
DBCManager.release(rs, ps, con);
}
}
JDBC中的时间类型
1) java.util.Date
-子类:java.sql.Date 表示年月日
-子类:java.sql.Time 表示时分秒
-子类:java.sql.Timestamp 表示年月日时分秒。
2)日期比较处理
-插入随机日期
-取出指定日期范围的记录
public class Demo07 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
for(int i=0;i<1000;i++){
ps = conn.prepareStatement("insert into t_user (username,pwd,regTime,lastLoginTime) values (?,?,?,?)");
ps.setObject(1, "vvv"+i);
ps.setObject(2, "123456");
int rand = 100000000+new Random().nextInt(1000000000);
java.sql.Date date = new java.sql.Date(System.currentTimeMillis()-rand);
Timestamp stamp = new Timestamp(System.currentTimeMillis()-rand); //如果需要插入指定日期,可以使用Calendar、DateFormat
ps.setDate(3, date);
ps.setTimestamp(4, stamp);
ps.execute();
}
System.out.println("插入一个用户,高淇");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
文件大对象操作Clob()
-CLOB用于存储大量的文本数据
-大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的,而非一般的字段,一次即可读出数据。
Mysql中相关类型如下:
-TINYTEXT 最大长度为255字符的text列
-TEXT【M】最大长度为65563字符的text列
-MEDIMTEXT最大长度为16777215字符的列
-LONGTEXT最大长度为4294,967,2956或者4GB字符的列;
package com.vvvvvv.jdbc;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 测试Clob() 文本大对象操作
*/
public class Demo7 {
public static void main(String[] args) throws IOException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
conn.setAutoCommit(false);
String sql = "insert into t_user (id,username,pwd,regTime,myInfo) values(?,?,?,?,?)";// ?占位符
ps = conn.prepareStatement(sql);
// ps.setInt(1, 1);
// ps.setString(2, "vvvv");
// ps.setString(3, "wasa");
// ps.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
//从文件中插入文本信息
// ps.setClob(5, new FileReader(new File("D:/a.txt")));
//从程序中插入文本信息
// ps.setClob(5, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaaaaa".getBytes()))));
//读取文本信息
sql = "select * from t_user where id = ?";
ps = conn.prepareStatement(sql);
ps.setObject(1, 1);
rs = ps.executeQuery();
while(rs.next()) {
Clob c = rs.getClob(5);
Reader r = c.getCharacterStream();
int temp = 0;
while((temp = r.read())!= -1) {
System.out.println((char)temp);
}
}
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二进制大对象操作blob()
public class Demo10 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
// ps = conn.prepareStatement("insert into t_user (username,headImg) values (?,?) ");
// ps.setString(1, "vvv");
// ps.setBlob(2, new FileInputStream("d:/icon.jpg"));
// ps.execute();
ps = conn.prepareStatement("select * from t_user where id=?");
ps.setObject(1, 101026);
rs = ps.executeQuery();
while(rs.next()){
Blob b = rs.getBlob("headImg");
is = b.getBinaryStream();
os = new FileOutputStream("d:/a.jpg");
int temp = 0;
while((temp=is.read())!=-1){
os.write(temp);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(is!=null){
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if(os!=null){
os.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}