1、Java中专门为JDBC提供的模块(java.sql),模块中核心包java.sql。JDBC中核心的组成就是DriverManger类和若干接口(Connection、Statement、PreparedStatement、ResultSet)。JDBC的程序数据库访问:
①JDBC-ODBC桥连接(不会再使用):利用微软的ODBC技术进行数据库的连接,而后再利用JDBC技术访问ODBC技术进行数据库的开发。(程序→JDBC→ODBC→数据库,操作性能很差)
②JDBC连接:直接利用JDBC进行数据库的连接处理。一般直连接本地数据库
③JDBC网络连接:通过特定的网络协议连接指定的数据库。(程序→JDBC→网络数据库(IP地址、端口号))
④JDBC协议连接:自己通过编写指定的协议操作实现数据库的访问。
2、连接MySQL数据库
import java.sql.Connection;
import java.sql.DriverManager;
public class ImportDB {
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/model?useSSL=false&serverTimezone=UTC";
private static final String DATABASE_USER = "";
private static final String DATABASE_PASSWORD = "";
public static void main(String[] args) throws Exception {
Connection conn = null ; //每一个Connection接口对象描述的是一个用户连接
Class.forName(DATABASE_DRIVER) ; //向容器中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD) ;
System.out.println(conn) ;
conn.close();
}
}
运行结果:
整个JDBC设计实现的就是一个工厂类的处理机制。DriverManager是一个工厂,不同的数据生产商利用JDBC提供的标准(接口)实现各自的数据库处理操作。
3、Statement接口
java.sql.Statement是JDBC中提供的数据库的操作接口,利用其可以实现数据的更新与查询。接口定义:public interface Statement extends Wrapper, AutoCloseable
每一次进行数据库操作完成之后都应该关闭Statement操作,一条SQL的执行一定是一个Statement的对象。要想获取Statement接口对象,就必须依靠Connection接口提供的方法:
获取Statement接口对象:public Statement createStatement() throws SQLException
获取Statement接口对象后,就可以使用SQL进行处理,方法支持:
①数据更新处理(INSERT、UPDATE、DELETE):int executeUpdate(String sql) throws SQLException返回的是修改的行数
②数据查询处理(SELECT、统计查询、复杂查询):public ResultSet executeQuery(String sql) throws SQLException返回查询结果
数据修改:
Statement stmt = conn.reateStatement() ; //创建数据库的操作对象
int count = stmt.excuteUpdate(sql) ; //返回影响行数
数据查询:
//在程序开发之中SELECT子句后面必须跟上具体的字段名,写“*”的都是垃圾代码
ResultSet rs = stmt.executeQuery(sql) ; //执行查询
while(rs.next()) {
int id = rs.getInt(1) ;
...
}
需要注意的是,ResultSet对象是保存在内存之中的。
4、PreparedStatement接口
利用Statement执行SQL语句存在的问题:
①不能很好的描述日期的形式;
②需要进行SQL语句的拼凑处理会导致SQL语句的编写与维护困难;
③对于一些敏感的字符数据无法进行合理拼凑(如特殊字符)。
为解决上述问题,java.sql包中又提供了一个Statement子接口:PreparedStatement
接口定义:public interface PreparedStatement extends Statement
依然通过Connection获取PreparedStatement接口实例:public PreparedStatement prepareStatement(String sql) throws SQLException
操作方法:
数据更新:public int executeUpdate() throws SQLException
数据查询:public ResultSet executeQuery() throws SQLException
String title = "标题" ;
double price = 99.8 ;
Date date = "1998-03-04" ;
String sql = "INSERT INTO news(nid,title,price,date) VALUES (id,?,?,?)" ; //必须通过占位符
Connection conn = null ; //每一个Connection接口对象描述的是一个用户连接
Class.forName(DATABASE_DRIVER) ; //向容器中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD) ;
PreparedStatement pstmt = conn.prepareStatement(sql) ;
//在执行具体的数据库操作之前为占位符设置内容,按顺序设置
pstmt.setString(1,title) ;
pstmt.setDouble(2,price) ;
pstmt.setDate(3,new java.sql.Date(date.getTime())) ; //date.getTime()日期型转long型
int count = pstmt.executeUpdate() ; //不再需要sql参数
System.out.println(count) ;
conn.close();
注意:在JDBC,无论是PreparedStatement设置的日期时间还是使用ResultSet获取的日期时间实际上都是java.util.Date的子类
数据查询:
查询全部内容:
PreparedStatement pstmt = conn.prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
有条件(根据id查询 id = ? )查询,要设置pstmt.setInt(1,5);
【重要】在进行全部数据查询时如果返回内容过多则一定会造成内存的大量占用,此时可以通过分页的形式实现数据的查询处理。
模糊查询,结果分页:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ImportDB {
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/shop?useSSL=false&serverTimezone=UTC";
private static final String DATABASE_USER = "";
private static final String DATABASE_PASSWORD = "";
public static void main(String[] args) throws Exception {
int currentPage = 2 ; //当前页
int lineSize = 3 ; //每页显示的数据行
String keyWord = "茶" ; //查询关键字
String sql = " SELECT * FROM goodstable WHERE gname LIKE ? LIMIT ?,? " ;
Connection conn = null ; //每一个Connection接口对象描述的是一个用户连接
Class.forName(DATABASE_DRIVER) ; //向容器中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD) ;
PreparedStatement pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1, "%" + keyWord + "%") ;
pstmt.setInt(2, (currentPage - 1) * lineSize); //从表中的第(currentPage - 1) * lineSize条数据开始
pstmt.setInt(3, lineSize); //读取三条数据
ResultSet rs = pstmt.executeQuery() ;
while(rs.next()) {
int id = rs.getInt(1) ;
String gname = rs.getString(2) ;
double gprice = rs.getDouble(3) ;
System.out.println(id + "-" + gname + "-" + gprice) ;
}
conn.close();
}
}