准备工作(使用自制的EasyBuy.sql脚本进行练习):
--创建用户
create user easybuy identified by easybuy;
--授权
grant connect, resource to easybuy;
--连接
conn easybuy/easybuy
--导入脚本
start C:\Users\zygycp\OneDrive\Documents\oracle\EasyBuy.sql
JDBC六大步,statement
JDBC:Java Database Connectivity :Java版本的ODBC(1960年SUN公司提出)
ODBC:(Open Database Connectivity)(一个以C语言为基础去访问SQL为基础数据库引擎的接口,它提供了一致的接口用于和数据库沟通以及访问数据)
Java | |||
Oracle | MySQL | SQL Server | ... |
可以利用JDBC技术,通用的写法,与不同的数据库进行交互
JDBC提供两部分API:
- 一部分针对数据库厂商提供的,每个数据库厂商针对接口提供实现类
- 一部分针对应用程序开发人员的
利用JDBC,可以与数据库建立连接,发送SQL语句,得到结果集并处理
java.sql
Driver:驱动接口
驱动方式:四种
- jdbc=>odbc=>DB
- jdbc=>客户端RDBMS=>DB
- jdbc=>中间服务器=>DB 基于网络的Java协议
- jdbc=>DB 基于Java的本地协议
常用API:
- 包:Java.sql
Driver:数据库驱动接口
DriverManager:驱动管理类
Connection:连接接口,代表与数据库的一个连接
Statement:用于执行SQL语句
- PreparedStatement:Statement的子接口
- CallableStatement:Statement的子接口
ResultSet:结果集,查询会返回一个结果集,等待处理
六大步
- 准备工作:项目中导入ojdbc6.jar,拷贝到项目中,右击:build path->add to build path(架包可在该出找到:Y:\OracleXE\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar)
1. 注册数据库驱动
- oracle.jdbc.driver.OracleDriver(该类在架包中)
- 创建一个驱动对象,并注册(可以利用Driver driver = new OracleDriver();DriverManager.register(driver))
Class:是一个类,每个类加载到内存时,都有一个对应的Class类型的对象
//加载这个全类名到对应的类到内存,会执行对应的static{},静态代码块,里面包含了创建驱动对象并注册
//Class.forName("全类名");
Class.forName("oracle.jdbc.driver.OracleDriver");
2. 与数据库建立连接
- DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","easybuy","easybuy") ==> 返回一个连接对象,Connection实现类对象
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","easybuy","easybuy");
- URL: jdbc:oracle:thin:@host:端口号:SID localhost:本地 1521:oracle数据库的端口号 XE:XE版本数据库自动创建的实例
- 数据库连接的用户名:
- 数据库连接的口令:
3.创建可以执行SQL语句的Statement
- 利用连接对象
- conn.createStatement();
Statement stmt = conn.createStatement();
- =>返回一个Statement实现类对象
4.执行SQL语句
- 对于增删改:stmt.executeUpdate("sql语句");
- 返回int类型的值,影响的行数
- 对于查询:stmt.executeQuery("sql语句");
- 返回一个ResultSet,结果集
- 注:这里SQL语句不能写分号,否则报错
5. 处理结果集,对于查询才有
- 结果集中有一个游标:可以指向结果集中的行
- 默认不指向任何一行
- rs.next():让游标指向下一行,如果有下一行,返回true
- 如果没有下一行,返回false
- rs.getXXX(列在结果集中的下标或者列名)
rs.getLong(1) 或 rs.getLong(id)
- eg
-
//结果集中有多行,可以利用循环 while(rs.next()){ //行的处理 }
6. 资源释放
- ResultSet,Statement,Connection
- 按照后打开的先关闭顺序
实例如下:
定义JDBCDemo和User两个类进行演示
package com.zhang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
JDBCDemo demo = new JDBCDemo();
try {
//方法调用
List<User> list = demo.queryUser();
//遍历集合
for (User user:list) {
System.out.println(user);
}
/*int rows = demo.updatePasswordById(1, "aaa");
System.out.println(rows);*/
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装一个方法,完成六大步的操作
public List<User> queryUser() throws ClassNotFoundException, SQLException {
List<User> list = new ArrayList<>();
//SELECT id,username,...FROM t_user
//1.注册数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.与数据库建立连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
//3.创建可以执行SQL语句的Statement
Statement stmt = conn.createStatement();
//4.执行SQL语句
/*
* id NUMBER(11),
username VARCHAR2(25),
password VARCHAR2(25),
sex NUMBER(1) DEFAULT 0,
id_number VARCHAR2(18),
tel VARCHAR2(11),
addr VARCHAR2(100),
*/
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user";
ResultSet rs = stmt.executeQuery(sql);
//5.处理结果集
while(rs.next()) {
//读一行,放到一个新建的对象中
User user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
list.add(user);
}
//6.释放资源
if(rs!=null) {
rs.close();
}
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return list;
}
public int updatePasswordById(long id,String password) throws ClassNotFoundException, SQLException {
//1.注册数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.与数据库建立连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
//3.创建可以执行SQL语句的Statement
Statement stmt = conn.createStatement();
//4.执行SQL语句
//单引号保证password的前后都有单引号
String sql = "UPDATE t_user SET password='" +
password + "' WHERE id="+id;
System.out.println(sql);
int rows = stmt.executeUpdate(sql);
//6.释放资源
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
}
package com.zhang.jdbc;
public class User {
/*
* id NUMBER(11),
username VARCHAR2(25),
password VARCHAR2(25),
sex NUMBER(1) DEFAULT 0,
id_number VARCHAR2(18),
tel VARCHAR2(11),
addr VARCHAR2(100),
*/
private long id;
private String username;
private String password;
private int sex;
private String idNumber;
private String tel;
private String addr;
public User() {}
public User(long id, String username, String password, int sex, String idNumber, String tel, String addr) {
super();
this.id = id;
this.username = username;
this.password = password;
this.sex = sex;
this.idNumber = idNumber;
this.tel = tel;
this.addr = addr;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", sex=" + sex + ", idNumber="
+ idNumber + ", tel=" + tel + ", addr=" + addr + "]";
}
}
要求:
- 修改这个方法,返回一个结果
- 数据库到Java的映射关系
- 数据库 --> Java
- 表 类
- 列(字段) 类的属性
- 行 类的实例
练习2:定义一个方法,通过id修改对应用户的密码(形参:id,password)
JDBC需求:
- 查询,
- 一行:比如通过id查找一个用户,返回值User或者List
- 处理结果集时,if也可以
- 多行:返回List
- 处理结果集时,while(循环)
- 一行:比如通过id查找一个用户,返回值User或者List
- 增删改:
- 返回影响的行数,没有结果集的处理
- 注:目前需要参数,以形参输入,注意拼接,很容易出错,尤其文本型,需要单引号
================
练习:
1.通过性别查找全部用户,并按照用户名升序排序
2.通过用户名查找对应的用户
3.通过id删除一个用户
4.添加一个用户到用户表,id可以使用序列t_user_id_seq
使用上面的User类,UserJDBC类如下,
package com.zhang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class UserJDBC {
public static void main(String[] args) {
// TODO Auto-generated method stub
UserJDBC jdbc = new UserJDBC();
try {
//通过性别查找全部用户,并按照用户名升序排序
/*List<User> list = jdbc.queryUsers(0);
for(User user:list) {
System.out.println(user);
}*/
//查询
/*User user = jdbc.queryUser("xiaoming");
System.out.println(user);*/
//添加用户
/*User user = new User(0,"lisi","123",0,"123123123123123123","111","111");
int rows = jdbc.addUser(user);
System.out.println(rows);
System.out.println(jdbc.queryUser("lisi"));*/
//删除用户
int rows = jdbc.deleteUserById(10);
System.out.println(rows);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通过性别查找全部用户,并按照用户名升序排序
public List<User> queryUsers(int sex) throws SQLException, ClassNotFoundException {
List<User> list = new ArrayList<>();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user WHERE sex=" +sex+ "ORDER BY username";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
//读一行,放到一个新建的对象中
User user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
list.add(user);
}
if(rs!=null) {rs.close();}
if(stmt!=null) {stmt.close();}
if(conn!=null) {conn.close();}
return list;
}
//通过用户名查找对应的用户
public User queryUser(String username) throws ClassNotFoundException, SQLException {
User user = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user WHERE username='" +username+ "'";
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) {
user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
}
if(rs!=null) {rs.close();}
if(stmt!=null) {stmt.close();}
if(conn!=null) {conn.close();}
return user;
}
//通过id删除一个用户
public int deleteUserById(long id) throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "DELETE FROM t_user WHERE id=" + id;
int rows = stmt.executeUpdate(sql);
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
//添加一个用户到用户表,id可以使用序列t_user_id_seq
public int addUser(User user) throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
* 首先要创建序列,语法如下
* CREATE SEQUENCE t_user_id_seq
* START WITH 10
* INCREMENT BY 1;
String sql = "INSERT INTO t_user(id,username,password,sex,id_number,tel,addr)"
+ "VALUES(t_user_id_seq.NEXTVAL,'"+user.getUsername()+ "','"+user.getPassword()+ "',"+user.getSex()+ ",'"+user.getIdNumber()+ "','"+user.getTel()+ "','"+user.getAddr()+ "'" +")";
int rows = stmt.executeUpdate(sql);
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
}