数据库开发(九 JDBC篇一)JDBC六大步(操作流程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang___gang/article/details/84391559

准备工作(使用自制的EasyBuy.sql脚本进行练习):

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:驱动接口

扫描二维码关注公众号,回复: 4312628 查看本文章

驱动方式:四种

  • 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(循环)
  • 增删改:
    • 返回影响的行数,没有结果集的处理
  • 注:目前需要参数,以形参输入,注意拼接,很容易出错,尤其文本型,需要单引号

================

练习:

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;
	}
	
}

猜你喜欢

转载自blog.csdn.net/zhang___gang/article/details/84391559