一个JDBC案例
一、定义
JDBC全称为:Java DataBase Connectivity(java数据库连接)。是SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。
二、为什么要使用JDBC?
- 数据库产品众多,保守估计有100多种数据,这样造成我们应用程序连接访问数据库缺乏统一的接口
- 应用程序与数据库之间兼容性太差
三、使用JDBC的好处
- 统一应用平台,实现异构数据库系统信息互访
- 减少应用程序与数据库编码工作
- 依靠 OOP技术,提高代码的复用性
!!JDBC制定了统一访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现!!
jdbc交互.png
案例
实体类-User
package com.yeungkim.entity;
import java.io.Serializable;
import java.sql.Timestamp;
//实现序列化接口
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;
//实现序列化接口
public class Detail implements Serializable {
//使用包装类数据类型
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;
}
//无参构造方法
public Detail() {
}
}
Dao-UseDao
package Dao;
import com.yeungkim.entity.User;
import java.util.List;
public interface UserDao {
//查询所有用户
List<User> selectAll();
//根据用户名查询用户信息
User selectUserByName(String username);
//添加用户信息
int insert(User user);
//根据id修改用户信息,因为id已经在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循环就是一个对象
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");
//将数据库封装到对象,添加到集合中
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=?";
//创建ps对象
preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1,username);
//执行查询返回result 对象
resultSet = preparedStatement.executeQuery();
//判断是否有数据
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(?,?,?,?) ";
//创建ps对象
preparedStatement = connection.prepareStatement(sql);
//设置占位符参数
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 {
/**
* 保存用户信息以及地址详细信息
*
* @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();
//开启事务
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初始化数据库连接池
//2获取数据库连接对象
//3释放资源并关闭对象
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("初始化数据库连接池失败,请检查配置信息");
}
}
public static Connection getConnection() throws Exception{
return dataSource.getConnection();
}
//释放资源关闭连接
public static void close(Connection connection, Statement statement){
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
System.out.println("关闭statement对象失败");
}
}
if(connection !=null){
try {
connection.close();
} catch (SQLException e) {
System.out.println("关闭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);
}
}
主函数
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(){
//创建userdao对象
UserDao userDao=new UserDaoImpl();
//调用dao方法
List<User> users=userDao.selectAll();
System.out.println(users);
}
public static void register(){
//创建userdao
UserDao userDao=new UserDaoImpl();
//创建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("账户被冻结,请与管理员联系");
}
}else{
System.out.println("用户名不存在");
}
}
//保存用户信息及详细内容
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);
}
}