回顾
package orm.test;import java.sql.*;public class test {public static void main(String[] args) throws Exception {// 1.导包// 2.加载类驱动Class.forName("com.mysql.jdbc.Driver");// 3.获取连接String Host = "jdbc:mysql://bj-cdb-547s28hs.sql.tencentcdb.com:60439/test?useSSL=false";String user = "root";String password = "qq2653650997";Connection conn = DriverManager.getConnection(Host, user, password);// 4.创建状态参数// String sql = "insert into atm values (?,?,?)";String sql = "select * from atm";PreparedStatement pstat = conn.prepareStatement(sql);// 5.执行操作// pstat.setString(1,"李四");// pstat.setString(2,"123");// pstat.setFloat(3,700);// 增加数据// int count = pstat.executeUpdate();// 查询数据ResultSet resultSet = pstat.executeQuery(sql);while (resultSet.next()){String aname = resultSet.getString("aname");String apass = resultSet.getString("apassword");Float abalance = resultSet.getFloat("abalance");System.out.println(aname+"的银行密码是"+apass+",在银行存了"+abalance+"元");}// System.out.println(count+"行受到影响");// 6.关闭资源pstat.close();conn.close();}}
缺点:通过上述代码可以看出,每当我们需要更新(查询)数据时都需要重新书写一遍”JDBC流程”,这样在日常开发中,会造成代码冗余,可读性不强。也不符合MVC的分层架构思想。 改进:通过封装来实现”JDBC”的复用使代码可读性增强,减少代码的冗余。
第一次优化
package orm.dao;import orm.domain.Atm;import java.sql.*;public class AtmDao {private String className = "com.mysql.jdbc.Driver";private String Host = "";private String user = "";private String password = "";// 查询数据public Atm selectOne(String aname) {Atm atm = null;try {Class.forName(className);Connection conn = DriverManager.getConnection(Host, user, password);String sql = "select * from atm";PreparedStatement pstat = conn.prepareStatement(sql);// 查询数据ResultSet resultSet = pstat.executeQuery(sql);while (resultSet.next()) {atm = new Atm();atm.setAname(resultSet.getString("aname"));atm.setApassword(resultSet.getString("apassword"));}resultSet.close();pstat.close();conn.close();} catch (Exception e) {e.printStackTrace();}return atm;}// 更新数据public void update(Atm atm) {try {Class.forName(className);Connection conn = DriverManager.getConnection(Host, user, password);String sql = "update atm set apassword = ?,abalance = ? where aname = ?";PreparedStatement pstat = conn.prepareStatement(sql);pstat.setString(1, atm.getApassword());pstat.setFloat(2, atm.getAbalance());pstat.setString(3, atm.getAname());pstat.executeUpdate();pstat.close();conn.close();} catch (Exception e) {e.printStackTrace();}}// 新增数据public void insert(Atm atm) {try {Class.forName(className);Connection conn = DriverManager.getConnection(Host, user, password);String sql = "insert into atm values (?,?,?)";PreparedStatement pstat = conn.prepareStatement(sql);pstat.setString(1, atm.getAname());pstat.setString(2, atm.getApassword());pstat.setFloat(3, atm.getAbalance());pstat.executeUpdate();pstat.close();conn.close();} catch (Exception e) {e.printStackTrace();}}// 删除数据public void cancle(String aname) {try {Class.forName(className);Connection conn = DriverManager.getConnection(Host, user, password);String sql = "delete from atm where aname = ?";PreparedStatement pstat = conn.prepareStatement(sql);pstat.setString(1, aname);pstat.executeUpdate();pstat.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
public class AtmService {private AtmDao dao = new AtmDao();// 登陆public String login(String aname,String apassword){// 1.读取数据库Atm atm = dao.selectOne(aname);// 2.判断if (atm!=null && atm.getApassword().equals(apassword)){return "登陆成功";}else {return "账号或密码输入错误";}}// 查询public Float query(String aname){return dao.selectOne(aname).getAbalance();}// 存款public void deposit(String aname,Float money){Atm atm = dao.selectOne(aname);atm.setAbalance(atm.getAbalance() + money);dao.update(atm);}// 开户public void create(String aname,String apassword,Float abalance){Atm atm = new Atm(aname,apassword,abalance);}// 销户public void cancel(String anane){dao.cancle(anane);}// 取款,转账(参考存款)}
第一次更新总结: service:每一个业务方法都不一样,对应着一个具体的逻辑(比较,计算,判断) dao:dao中的方法都是对数据库中的数据进行增删改查(JDBC+SQL),也看出了dao中的方法大部分一样,存在冗余
