JAVA学习——JDBC数据库操作

目录

Mysql数据库的介绍

JDBC

JDBC常用接口

Driver接口

DriverManager接口

Connetion接口

Statement接口

 ResultSet接口

批处理

事务

 

时间类型


Mysql数据库的介绍

在学习JDBC,我所用的是Msql数据库,那么首先,先介绍下Mysql数据库

Mysql特点:

  • 是一种开放源代码的关系型数据库管理系统(RDBMS)
  • 目前很多大公司(新浪、京东、阿里等)都在使用mysql
  • 适应于所有的平台
  • 支持多线程,充分利用CPU资源,性能很出色
  • 价格便宜
  • 大数据库处理。
    •  对某些包含 50,000,000 个记录的数据库使用MySQL完全没有问题
  • 使用最多的版本是5.5.

JDBC

什么是JDBC?

  • JDBC(Java Database  Connection)为java开发者使用数据库 提供了统一的编程接口,它由一组java类和接口组成。是java 程序与数据库系统通信的标准API。JDBC API 使得开发人员 可以使用纯java的方式来连接数据库,并执行操作。
  • sun公司由于不知道各个主流商用数据库的程序代码,因此无 法自己写代码连接各个数据库,因此,sun公司决定,自己提 供一套api,凡是数据库想与Java进行连接的,数据库厂商自 己必须实现JDBC这套接口。而数据库厂商的JDBC实现,我们 就叫他此数据库的数据库驱动

JDBC访问数据库的流程

JDBC常用接口

Driver接口

  • Driver接口由数据库厂家提供,对于java开发者而言,只需要使用 Driver接口就可以了。
  • 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不 同的数据库有不同的装载方法。
  • 驱动:就是各个数据库厂商实现的Sun公司提出的JDBC接口。 即对 Connection等接口的实现类的jar文件
  • 装载MySql驱动 
    • Class.forName("com.mysql.jdbc.Driver");
  • 装载Oracle驱动
    •  Class.forName("oracle.jdbc.driver.OracleDriver");

 

DriverManager接口

  • DriverManager是JDBC的管理层,作用于用户和驱动程序之间。
  • DriverManager跟踪可用的驱动程序,并在数据库和相应的驱动程序 之间建立连接。

Connetion接口

  • Connection与特定数据库的连接(会话),在连接上下文中执行 SQL 语句并返回结果。
  • DriverManager的getConnection()方法建立在JDBC URL中定义的数 据库Connection连接上
  •  连接MYSQL数据库:
    • Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database","user", "password");
  • 连接ORACLE数据库:
    • Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password");
package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * 
 * @Desciption :数据库连接测试极其测试
 * @date :2019-4-1 下午3:52:49
 * @author :田坤
 */
