JDBC
学习目标
掌握JDBC的意义和使用
掌握Java的分层开发
为什么需要JDBC
JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力。
JDBC的使用
工作原理
JDBC API:提供供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:
DriverManager类
Connection接口
Statement接口
ResultSet接口
DriverManager:依据数据库的不同,管理各种不同的JDBC驱动。
JDBC 驱动:由数据库厂商提供,负责连接各种不同的数据库。
JDBC API主要功能:与数据库建立连接、执行SQL 语句、处理结果。
DriverManager :依据数据库的不同,管理JDBC驱动。
Connection :负责连接数据库并担任传送数据的任务。
Statement :由 Connection 产生、负责执行SQL语句。
ResultSet:负责保存Statement执行后所产生的查询结果。
使用流程
JDBC的使用流程如下:
try {
//1.加载JDBC驱动
Class.forName(JDBC驱动类);
}
… …
try {
//2.与数据库建立连接
Connection con=DriverManager.getConnection(URL,数据库用户名,密码);
//3.发送SQL语句并得到结果
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM Table1”);
//4.处理返回结果
while (rs.next()) {
int x = rs.getInt(“a”);
String s = rs.getString(“b”);
float f = rs.getFloat(“c”);
}
//5.释放资源
rs.close();
stmt.close();
con.close();
}
数据库访问基类:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
数据库访问基类
*/
public class BaseDao {
//数据库驱动
private String driver=“com.mysql.jdbc.Driver”;
//数据库连接地址
private String url=“jdbc:mysql://localhost:3306/orcl”;
//数据库用户名
private String name=“root”;
//数据库密码
private String password="";public Connection conn;//数据库连接对象
public PreparedStatement ps;//数据库操作对象
public ResultSet rs;//存放结果数据/**
- 获取数据库连接
*/
public Connection getConn(){
try {
Class.forName(driver);
this.conn=DriverManager.getConnection(url,name,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) throws Exception {
//1. 获取连接
Connection conn=new BaseDao().getConn();
//2. 执行查询
String sql=“select * from k_user”;
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
//3. 循环输出数据
while(rs.next()){
System.out.println(“用户名是:”+rs.getString(“username”));
}
} - 获取数据库连接
}
分层开发
为什么要使用分层开发
分层开发是一种化大为小,分而治之的软件开发方法。
例如,一所学校被分为若干学院,各学院下面再分若干专业,这样的分层更易于管理。
一道好的菜放到客户的餐桌上需要经过以下几层:
制造一辆汽车需要经过以下几层:
分层开发的特点及好处
分层的特点:
每一层都有自己的职责。
上一层不用关心下一层的实现细节,上一层通过下一层提供的对外接口来使用其功能。
上一层调用下一层的功能,下一层不能调用上一层功能。
分层开发的好处:
各层专注于自己功能的实现,便于提高质量。
便于分工协作,提高开发效率。
便于代码复用。
便于程序扩展。
Java中的分层开发
不同层之间通过实体类传输数据:
DAO,Data Access Object(数据存取对象),位于业务逻辑和持久化数据之间,实现对持久化数据的访问。
DAO起着转换器的作用,把实体类转换为数据库中的记录:
DAO模式的作用:
隔离业务逻辑代码和数据访问代码
隔离不同数据库的实现
编码实操
使用JDBC分层开发,完成完成用户登录、用户数据增删改查功能。
数据访问层代码
基类BaseDao的源码:
import java.sql.*;
/**
- Dao层的基类,获取数据库连接
*/
public class BaseDao {
private String driver = “com.mysql.jdbc.Driver”;
private String url = “jdbc:mysql://localhost:3306/orcl”;
private String name = “root”;
private String pass = “123456”;
public Connection conn;
public PreparedStatement ps;
public ResultSet rs;
/**
- 得到数据库连接
*/
public Connection getConn() {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url, name, pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/** 测试连接 */
public static void main(String[] args) {
BaseDao bd = new BaseDao();
bd.getConn();
}
/** 关闭资源 **/
public void closeAll() {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (ps != null) {
ps.close();
ps = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/** 增删改的公用方法 **/
public int execSql(String sql, String param[]) {
int ret = 0;
this.conn = this.getConn();
try {
this.ps = conn.prepareStatement(sql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
ps.setString(i + 1, param[i]);
}
}
ret = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.closeAll();
}
return ret;
}
}
UserDao的源码:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.stock.entity.User;
/**
- 与用户相关的数据库操作
*/
public class UserDao extends BaseDao{
/**
- 用户登录
- @param userNo 用户名(编号)
- @param pwd 密码
- @return 用户对象
*/
public User login(String userNo, String pwd) {
String sql = “select * from k_user where userno=’”+userNo+"’ And pwd=’"+pwd+"’";
this.conn=this.getConn();
User user=null;
try {
this.ps=conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
user = new User();
user.setId(rs.getInt(“id”));
user.setUsername(rs.getString(“username”));
user.setUserno(rs.getString(“userno”));
user.setPwd(rs.getString(“pwd”));
}
} catch (SQLException e) {
e.printStackTrace();
}
this.closeAll();
return user;
}
/**
- 查询用户列表
- @return 用户集合
*/
public List findUserList() {
String sql = “select * from k_user order by id asc”;
this.conn=this.getConn();
List list = new ArrayList<>();
try {
this.ps=conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt(“id”));
user.setUsername(rs.getString(“username”));
user.setUserno(rs.getString(“userno”));
user.setPwd(rs.getString(“pwd”));
user.setAge(rs.getInt(“age”));
user.setSex(rs.getString(“sex”));
user.setPosition(rs.getString(“position”));
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
- 添加用户
- @param user 用户对象
- @return 是否添加成功
*/
public boolean addUser(User user) {
String sql = “insert into k_user(username,userno,pwd) values(’”+user.getUsername()+"’,’"+user.getUserno()+"’,’"+user.getPwd()+"’)";
this.conn=this.getConn();
try {
this.ps=conn.prepareStatement(sql);
int count=ps.executeUpdate();
if(count>0){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
/**
- 删除用户
- @param id 用户ID
- @return 是否删除成功
*/
public boolean deleteUser(String id) {
String sql = “delete from k_user where id=”+id;
this.conn=this.getConn();
try {
this.ps=conn.prepareStatement(sql);
int count=ps.executeUpdate();
if(count>0){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}
User实体类:
public class User {
private int id;//用户ID
private String userno;//用户编号
private String username;//用户姓名
private String pwd;//密码
private String sex;//性别
private int age;//年龄
private String position;//职位
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserno() {
return userno;
}
public void setUserno(String userno) {
this.userno = userno;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
业务逻辑层代码
UserService类:
import java.util.List;
import com.stock.dao.UserDao;
import com.stock.entity.User;
/**
- 业务类
- 用户相关的业务操作
*/
public class UserService {
UserDao userDao=new UserDao();
/**
- 用户登录
- @param userNo 用户名(编号)
- @param pwd 密码
- @return 用户对象
/
public User login(String userNo, String pwd) {
return userDao.login(userNo,pwd);
}
/* - 查询用户列表
- @return 用户集合
/
public List findUserList() {
return userDao.findUserList();
}
/* - 添加用户
- @param user 用户对象
- @return 是否添加成功
/
public boolean addUser(User user) {
return userDao.addUser(user);
}
/* - 删除用户
- @param id 用户ID
- @return 是否删除成功
*/
public boolean deleteUser(String id) {
return userDao.deleteUser(id);
}
}
用户操作类:
import java.util.List;
import java.util.Scanner;
/**
- 用户视图层
- 接收用户的选择并进行处理
*/
public class UserView {
UserService userService = new UserService();
Scanner sc = new Scanner(System.in);
/**
- 用户登录
*/
public User login() {
System.out.println(“请输入用户名”);
String userNo = sc.next();
System.out.println(“请输入密码:”);
String pwd = sc.next();
User user = userService.login(userNo, pwd);
if (user != null) {
System.out.println("登录成功!");
} else {
System.out.println("登录失败!!!");
}
return user;
}
/**
- 显示所有用户信息
*/
public void showUserList() {
System.out.println(“所有用户信息如下:”);
List list = userService.findUserList();
System.out.println(“用户ID\t\t用户代码\t\t用户姓名\t\t密码\t\t性别\t\t年龄\t\t职位”);
for (User user : list) {
System.out.println(user.getId() + "\t\t" + user.getUserno() + "\t\t"
+ user.getUsername() + "\t\t" + user.getPwd() + "\t\t"
+ user.getSex() + "\t\t" + user.getAge() + "\t\t"
+ user.getPosition());
}
}
public void addUser() {
System.out.println(“输入学号:”);
String userNo = sc.next();
System.out.println(“输入用户名:”);
String userName = sc.next();
System.out.println(“输入密码:”);
String pwd = sc.next();
User user = new User();
user.setUserno(userNo);
user.setUsername(userName);
user.setPwd(pwd);
if (userService.addUser(user)) {
System.out.println("添加用户成功");
} else {
System.out.println("添加用户失败");
}
}
public void deleteUser() {
System.out.println(“请输入要删除的用户id:”);
String id = sc.next();
if (userService.deleteUser(id)) {
System.out.println(“删除成功。”);
} else {
System.out.println(“删除失败!!!”);
}
}
}