JDBC

Posted 旺仔成长记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC相关的知识,希望对你有一定的参考价值。

JDBC 概述 

什么是 JDBC

JDBC(Java Data Base Connectivity,java数据库连接),执行SQL语句的API。  

 

JDBC 常用API

Driver 接口

Class.forName("com.mysql.jdbc.Driver"); //注册驱动

 

DriverManager 接口

getConncetion(String url, String user, String password) //建立数据库连接,返回Connection 对象

 

Connection 接口

createStatement() //创建Statement对象将SQL语句发送到数据库

createStatement(int resultSetType, int resultSetConcurrency)

//创建Statement对象将SQL语句发送到数据库(生成具有给定类型和并发性的ResultSet)

resultSetType - 结果集类型

ResultSet.TYPE_FORWARD_ONLY(不滚动结果集)

ResultSet.TYPE_SCROLL_INSENSITIVE(滚动结果集,但数据不会再跟随数据库而变化)

ResultSet.TYPE_SCROLL_SENSITIVE(滚动结果集,但数据不会再跟随数据库而变化,敏感(数据库更新,未查看的结果集也随之更新)且无数据库驱动支持)

resultSetConcurrency - 并发类型

ResultSet.CONCUR_READ_ONLY(结果集只读,不能通过修改结果集而反向影响数据库)

ResultSet.CONCUR_UPDATABLE(结果可更新,对结果集的更新可反向影响数据库)

 

Statement 接口

executeUpdate(String sql) //执行sql 中的 insert、update 和 delete 语句。返回int 类型,表示数据库中受该SQL语句影响的记录的数目

executeQuery(String sql) //执行sql 中的 select 语句。返回一个表示查询结果的ResultSet 对象

 

ResultSet 接口

getString(int columnIndex) //用于获取指定列数字段的String 类型的值

getString(String columnName) //用于获取指定字段名称的String 类型的值

getInt(int columnIndex) //用于获取指定字段名称的int 类型的值

getInt(String columnName) //用于获取指定字段名称的int 类型的值

next() //将游标从当前位置向下移一行

getMetaData() //返回ResultSetMetaData类型对象,再通过该对象的getColumnCount()和String getColumnName(int,colIndex)获取所有列数 和列名

结果集特性

当使用Connection 的createStatement 时已经确定生成结果集的特性

是否可滚动

是否敏感

是否可更新

注意:导入的是java.sql.*

 

实现一个JDBC程序

	public void query() {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try{
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs","root","root");
			stmt = con.createStatement();
			String sql = "select * from article";
			rs = stmt.executeQuery(sql);
			int count = rs.getMetaData.getColumnCount();
			while(rs.next()){
				for(int i=1; i<=count, i++){
					System.out.println(rs.getObject(i));	//不知列类型,rs.getObject通用
					if(p<count){
						System.out.println();
					}
				}
				System.out.println();
				//int id = rs.getInt(1);
				//String title = rs.getString("title");
			}
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			try{
				if(rs != null) rs.close();
				if(stmt != null) stmt.close();
				if(con != null) con.close();
			}catch(Exception e){}
		}
	}

 

PreparedStatement

它是Statement接口的子接口

作用

防SQL攻击

提高代码可读性、可维护性

提高效率

疑问:为什么是双引号还有两个加号?

String userName = "baron";

String sql = "select * from student where username = \'"+ userName+"\'";

步骤

//1、sql语句中的参数用?来代替

String sql = "select * from student where username = ?";

//2、通过Conncetion 得到 PreparedStatement

PreparedStatement pstmt = con.PreparedStatement(sql);

//3、调用pstmt 的 setXxx()系列方法为sql 中的? 赋值

pstmt.setString(1,userName); //给第一个?赋值userName

//4、调用pstmt 的 executeUpdate(没有参数) 或 executeQuery(没有参数)方法,注意没有参数

resultSet rs = pstmt.executeQuery();

JdbcUtils1.0小工具

面向接口编程

步骤

1、创建UserDao接口

2、创建UserDaoImpl实现UserDao

3、在类中对UserDao进行实例化:private UserDao = DaoFactory.getUserDao()

4、创建user.properties配置文件,配置UserDao接口实现类名称

5、DaoFactory得到UserDao实现类名称,通过反射完成创建对象,提供getUserDao()

InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");

props = new Properties();

props.load(in)

String daoClassName = props.getProperty("...UserDao");

Class clazz = Class.forName(daoClassName);

return (UserDao)clazz.newInstance();

注意:java.sql包下的东西不能出现在Dao以外的地方

util包下的Date类型与sql包下的Date类型之间转换

背景:数据库中存储java.sql包下下的Date类型,然而我们需要用java.util包下的Date类型进行操作

1、java.util.Date --> java.sql.Date、Time、Timestamp

把util包下的Date转化成毫秒值,然后使用毫秒值创建sql包下Date

java.util.Date date = new java.util.Date();

long l = date.getTime();

java.sql.Date sqlDate = new java.sql.Date(l);

2、java.sql.Date、Time、Timestamp --> java.util.Date

java.sql.Date是java.util.Date的子类,无需转换

大数据处理 

大数据即大的字节或字符数据

准备:配置MySQL数据库的my.ini 文件,最后一行加max_allowed_packed = 10485760(10M)

  处理CLOB数据

在实际开发中,CLOB用于存储大文本数据,但是对于MySQL而言,大文本数据的存储是用TEXT类型表示的

  处理BLOB数据

CLOB用于存储二进制数据,如图片、电影等

eg:

//存入数据库

  byte[] bytes = IOUtils.toByteArray(new FileInputStream("D:/好久不见.mp3"));

  Blob blob = new SerialBlob(bytes);

  pstmt = setBlob(3,blob);

//从数据库取

  if(rs.next()){

    Blob blob = rs.getBlob("data");

    InputStream in = blob.getBinaryStream();

    OutputStream out = new FileOutputStream("c:/nolongsee.mp3");

    IOUtils.copy(in,out);

  }

JDBC批处理 

  Statement批处理

  PreparedStatement批处理

  准备:jdbc:mysql://localhost:3306/bbs?rewriteBatchedStatements=true

  eg:

    String sql = "insert into users values(?,?,?,?)";

    preStmt = conn.prepareStatement(sql);

    for(int i = 0; i<5; i++){

      preStmt.SetString(1,"name"+i);

      preStmt.SetString(2,"password"+i);

      preStmt.SetString(3,"email"+1+"@baron.com")

      preStmt.SetString(4,Date.valueOf("1989-02-19"));

      preStmt.addBatch();

    }

    preStmt.executeBatch();

以上是关于JDBC的主要内容,如果未能解决你的问题,请参考以下文章

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

JDBC操作数据库之查询数据

如何在片段中填充列表视图?

在 myeclipse中进行连接sql server的测试

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段