【JDBC】JDBC操作实战

JDBC

jdbc:是使用java语言对数据进行操作

1).常见接口、类

	 ①java.sql.Connection:		数据库连接,只有先获得Connection对象才能连接到数据库
		常见方法:
			prepareStatement(sql语句); 创建发送sql语句工具的方法

	 ②java.sql.PreparedStatement:	发送sql语句的工具,具备发送sql的功能(方法)
		常见方法:
			executeQquery();		发送查询sql,并返回结果集
			executeUpdate();		发送增、删、改的sql,返回受影响行数的int类型
			setXXX(序号, 值);	设置sql内的占位参数(?)

	 ③java.sql.ResultSet:			结果集,数据库执行sql返回查询的结果,光标默认在第一行(不是数据),下图
		常见方法:
			next();				游标下移一行
			getXXX(“字段名”);		获得当前行的字段名的值; 例如:int id = rs.getInt(id);
			getXXX(int index);		获得当前行指定序号列的值; 例如:int id= rs.getInt(1);
			getString()/getDate()/getInt()/getDouble()…

	 ④java.sql.Driver:			驱动类,访问数据库的方式,不同数据库会自动提供具体的实现接口

	 ⑤java.sql.DriverManager:		管理多个驱动
			getConnection(url, uid, pw); 获得数据库连接,url:”jdbc:oracle:thin:@ip:端口:实例名(orcl)”

	 ⑥java.sql.ResultSetMetaData; 	对结果集ResultSet的进一步操作,其包含了结果集表的所有信息
			例如:打印表t
			ResultSet rs = preparedStatement.executeQuery();
		    ResultSetMetaData rmd = rs.getMetaData();
			//打印一行字段名:
			for(int i = 1; I < rmd.getColumnCount(); i++) 
				System.out.print(rmd.getColumnLabel(i) + “	”);
			System.out.println();
			//逐行打印数据
			while(rs.next()) {
				for(int I = 1; i < rmd.getColumnCount(); i++) {  //获取查询结果字段的个数	
					System.out.print(rs.getString(i) + “	”);
				}
			}	

2).JDBC操作步骤

	 准备阶段:先导入ojdbcX.jar包(例如:将ojdbc6.jar复制到项目的lib文件夹—build path—add to build path)
	 ①加载驱动:
Class.forName(“oracle.jdbc.OracleDriver”);

	 ②获得数据库连接
		Connection conn = DriverManager.getConnection(url, username, password);
 		url: jdbc:oracle:thin:@ip:端口:orcl/xe(实例)

	 ③创建发送sql语句的工具,并发送
		PreparedStatement psmt = conn.prepareStatement(“sql语句”);
		// PreparedStatement psmt = conn.prepareStatement(“insert into emp values(?, ?)”); //占位参数
		// psmt.setInt(1, 1001); psmt.setString(2, ‘jwnming’);
		psmt.executeUpdate();		//发送增、删、改的sql命令,返回受影响行数的int类型
		psmt.executeQuery();		//发送查询的sql命令,返回查询的结果集(ResultSet)

	 ④处理查询的结果集
		ResultSet rs = psmt.executerQuery();
		rs.next(); //使当前行,为数据的第一行
		System.out.println(rs.getInt(“id”));  //打印当前行的id值
		System.out.println(rs.getString(1));  //打印当前行的第一个字段值

	 ⑥释放资源:先创建的后关闭
		if(rs != null) rs.close();		先判断是否为空
		if(psmt != null) psmt.close();
		if(conn != null) conn.close();

3).驱动加载剖析、动态sql语句

1. 驱动加载剖析
DriverManager管理驱动
  	 //管理驱动
  	 public class DriverManager{
   	    private static List<Driver> drivers  = new CopyOnWriteArrayList<>();//存放多个driver对象.
    	    //真正的注册驱动的代码.
     	public static void registDriver(Driver driver){
         	drivers.add(driver);
      	}
      	public static Connection getConnection(String url,String user,String password){
      	    //...
     	}
  	 }

 驱动加载
   	// 表面书写: Class.forName("oracle.jdbc.OracleDriver")
   	// 如何实现驱动加载?
  	public class OracleDriver implements Driver{
        //加载驱动
        static{
            Driver driver = new oracle.jdbc.OracleDriver();//创建驱动
            DriverManager.registDriver(driver);//添加驱动对象, 注册驱动,  加载驱动.
        }
   	}

2. 动态访问数据库的sql
方式1:  SQL字符串拼接,将数据通过字符串拼接,绑定在SQL语句中;
	缺点:sql注入
	例如:String sql = “select * from employees where name = ‘” + name +”’”;

方式2:  pstm动态参数:? 方式只能动态绑定数据/值的部分 

优点: 防止SQL注入.
缺点: 不能动态绑定  sql的关键词,列名..

步骤:
①. 创建SQL允许将值,用? 站位: `delete from t_person where name = ?`
   pstm = conn.prepareStatement("delete from t_person where name = ?");
   // insert into t_person values(?,?,?,?,?);
②. 绑定参数:对?站位的值,进行替换,绑定.
   //pstm.setXxxx(?的序号从1开始,要绑定的具体值);// 将数据绑定在指定的?位置.

   pstm.setInt();  //绑定整数类型的值
   pstm.setString() //绑定字符串的值
   pstm.setDouble();// 绑定double的值
   pstm.setDate();//绑定日期.
③. 发送sql(执行)
   pstm.executeUpdate();//执行增删改
   pstm.executeQuery();//执行查询.

4).批处理(批量更新数据)

批更新(BatchUpdate) :  **PreparedStatement**核心
1. 将绑定的参数,缓存在java本地.
   pstm.addBatch()
2. 将缓存在java本地的多组参数,一次性发送给Oracle.
   pstm.executeBatch()
例如:
		for(int i = 0; i < 10000; i++) {
			psmt1.setString(1, name);
			psmt1.addBatch();
			if(i % 600 == 0) {
				psmt1.executeBatch();
			}
		}
	psmt1.executeBatch();
原文地址:https://www.cnblogs.com/jwnming/p/13634741.html