public class Demo1 {
    public static void main(String[] age) {
	try {
	    //加载驱动类
	    Class.forName("com.mysql.jdbc.Driver");
	    
	    //建立连接(连接对象内部其实包含了socket类对象,是一个远程连接,比较耗时,这是Connection管理的一个要点)
	    //真正开发中,为了提高效率都会用连接池来管理连接对象
	    long start = System.currentTimeMillis();
	    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava","root","1327148745");
	    long end = System.currentTimeMillis();
	    System.out.println(conn);
	    System.out.println("建立连接:耗时"+(start-end)+"ms毫秒");
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
}
com.mysql.jdbc.JDBC4Connection@f1e4fa
建立连接:耗时-590ms毫秒

Statement接口

用于执行静态 SQL 语句并返回它所生成结果的对象

-三种Statement类:

  • Statement:
    •  由conn.createStatement创建,用于发送简单的SQL语句。(不带参数的)(安全性低)
  • PreparedStatement:
    • 继承自Statement接口,由conn.prepareStatement创建,用于发送含有一个或多 个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更 高,并且可以防止SQL注入。我们一般都用PreparedStatement.\
  •  CallableStatement
    • 继承自PreparedStatement 。由方法prePareCall创建,用于调用存储过程。

– 常用的Statement方法

  • execute():运行语句,返回是否有结果集。
  • executeQuery():运行select语句,返回ResultSet结果集。
  • executeUpdate():运行insert/update/delete操作,返回更新的行数
package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * Statement的使用
 * @Desciption :
 * @date :2019-4-1 下午4:24:02
 * @author :田坤
 */
public class Demo2 {
    public static void main(String[] age) {
	try {
	    Class.forName("com.mysql.jdbc.Driver");
	    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
	    Statement stmt = conn.createStatement();
	    String sql="insert into t_user(uname,password,sex,age) values ('田坤','1256','男',18)";
	    stmt.execute(sql);
	    
	    //存在sql注入
	    String id = "5 or 1=1";   //为永真
	    String sql1 = "delete from t_user where id ="+id;
	    //会清理掉清除所有数据
	    stmt.execute(sql1);
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
}
    public static void main(String[] age) {
	try {
	    Class.forName("com.mysql.jdbc.Driver");
	    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
	    
	    String sql = "insert into t_user(uname,password,sex,age) values(?,?,?,?)"; // ? ——占位符
	    PreparedStatement ps = conn.prepareStatement(sql);
	    //第一个参数为索引   下表从1开始
	    ps.setString(1,"田坤");  
	    ps.setString(2,"123");  
	    ps.setString(3,"男");  
	    ps.setInt(4,18);
	    //ps中我们可以数据类型进行操作
	    
	    //那么我们自然也是可以使用我们的万能类型 Object
	    ps.setObject(1, "田坤");
	    ps.setObject(2, "1234");
	    ps.setObject(3, "男");
	    //不可以通过Object类型设置int类型
	    ps.setInt(4,18);
	    
	    boolean flag = ps.execute();
	    System.out.println(flag);
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

 ResultSet接口

Statement执行SQL语句时返回ResultSet结果集。

ResultSet提供的检索不同类型字段的方法,常用的有:

  • getString():获得在数据库里是varchar、char等数据类型的对象。
  • getFloat():获得在数据库里是Float类型的对象。
  • getDate():获得在数据库里面是Date类型的数据。
  • getBoolean():获得在数据库里面是Boolean类型的数据

    package com.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    /**
     * 
     * @Desciption :ResultSet结果集的使用
     * @date :2019-4-1 下午5:04:15
     * @author :田坤
     */
    public class Demo4 {
        public static void main(String[] age) {
    	try {
    	    //加载驱动
    	    Class.forName("com.mysql.jdbc.Driver");
    	    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
    	    
    	    String sql = "select * from t_user"; // ? ——占位符
    	    PreparedStatement ps = conn.prepareStatement(sql);
    	    ResultSet rs = ps.executeQuery();
    	    //遍历结果集
    	    while(rs.next()){
    		System.out.println(rs.getInt(1)+"---"+rs.getString(2)+"---"+rs.getString(3)+"---"+rs.getString(4)+"---"+rs.getInt(5));
    	    }
    	   
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}
        }
    }
    

依序关闭使用之对象及连接:

– ResultSet ——》Statement——》 Connection

批处理

  • Batch
  • 对于大量的批处理,建议使用Statement,因为PreparedStatement的预编译空间有限 ,当数据量特别大时,会发生异常。
package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 
 * @Desciption :批处理的使用
 * 		我们使用statement而不使用preparedStatement
 * @date :2019-4-1 下午5:15:37
 * @author :田坤
 */
public class Demo5 {
    public static void main(String[] age) {
	Connection conn = null;
	Statement stmt = null;
	try {
	    //加载驱动
	    Class.forName("com.mysql.jdbc.Driver");
	    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
	    
	    conn.setAutoCommit(false);  //设置为手动提交
	    
	    long start = System.currentTimeMillis();
	    stmt = conn.createStatement();
	    for(int i = 0; i <20000; i++){
		stmt.addBatch("insert into t_user(uname,password,sex,age) values('田坤"+i+"','111111','男',20)");
	    }
	    
	    stmt.executeBatch();
	    conn.commit();
	    long end = System.currentTimeMillis();
	    
	    System.out.println("插入20000条数据所用的时间(ms毫秒):"+(end-start));
	   
	} catch (Exception e) {
	    e.printStackTrace();
	}finally{
	    try {
		stmt.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	    try {
		conn.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	}
    }
}
插入20000条数据所用的时间(ms毫秒):75997

//电脑比较卡,礼貌而不是尴尬的笑.gif

事务

事务基本概念

  •  一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操 作的一个执行单元!
  • 事务开始于:
    • 连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
    • 前一个事务结束后,又输入了另外一条DML语句。
  • 事务结束于:
    • 执行COMMITROLLBACK语句
    • 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执 行COMMIT语句。
    • 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行 COMMIT语句。
    • 断开与数据库的连接
    •  执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的 DML语句执行ROLLBACK语句。
  • 事务的四大特点:
    • atomicity(原子性)
      • 表示一个事务内的所有操作是一个整体,要 么全部成功,要么全失败;
    • consistency(一致性) 
      • 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改 前的状态;
    • isolation(隔离性)
      • 事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态, 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
    •  durability(持久性)
      • 持久性事务完成之后,它对于系统的影响是永久性的。
  •  事务隔离级别从低到高
    • – 读取未提交(Read Uncommitted) –
    • 读取已提交(Read Committed) –  (默认)
    • 可重复读(Repeatable Read) –
    • 序列化(serializable)
package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 
 * @Desciption :事务
 * @date :2019-4-1 下午6:02:20
 * @author :田坤
 */
public class shiwu {
    public static void main(String[] age) {
	Connection conn = null;
	PreparedStatement ps1 = null;
	PreparedStatement ps2 = null;
	try {
	    //加载驱动
	    Class.forName("com.mysql.jdbc.Driver");
	    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
	    
	    conn.setAutoCommit(false);  //默认为自动提交 true
	    ps1 = conn.prepareStatement("insert into t_user(uname,password,sex,age) values('田坤','123456','男',18)");
	    ps1.execute();
	    System.out.println("插入田坤");
	    Thread.sleep(6000);
	    
	    //第二个语句有问题,模拟错误提交
	    ps2 = conn.prepareStatement("insert into t_user(uname,password,sex,age,sss) values('宋旭东','123456','男',18)");
	    ps2.execute();
	    System.out.println("插入宋旭东");
	    
	    conn.commit();
	   
	} catch (Exception e) {
	    e.printStackTrace();
	    try {
		conn.rollback();
	    } catch (SQLException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	    }
	}finally{
	    try {
		ps1.close();
		ps2.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	    try {
		conn.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	}
    }
}

 

时间类型

  •  java.util.Date
    • 子类:java.sql.Date              表示年月日
    • 子类:java.sql.Time              表示时分秒
    • 子类:java.sql.Timestamp    表示年月日时分秒
package com.jdbc;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;


/**
 * 
 * @Desciption :时间类型存储的使用
 *		1.Date   年月日
 *		2.Time   时分秒
 *		3.TimeStamp  年月日时分秒
 * @date :2019-4-1 下午7:19:36
 * @author :田坤
 */
public class Demo6 {
    public static void main(String[] age) {
	Connection conn = null;
	PreparedStatement ps = null;
	PreparedStatement ps1 = null;
	PreparedStatement ps2 = null;
	try {
	    //加载驱动
	    Class.forName("com.mysql.jdbc.Driver");
	    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
	    //年月日
	    Date date = new Date(System.currentTimeMillis());
	   
	    ps = conn.prepareStatement("insert into t_jdbc(name,timer) values(?,?)");
	    ps.setString(1, "田坤");
	    ps.setDate(2, date);
	    ps.execute();
	    
	    //年月日时分秒
	    Timestamp tt = new Timestamp(System.currentTimeMillis());
	    
	    ps1 = conn.prepareStatement("insert into t_jdbc(name,timestamp) values(?,?)");
	    ps1.setString(1, "田坤");
	    ps1.setObject(2, tt);
	    ps1.execute();
	    
	    //时分秒
	    Time time = new Time(System.currentTimeMillis());
	    ps2 = conn.prepareStatement("insert into t_jdbc(name,sfm) values(?,?)");
	    ps2.setString(1, "田坤");
	    ps2.setObject(2, tt);
	    ps2.execute();
	   
	} catch (Exception e) {
	    e.printStackTrace();
	}finally{
	    try {
		ps.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	    try {
		conn.close();
	    } catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	}
    }
}

查询规定日期内的数据

package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 
 * @Desciption :查询在规定日期内的时间
 * @date :2019-4-1 下午7:27:21
 * @author :田坤
 */
public class Demo7 {
    
   /**
    * 将字符串代表的日期转化为long数字(格式为  yyyy-MM-dd hh:mm:ss  )
    *@param data
    *@return
    */
   public static long strDate(String data){
       DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
       try {
	return df.parse(data).getTime();
    } catch (ParseException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
    }
       return 0;
       
   }
    
	    public static void main(String[] age) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
		    //加载驱动
		    Class.forName("com.mysql.jdbc.Driver");
		    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/rejava?useUnicode=true&characterEncoding=utf8","root","1327148745");
		    
		    ps = conn.prepareStatement("select * from t_jdbc where timestamp>? and timestamp<?");
		    
		    long start = strDate("2019-4-1 19:13:01");
		    long end = strDate("2019-4-1 19:15:01");
		    
		    ps.setObject(1, new Timestamp(start));
		    ps.setObject(2, new Timestamp(end));
		    
		    rs = ps.executeQuery();
		    
		    while(rs.next()){
			System.out.println(rs.getString("name"));
		    }
		    
		} catch (Exception e) {
		    e.printStackTrace();
		}finally{
		    try {
			rs.close();
		    } catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		    }
		    try {
			ps.close();
		    } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		    }
		    try {
			conn.close();
		    } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		    }
		}
	    }
}

猜你喜欢

转载自blog.csdn.net/qq_41965731/article/details/88948751