上海网络网站建个人软件制作网站
概述
Java DataBase Connectivity,Java 数据库连接
 执行SQL的Java API 为多种关系型数据提供统一访问
FUNCTION
- 建立与数据库的连接
 - 向数据库发送 SQL 语句
 - 处理从数据库返回的结果
 
四种常见JDBC驱动程序
- JDBC-ODBC Bridge driver
 - native-API, partly Java driver
 - JDBC-Net pure Java driver
 - native protocol, pure Java driver
 
JDBC连接过程
底层API,不能直接访问数据库
 依赖于相应数据库厂商提供的JDBC驱动程序 —— 驱动程序是连接JDBC API与具体数据库之间的桥梁
 
 JDBC连接MySQL数据库步骤:
 (1)加载JDBC驱动程序;
 (2)创建数据库连接;
 (3)创建Statement对象;
 (4)执行SQL语句;
 (5)处理执行SQL语句的返回结果;
 (6)关闭连接。
 
- 加载JDBC驱动程序
 
// 加载驱动程序方法 用java.lang.Class类的静态方法Class.forName("com.mysql.cj.jdbc.Driver"); 
 
if 加载成功
 then 系统将加载的驱动程序注册到DriverManager类中
else 抛出ClassNotFoundException异常
try {Class.forName ("com.mysql.cj.jdbc.Driver");     
} catch (ClassNotFoundException ex) {System.out.println("加载数据库驱动时抛出异常!");ex.printStackTrace();
}
 
 2. 创建数据库连接 
Connection接口代表与数据库的连接,只有建立了连接,用户程序才能操作数据库
一个应用程序可与单个数据库有一个或多个连接,也可以与多个数据库有连接
调用DriverManager类的getConnection()方法
Connection conn = DriverManager.getConnection(String url, String userName, String password);// 接数据库的路径、用户名及密码
 
返回值类型为java.sql.Connection。
 失败, 抛出 SQLException异常
连接BookStore数据库,则连接数据库路径的写法如下
jdbc:mysql://localhost:3306/bookstore
也可以采用带数据库数据编码格式的方式
jdbc:mysql://localhost:3306/bookstore?useUnicode=true&chara cterEncoding=gb2312
try {String url ="jdbc:mysql://localhost:3306/bookstore";String user="root"; //访问数据库的用户名String password="123456"; //访问数据库的密码Connection conn= DriverManager.getConnection(url,user,password); System.out.println("连接数据库成功!");
} catch (SQLException ex) {System.out.println("连接数据库失败!");ex.printStackTrace();
}
 
 3. 创建Statement对象 执行SQL语句,必须创建一个Statement对象 
Connection接口的createStatement()方法可以创建Statement对象,用来执行静态的SQL语句
prepareStatement(String
 sql)方法可以创建PreparedStatement对象用来执行动态的SQL语句
Statement stmt=conn.createStatement();
 
String sql = "select * from users where u_id>? and u_sex=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
 

 
 4. 执行SQL语句
¨Statement对象的常用方法有executeQuery()、executeUpdate()等, 用这些方法执行SQL语句
ResultSet executeQuery(String sql)方法:产生单个结果集,如select语句,返回一个ResultSet对象int executeUpdate(String sql)方法:该方法用于执行 INSERT、UPDATE 或 DELETE 语句以及SQL DDL语句 —— 返回一个整数表示受到影响的行数,如果是CREATE和DROP TABLE这种语句,返回 0
//经创建了Statement对象stmt,查询users表中的所有记录,并将查询结果保存到ResultSet对象rs中
String sql = "select * from users";
ResultSet rs= stmt.executeQuery(sql);// 删除users表中u_id为7的记录String sql = "delete from users where u_id=7";
int rows= stmt.executeUpdate(sql);
 
PreparedStatement对象也可以调用executeQuery()和executeUpdate()两个方法,但都不需要带参数
String sql = "delete from users where u_id=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,7);
int rows= pstmt.executeUpdate ();
 
 5. 处理执行SQL语句的返回结果 
