一個JDBC案例
一、定義
JDBC全稱為:Java DataBase Connectivity(java數(shù)據(jù)庫連接)。是SUN公司為了簡化、統(tǒng)一對數(shù)據(jù)庫的操作,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC,即Java數(shù)據(jù)庫編程接口,是一組標(biāo)準(zhǔn)的Java語言中的接口和類,使用這些接口和類,Java客戶端程序可以訪問各種不同類型的數(shù)據(jù)庫。比如建立數(shù)據(jù)庫連接、執(zhí)行SQL語句進(jìn)行數(shù)據(jù)的存取操作。
二、為什么要使用JDBC?
- 數(shù)據(jù)庫產(chǎn)品眾多,保守估計有100多種數(shù)據(jù),這樣造成我們應(yīng)用程序連接訪問數(shù)據(jù)庫缺乏統(tǒng)一的接口
- 應(yīng)用程序與數(shù)據(jù)庫之間兼容性太差
三、使用JDBC的好處
- 統(tǒng)一應(yīng)用平臺,實現(xiàn)異構(gòu)數(shù)據(jù)庫系統(tǒng)信息互訪
- 減少應(yīng)用程序與數(shù)據(jù)庫編碼工作
- 依靠 OOP技術(shù),提高代碼的復(fù)用性
?。DBC制定了統(tǒng)一訪問各類關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)接口,為各個數(shù)據(jù)庫廠商提供了標(biāo)準(zhǔn)接口的實現(xiàn)??!

