JDBC 第一篇
来源:互联网 发布:南京浦口永宁网络问政 编辑:程序博客网 时间:2024/05/18 03:10
JDBC简介:
- JDBC(Java DataBase Connectivity)就是Java数据库连接,实际上就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
- JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
Class.forName(“com.mysql.jdbc.Driver”)
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);
Statement stmt = con.createStatement();
String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);(这里的m指的是影响的行数)ResulSet resultset=stmt.executeQuery(sql);
resultset.next();
resultset.getString(下标);(下标是从1开始,而不是从零)关闭流(倒关)
rs.close();
stmt.close();
con.close();void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;
void afterLast():把光标放到最后一行的后面;
boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;
boolean last():把光标放到最后一行的位置上;
boolean isBeforeFirst():当前光标位置是否在第一行前面;
boolean isAfterLast():当前光标位置是否在最后一行的后面;
boolean isFirst():当前光标位置是否在第一行上;
boolean isLast():当前光标位置是否在最后一行上;
boolean previous():把光标向上挪一行;
boolean next():把光标向下挪一行;
boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
boolean absolute(int row):绝对位移,把光标移动到指定的行上;
int getRow():返回当前光标所有行。con.createStatement():生成的结果集:不滚动、不敏感、不可更新!
con.createStatement(int,int):
第一个参数:
ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
第二个参数:
CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。Statement createStatement(int resultSetType, int resultSetConcurrency) PreparedStatement(它是Statement接口的子接口)
作用:防SQL攻击;提高代码的可读性、可维护性、提高效率
String sql = “select * from tab_student where s_number=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, “S_1001”);
ResultSet rs = pstmt.executeQuery();
rs.close();
pstmt.clearParameters();//每次执行需要清空的
pstmt.setString(1, “S_1002”);
rs = pstmt.executeQuery();JdbcUtils工具类
public class JdbcUtils { private static final String dbconfig = "dbconfig.properties"; static { try { InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(dbconfig); private static Properties prop = new Properties(); prop.load(in); Class.forName(prop.getProperty("driverClassName")); } catch(IOException e) { throw new RuntimeException(e); } } public static Connection getConnection() { try { return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("username"), prop.getProperty("password")); } catch (Exception e) { throw new RuntimeException(e); } }}
- 经过class.forName()得到Class之后,调用newInstance()的到对象
时间类型
- java.sql包下给出三个与数据库相关的日期时间类型,分别是:
Date:表示日期,只有年月日,没有时分秒。会丢失时间;
Time:表示时间,只有时分秒,没有年月日。会丢失日期;
Timestamp:表示时间戳,有年月日时分秒,以及毫秒。- 数据库类型与java中类型的对应关系:
DATE -> java.sql.Date
TIME -> java.sql.Time
TIMESTAMP -> java.sql.Timestamp- 时间类型的转换:
java.util.Date 转换为 java.sql.Date、Time、Timestamp
把util的Date转换成毫秒值
使用毫秒值创建sql的Date、Time、Timestamp
java.util.Date date = new java.util.Date();long l = date.getTime();java.sql.Date sqlDate = new java.sql.Date(l);
大数据
- 标准SQL中提供了如下类型来保存大数据类型:
类型 长度
tinyblob (256B)
blob (64K)
mediumblob(16M)
longblob (4G)
tinyclob (256B)
clob (64K)
mediumclob (16M)
longclob(4G)- mysql中使用如下四种类型来处理文本大数据:
类型 长度
tinytext (256B)
text (64K)
mediumtext (16M)
longtext (4G)
装入
con = JdbcUtils.getConnection(); String sql = "insert into tab_bin(filename,data) values(?, ?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, "a.jpg"); InputStream in = new FileInputStream("f:\\a.jpg");[得到一个输入流对象] pstmt.setBinaryStream(2, in);[为第二个参数赋值为流对象] pstmt.executeUpdate();
取出:
con = JdbcUtils.getConnection(); String sql = "select filename,data from tab_bin where id=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); rs = pstmt.executeQuery(); rs.next(); String filename = rs.getString("filename"); OutputStream out = new FileOutputStream("F:\\" + filename)[使用文件名来创建输出流对象。]; InputStream in = rs.getBinaryStream("data")[读取输入流对象]; IOUtils.copy(in, out)[把in中的数据写入到out中。]; out.close();
批处理
- 批处理只针对更新(增、删、改)语句
- 可以多次调用Statement类的addBatch(String sql)方法,把需要执行的所有SQL语句添加到一个“批”中,然后调用Statement类的executeBatch()方法来执行当前“批”中的语句。
- void addBatch(String sql):添加
- int[] executeBatch():执行所有
- void clearBatch():清除
- 当执行了“批”之后,“批”中的SQL语句就会被清空!
PreparedStatement批处理
PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。
con = JdbcUtils.getConnection(); String sql = "insert into stu values(?,?,?,?)"; pstmt = con.prepareStatement(sql); for(int i = 0; i < 10; i++) { pstmt.setString(1, "S_10" + i); pstmt.setString(2, "stu" + i); pstmt.setInt(3, 20 + i); pstmt.setString(4, i % 2 == 0 ? "male" : "female"); pstmt.addBatch()[PreparedStatement的addBatch()方法没有参数!]; } pstmt.executeBatch[执行批]();
- JDBC 第一篇
- JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】
- 第一篇。
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- 第一篇
- Filter过滤器中访问getSession()要转化
- 使用 Docker 搭建 Java Web 运行环境
- 闭包
- NYOJ 169
- java进程、线程通信方法以及进程与线程的区别
- JDBC 第一篇
- POJ3468-线段树+lazy思想
- 获取Chrome浏览器的Cookie
- android studio运行AVD时显示“CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)”
- POJ 1416 Shredding Company (DFS)
- mtk 6572平台led指示灯 调试
- Effective Java系列读后感(一)-创建和销毁对象
- POJ 1286-Necklace of Beads(Polya定理-旋转+翻转 串项链)
- 斐波那契数