常见连接数据库工具:
- 图形化工具:点击、拖拽就可以操作数据库,对用户友好,简单对数据操作,复杂数据库操作爱莫能助
- JDBC(驱动程序):调用jar包接口
- 窗口(命令行):输入完整SQL语句对复杂数据库查询
JDBC:在java中就是jar包,应用通过JDBC提供的统一接口就可以实现对不同数据库(ORACLE、Mysql)的使用,让我们不需要了解他们之间的差异与具体操作。
Connection对象:代表java应用程序对后端数据库的一条物理链接,基于链接执行sql语句
Statement stmt=conn.createStatement();
Statement对象:是sql的容器,通过executeQuery承载sql语句,进行增删改查,返回ResultSet对象/int。
ResultSet rs=stmt.executeQuery("select name from student");
ResultSet对象:代表查询的结果
获取行:
.next():向后移动一行
.previous():向前移动一行
.absolute():直接移动到某一行
获取列:
.getString(ColumnName/Index)
.getInt(ColumnName/Index)
.getObject(ColumnName/Index)
package com.tao.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class jdbctest { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useUnicode=true&characterEncoding=UTF-8"; static final String USER = "root"; static final String PASSWORD = "admin"; public static void main(String[] args) throws ClassNotFoundException { Connection conn = null; Statement stmt = null; ResultSet rs = null; // 装载驱动程序 Class.forName(JDBC_DRIVER); // 建立数据库连接 try { conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 执行sql语句 stmt = conn.createStatement(); rs = stmt.executeQuery("select name from student"); // 获取执行结果 while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { // 异常处理 e.printStackTrace(); } finally { //释放宝贵资源 try { if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
JDBC进阶:java程序运行在JVM中,JVM也有内存。
1.查询结果条目过多,防止内存溢出,一次载入较少记录。
游标:提供一种客户端读取部分结果集的机制,分批读取。
1.在DB_URL中设置useCursorFetch=true开启游标
2.使用setFetchSize()设置每次读多少
package com.tao.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class jdbctest { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8"; static final String USER = "root"; static final String PASSWORD = "admin"; public static void main(String[] args) throws ClassNotFoundException { Connection conn = null; PreparedStatement ptmt=null; ResultSet rs = null; // 装载驱动程序 Class.forName(JDBC_DRIVER); // 建立数据库连接 try { conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 执行sql语句 ptmt = conn.prepareStatement("select name from student"); ptmt.setFetchSize(1);//每次读取一条记录 rs=ptmt.executeQuery(); // 获取执行结果 while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { // 异常处理 e.printStackTrace(); } finally { //释放宝贵资源 try { if (conn != null) { conn.close(); } if (ptmt != null) { ptmt.close(); } if (rs != null) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
2.一行存储大字段内容,比如存储博文,怎么读取?
1.流方式读取,按区间读取
package com.tao.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class jdbctest { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8"; static final String USER = "root"; static final String PASSWORD = "admin"; static final String FILE_URL = "./text.txt"; public static void main(String[] args) throws ClassNotFoundException, IOException { Connection conn = null; PreparedStatement ptmt = null; ResultSet rs = null; // 装载驱动程序 Class.forName(JDBC_DRIVER); // 建立数据库连接 try { conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 执行sql语句 ptmt = conn.prepareStatement("select name from student"); ptmt.setFetchSize(1);// 每次读取一条记录 rs = ptmt.executeQuery(); // 获取执行结果 while (rs.next()) { InputStream in = rs.getBinaryStream("name"); File f = new File(FILE_URL); FileOutputStream out = new FileOutputStream(f); int temp = 0; while ((temp = in.read()) != -1) out.write(temp); out.close(); in.close(); } } catch (SQLException e) { // 异常处理 e.printStackTrace(); } finally { // 释放宝贵资源 try { if (conn != null) { conn.close(); } if (ptmt != null) { ptmt.close(); } if (rs != null) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
3.一次插入多条数据
1.批处理Statement
addBatch() //将sql打包为Batch
executeBatch() //执行sql
clearBatch() //清空Batch
package com.tao.test; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class jdbctest { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/schoolweb?useCursorFetch=true&useUnicode=true&characterEncoding=UTF-8"; static final String USER = "root"; static final String PASSWORD = "admin"; static final String FILE_URL = "./text.txt"; static final String[] users = {"张三","李四"}; public static void main(String[] args) throws ClassNotFoundException, IOException { Connection conn = null; Statement stmt = null; ResultSet rs = null; // 装载驱动程序 Class.forName(JDBC_DRIVER); // 建立数据库连接 try { conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 执行sql语句 stmt=conn.createStatement(); for(String user:users) { stmt.addBatch("insert into student(name) values('"+user+"')"); } stmt.executeBatch(); stmt.clearBatch(); } catch (SQLException e) { // 异常处理 e.printStackTrace(); } finally { // 释放宝贵资源 try { if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
4.中文问题
数据库: 实例、dabase、表、字段 级别内置编码(优先级从小到大)
JDBC编码:DB_URL+characterEncoding=utf-8