jdbc交互.png
案例
實體類-User
package com.yeungkim.entity;
import java.io.Serializable;
import java.sql.Timestamp;
//實現(xiàn)序列化接口
public class User implements Serializable {
private String username ;
private String password;
private Integer uid;
private String phone;
private String email;
private Timestamp createDate;
private Integer isDel;
public User(String username, String password, int uid, String phone, String email, Timestamp createDate, int isDel) {
}
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 Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Timestamp getCreateDate() {
return createDate;
}
public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
}
public Integer getIsDel() {
return isDel;
}
public void setIsDel(Integer isDel) {
this.isDel = isDel;
}
public User() {
}
}
實體類-Detail
package com.yeungkim.entity;
import java.io.Serializable;
//實現(xiàn)序列化接口
public class Detail implements Serializable {
//使用包裝類數(shù)據(jù)類型
private Integer detailId;
private String address;
private Integer uid;
private Integer isDel;
//getter setter 封裝私有化
public Integer getDetailId() {
return detailId;
}
public void setDetailId(Integer detailId) {
this.detailId = detailId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Integer getIsDel() {
return isDel;
}
public void setIsDel(Integer isDel) {
this.isDel = isDel;
}
//無參構(gòu)造方法
public Detail() {
}
}
Dao-UseDao
package Dao;
import com.yeungkim.entity.User;
import java.util.List;
public interface UserDao {
//查詢所有用戶
List<User> selectAll();
//根據(jù)用戶名查詢用戶信息
User selectUserByName(String username);
//添加用戶信息
int insert(User user);
//根據(jù)id修改用戶信息,因為id已經(jīng)在user
int updateById(User user);
}
Dao-DetailDao
package Dao;
import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;
public interface DetailsDao {
int insertDetail(Detail detail, User user);
}
userDaoImpl
package Dao.impl;
import Dao.UserDao;
import com.yeungkim.entity.User;
import com.yeungkim.utils.Dbutils;
import jdk.nashorn.internal.ir.CallNode;
import javax.jws.soap.SOAPBinding;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public List<User> selectAll() {
List<User>users=null;
// uid, username, password, phone, email, create_date, is_del
String sql="select * from user where is_del=0";
//配置文件,變量
try {
Connection connection = Dbutils.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet!=null){
users=new ArrayList<>();
while (resultSet.next()){
//一次for循環(huán)就是一個對象
int uid =resultSet.getInt("uid");
String username=resultSet.getString("username");
String password=resultSet.getString("password");
String phone=resultSet.getString("phone");
String email=resultSet.getString("email");
Timestamp createDate=resultSet.getTimestamp("create_date");
int isDel=resultSet.getInt("is_del");
//將數(shù)據(jù)庫封裝到對象,添加到集合中
users.add(new User(username,password,uid,phone,email,createDate,isDel));
}
}
Dbutils.close(connection,preparedStatement,resultSet);
} catch (Exception e) {
e.printStackTrace();
}
//sql注入的問題
//
return users;
}
@Override
public User selectUserByName(String username) {
Connection connection=null;
ResultSet resultSet=null;
PreparedStatement preparedStatement=null;
User user=null;
//建立鏈接
try {
connection = Dbutils.getConnection();
//sql語句
String sql="select uid, username, password, phone, email,is_del from user where username=?";
//創(chuàng)建ps對象
preparedStatement = connection.prepareStatement(sql);
//設(shè)置參數(shù)
preparedStatement.setString(1,username);
//執(zhí)行查詢返回result 對象
resultSet = preparedStatement.executeQuery();
//判斷是否有數(shù)據(jù)
if(resultSet!=null&&resultSet.next()){
user=new User();
user.setUid(resultSet.getInt(1));
user.setUsername(resultSet.getString(2));
user.setPassword(resultSet.getString(3));
user.setPhone(resultSet.getString(4));
user.setEmail(resultSet.getString(5));
user.setIsDel(resultSet.getInt(6));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
Dbutils.close(connection,preparedStatement,resultSet);
}
return user;
}
@Override
public int insert(User user) {
//定義變量
int count=0;
//建立鏈接
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection = Dbutils.getConnection();
String sql="insert into user(username, password, phone, email)values(?,?,?,?) ";
//創(chuàng)建ps對象
preparedStatement = connection.prepareStatement(sql);
//設(shè)置占位符參數(shù)
preparedStatement.setString(1,user.getUsername());
preparedStatement.setString(2,user.getPassword());
preparedStatement.setString(3,user.getPhone());
preparedStatement.setString(4,user.getEmail());
count=preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
Dbutils.close(connection,preparedStatement);
}
return count;
}
@Override
public int updateById(User user) {
int count = 0;
Connection connection = null;
PreparedStatement ps = null;
try {
connection = Dbutils.getConnection();
String sql = "UPDATE user SET password=? WHERE uid=?";
ps = connection.prepareStatement(sql);
ps.setString(1, user.getPassword());
ps.setInt(2, user.getUid());
count = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
Dbutils.close(connection, ps);
}
return count;
}
}
DetailDaoImpl
package Dao.impl;
import Dao.DetailsDao;
import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;
import com.yeungkim.utils.Dbutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DetailDaoImpl implements DetailsDao {
/**
* 保存用戶信息以及地址詳細(xì)信息
*
* @param detail
* @param user
* @return
*/
@Override
public int insertDetail(Detail detail, User user) {
int count = 0;
Connection connection = null;
PreparedStatement ps = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
ResultSet resultSet = null;
String userSql = "INSERT INTO t_user(username, password, phone, email) VALUES (?,?,?,?)";
String userSelectSql = "SELECT uid FROM t_user WHERE username=?";
String sql = "INSERT INTO detail(address, uid) VALUES (?,?)";
try {
connection = Dbutils.getConnection();
//開啟事務(wù)
connection.setAutoCommit(false);
// 保存用戶信息
ps1 = connection.prepareStatement(userSql);
ps1.setString(1, user.getUsername());
ps1.setString(2, user.getPassword());
ps1.setString(3, user.getPhone());
ps1.setString(4, user.getEmail());
ps1.executeUpdate();
// 通過用戶信息查詢用戶ID
ps2 = connection.prepareStatement(userSelectSql);
ps2.setString(1, user.getUsername());
resultSet = ps2.executeQuery();
if (resultSet != null && resultSet.next()) {
int uid = resultSet.getInt("uid");
// 保存地址信息
Integer.parseInt("adbc1");
ps = connection.prepareStatement(sql);
ps.setString(1, detail.getAddress());
ps.setInt(2, uid);
count = ps.executeUpdate();
connection.commit();
}
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
try {
ps1.close();
ps2.close();
Dbutils.close(connection, ps, resultSet);
} catch (SQLException e) {
e.printStackTrace();
}
}
return count;
}
}
Dbutils-工具類
package com.yeungkim.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class Dbutils {
//步驟:
//1初始化數(shù)據(jù)庫連接池
//2獲取數(shù)據(jù)庫連接對象
//3釋放資源并關(guān)閉對象
public static final String DB_CONFIG="db.properties";
public static DataSource dataSource;
static {
Properties properties = new Properties();
InputStream inputStream = Dbutils.class.getClassLoader().getResourceAsStream(DB_CONFIG);
try {
properties.load(inputStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
System.out.println("初始化數(shù)據(jù)庫連接池失敗,請檢查配置信息");
}
}
public static Connection getConnection() throws Exception{
return dataSource.getConnection();
}
//釋放資源關(guān)閉連接
public static void close(Connection connection, Statement statement){
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
System.out.println("關(guān)閉statement對象失敗");
}
}
if(connection !=null){
try {
connection.close();
} catch (SQLException e) {
System.out.println("關(guān)閉connetion失敗");
}
}
}
//Dao data access Object
//connection
//statement
//resultSet
public static void close(Connection connection, Statement statement, ResultSet resultSet){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(connection,statement);
}
}
主函數(shù)
package com.yeungkim;
import Dao.DetailsDao;
import Dao.UserDao;
import Dao.impl.DetailDaoImpl;
import Dao.impl.UserDaoImpl;
import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;
import java.util.List;
public class Main {
public static void main(String[] args) {
users();
register();
updatePassword();
login();
save();
}
public static void users(){
//創(chuàng)建userdao對象
UserDao userDao=new UserDaoImpl();
//調(diào)用dao方法
List<User> users=userDao.selectAll();
System.out.println(users);
}
public static void register(){
//創(chuàng)建userdao
UserDao userDao=new UserDaoImpl();
//創(chuàng)建user對象
User user=new User();
user.setUsername("admin");
user.setPassword("admin");
user.setPhone("123456");
user.setEmail("1234@163.com");
int count=userDao.insert(user);
if(count>0){
System.out.println("注冊成功");
}else{
System.out.println("注冊失敗");
}
}
//已知用戶id
public static void updatePassword(){
UserDao userDao=new UserDaoImpl();
User user=new User();
user.setUid(1);
user.setPassword("123456");
int count= userDao.updateById(user);
System.out.println(count);
}
//登錄功能
public static void login(String username,String pwd){
UserDao userDao=new UserDaoImpl();
User user=userDao.selectUserByName(username);
//
if(user!=null){
System.out.println("存在用戶");
if(user.getIsDel()==0){
if(user.getPassword().equals(pwd)){
System.out.println("登錄成功");
}else {
System.out.println("登錄失敗,賬戶或密碼錯誤");
}
}else{
System.out.println("賬戶被凍結(jié),請與管理員聯(lián)系");
}
}else{
System.out.println("用戶名不存在");
}
}
//保存用戶信息及詳細(xì)內(nèi)容
public static void save(){
DetailsDao detailsDao=new DetailDaoImpl();
User user=new User();
user.setUsername("damin");
user.setPassword("1244");
user.setPhone("1234");
user.setEmail("123@13.com");
Detail detail=new Detail();
detail.setAddress("四季酒店");
detailsDao.insertDetail(detail,user);
}
}