包装一个方法同时可以实现增、删、改,增强代码的复用性
使用Connection.createPrepareStatement(sql);
创建调用Preparemente
class JDBC_data thows Exception{
public Preparement getPreparement(String sql){
................具体代码如下
return preparstatement;
}
分析:
若想同时实现增删该查,必须保证参数地方输入的语句(sql)可以不断变化,还有就是对不同类型参数的预处理
由此可以推断出参数必须包含String sql,若想实现参数可变输入还要定义一个Object[ ]数组
由此推出大概框架为:
public void update(String sql,object[ ] values){
具体代码如下
}
通过模拟ATM存取/款/创建用户/删除用户来测(没有完全封装,只是一个简单的利用)
数据库的表格式如下:
username | password | balance |
//ATM PO
package ATM_PO;
public class ATM {
private String username;
private String password;
private int balance;
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 getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
return "ATM [username=" + username + ", password=" + password + ", balance=" + balance + "]";
}
}
//数据连接
package DATA;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 通过预处理,封装实现 增删该查最简化
* 首先:1.要使用预处理,目的:提高代码的通用性
* 2.建立一个对象映射数据库中的对象,此处以模拟ATM为例,建立一个ATM(PO)
* 3.通过对象数组封装每条对象(例如:Object[]{atm.getusername()...})的各个列,
* 通过prepare.setObject()可以不用考虑参数类型带来的影响
* 注意事项:在插入对象时要注意对象的顺序要与SQL中的数据对应,否则数据会混乱
* */
//此处封装一个Prepare对象的创建方法
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCdatabase {
//为了提高代码复用性,sql要作为参数写入
public PreparedStatement getPrepare(String sql) {
PreparedStatement ps=null;
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//连接数据库
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456");
ps=conn.prepareStatement(sql);
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败!");
e.printStackTrace();
}
return ps;
}
public Connection getConn() {
Connection conn=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:", "scott", "123456");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
数据连接层
package ATM_DAO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import ATM_PO.ATM;
import DATA.JDBCdatabase;
public class AtmDao {
//封装一个可以数据库可以增、删、改的方法,为了提高代码的复用性和获得参数的个数与类型,使用Object[]
/**
* 通过此方法可以更增、删、改*/
public void update(String sql,Object[] values) {
//获得prepareStatement
PreparedStatement ps=new JDBCdatabase().getPrepare(sql);
//通过for循环将参数变量插入sql中的问号中,此处注意顺序问题
for(int i=0;i<values.length;i++) {
try {
ps.setObject(i+1, values[i]);
} catch (SQLException e) {
System.out.println("预处理失败");
e.printStackTrace();
}
}
try {
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//对数据库的查询
public ATM queryDao(String username) {
ATM atm=null;
PreparedStatement ps=null;
try {
String sql="select * from tb_atm where username=?";
ps=new JDBCdatabase().getPrepare(sql);
ps.setString(1, username);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
atm=new ATM();
atm.setUsername(rs.getString("username"));
atm.setPassword(rs.getString("pasword"));
atm.setBalance(rs.getInt("balance"));
}
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
return atm;
}
//余额查询
public int yueDao(String username) {
return queryDao(username).getBalance();
}
}
业务层(service)
package ATM_service;
import ATM_DAO.AtmDao;
import ATM_PO.ATM;
public class Atm_Service {
//存款
public void cunkuan(String username,int money) {
String sql="update tb_atm set balance= ? where username=?";
AtmDao ad=new AtmDao();
ATM atm=ad.queryDao(username);
atm.setBalance(atm.getBalance()+money);
Object[] values= {atm.getBalance(),atm.getUsername()};
ad.update(sql,values);
}
//取款
public void qukuan(String username,int money) {
String sql="update tb_atm set balance= ? where username=?";
AtmDao ad=new AtmDao();
ATM atm=ad.queryDao(username);
if(money<atm.getBalance())
{
atm.setBalance(atm.getBalance()-money);
Object[] values= {atm.getBalance(),atm.getUsername()};
ad.update(sql,values);
}
}
//转账
public void zhuanzhang(String username,int money,String rusername) {
AtmDao ad=new AtmDao();
//转账人
String sql="update tb_atm set balance= ? where username=?";
ATM atm=ad.queryDao(username);
if(money<atm.getBalance())
{
atm.setBalance(atm.getBalance()-money);
Object[] values= {atm.getBalance(),atm.getUsername()};
ad.update(sql,values);
//收款人
String sql1="update tb_atm set balance= ? where username=?";
ATM atm1=ad.queryDao(rusername);
atm1.setBalance(atm1.getBalance()+money);
Object[] values1= {atm1.getBalance(),atm1.getUsername()};
ad.update(sql1,values1);
System.out.println("转账成功");
}
}
//余额查询
public int yue(String username) {
AtmDao ad=new AtmDao();
return ad.yueDao(username);
}
//创建用户
public void createUser(ATM atm) {
AtmDao ad=new AtmDao();
String sql="insert into tb_atm (username,pasword,balance)values(?,?,?)";
ad.update(sql, new Object [] {atm.getUsername(),atm.getPassword(),atm.getBalance()});
}
//注销用户
public void delateUser(String username) {
AtmDao ad=new AtmDao();
String sql="delete from tb_atm where username=?";
ad.update(sql, new Object[] {username});
if(ad.queryDao(username)==null) {
System.out.println("删除用户成功");
}
}
}
//测试
import ATM_PO.ATM;
import ATM_service.Atm_Service;
public class test {
public static void main(String[] args) {
Atm_Service as=new Atm_Service();
//cunkuan
System.out.println("马云"+as.yue("马云"));
as.cunkuan("马云", 10000);
System.out.println("马云"+as.yue("马云"));
//qukuan
as.qukuan("马云", 10000);
System.out.println("马云"+as.yue("马云"));
//测试转账
System.out.println("小王"+as.yue("小王"));
as.zhuanzhang("马云", 10000, "小王");
System.out.println("小王"+as.yue("小王"));
System.out.println("马云"+as.yue("马云"));
//测试创建用户
ATM atm=new ATM();
atm.setUsername("小李");
atm.setPassword("123456");
atm.setBalance(10000);
as.createUser(atm);
System.out.println("小李"+as.yue("小李"));
//删除用户
as.delateUser("小李");
}
}