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的主要内容,如果未能解决你的问题,请参考以下文章