针对 ResultSet对象
常用方法
-  
boolean next():指向当前数据行的指针,指针最初指向第一行之前.移动到下一行。如果没有下一行时,则返回false
 -  
getXxx(列名或列索引):获取所在行指定的值,getString(“name”),表示获取当前行列名为“name”的列值。 如果用索引,索引值从1开始而不是0
 
String sql = "select * from users";
ResultSet rs=stmt. executeQuery(sql);
rs.next();
int u_id=rs.getInt(1); 
//或int u_id=rs.getInt("u_id");
String u_name=rs.getString(2); 
String u_sex=rs.getString("u_sex");
 
 6.关闭连接 
rs.close();
stmt.close();
conn.close();
 
JDBC数据库操作
1 增加数据- Statement对象提供的带参数的executeUpdate()方法
 - PreparedStatement对象提供的无参数的executeUpdate()方法
 
使用UPDATE命令来实现更新操作
// State的SQL语句需要写好
Statement stmt = conn.createStatement();
String sql = "update users set u_pwd='654321' where 
u_name='zhangping'";
int temp = stmt.executeUpdate(sql);// PS的SQL可以留空后续填
String sql = "update users set u_pwd=? where u_name=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "654321");
pstmt.setString(2, "zhangping1");
int temp =pstmt.executeUpdate();
 
 3 删除数据 
Statement stmt = conn.createStatement();
String sql = "delete from users where u_name='zhangping'";
int temp = stmt.executeUpdate(sql);String sql = " delete from users where u_name=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "zhangping1");
int temp =pstmt.executeUpdate();
 
 4 查询数据 executeQuery()方法 
 5 批处理 
步骤
- 使用addBatch(sql)方法,将需要执行的SQL命令添加到批处理中。
 - 使用executeBatch()方法,执行批处理命令。
 - 使用clearBatch()方法,清空批处理队列。
 
三种方法
- 批量执行静态的SQL;
 - 批量执行动态的SQL;
 - 批量执行混合模式的SQL。
 
- 静态:Statement对象的addBatch()方法
 
优点: 以向数据库发送多条不同的SQL语句、
缺点:没有预编译,执行效率较低 —— 数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复使用多条相同的SQL语句
 
- 批量执行动态SQL:用PreparedStatement对象的addBatch()
 
优点:预编译后的SQL语句,执行效率高
缺点:只适用SQL语句相同,但参数不同的批处理
 —— 理经常用于在同一个表中批量更新表中的
 数据
- 批量执行混合模式的SQL PreparedStatement对象的addBatch()方
 
数据源
连接池:接建立一个“缓冲池”,预先在“缓冲池”中放入一定数量的连接。需要建立数据库连接时,只需从“缓冲池”中取出一个
数据源(Data Source):Web开发中获取数据库连接的首选方法。
- 首先创建一个数据源对象
 - 数据源简历连接对象
 - 连接池管理这些对象
 
JNDI(Java Naming and Directory Interface):名称于对象绑定技术
- 对象工厂创建对象 —— 和唯一名称绑定,通过名称获取某对象访问
 - 应用程序可以通过名称来获得某个对象的访问
 
如何配置 Tomcat服务器
- 将MySQL数据库的JDBC驱动程序包复制到Tomcat安装路径下的lib文件夹中
 - 配置数据源。配置Tomcat根目录下conf文件夹中的文件context.xml
 - 在应用程序中使用数据源。配置数据源后,就可以使用javax.naming.Context接口的lookup()方法来查找JNDI数据源
 
InitialContext ctx = new InitialContext();
DataSource ds =
(DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
stmt.execute("SOME SQL QUERY");
 
分页查询的例子
知识点补充
 如果需要在结果集中前后移动或显示结果集指定的一条记录的时候,就要用到游动查询,这时应使用**带参数的createStatement()**方法
创建语句对象,其语法格式如下
Statement stmt=conn.createStatement(int type,int concurrency);
 
type的取值 —— 滚动方式
- ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动。
 - ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
 - ResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
 
concurrency的取值决定是否可以用结果集更新数据库
- ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
 - ResultSet.CONCUR_UPDATETABLE:能用结果集更新数据库中的表。
 
