工厂模式连接Mysql
单例模式:一个类只能有一个实例,当然在程序中可能有多个地方会调用这个类,但是这些实例都是相同的,也就是说还是该类只有一个实例。
单例模式分饿汉和懒汉两种,其中饿汉是不管用不用得到,都先实例化该类;二懒汉是等用到了才会实例化,其中存在线程安全问题,需上双重锁。
工厂模式:
- 对于java应用而言,应用之中各实例之间存在复杂的调用关系。当A对象需要调用B对象的方法时,许多人会选择new一个B对象实例,然后通过B对象实例调用相应的方法。这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需啊哟使用C类来代替B类的时候,程序不得不更改A类代码。
- 为了解决需要重写A类代码的问题,我们需要重新定义一个工厂类BFactory,专门用来创建B对象实例,而A类只需要调用BFactory工厂的方法来得到B对象实例
用工厂模式连接MySQL思路:
1. 建立properties配置文件,文件中键为UserDaoClass,值为实现UserDao接口的类的名字
2. 在工厂类中用读配置文件,获取实现UserDao接口的类名,根据类名实例化该类
3.将该类的对象返回给测试程序
备注:User类为用户类,包含用户的属性(id,姓名,生日,钱)
UserDao接口,规定实现该接口的类要实现对数据库的增删改查等功能
UserDaoJdbcImpl类,该类实现了UserDao接口,为了提高代码的复用性,新建了一个JdbcUtil类,这两个类联合使用
UserDaoTest类,该类用来测试程序是否运行正常
User类
package cn.itcast.jdbc.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; private float money; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } }
JdbcUtil类,此类设计出来的作用是提高代码的复用性
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public final class JdbcUtil { private String url="jdbc:mysql://localhost:3306/javastudy?serverTimezone=GMT%2B8&"; private String user="root"; private String password="111111"; private static JdbcUtil instance=new JdbcUtil(); private JdbcUtil() { } public static JdbcUtil getJdbcUtil() { return instance; } //注册 static { try { //根据com.mysql.cj.jdbc.Driver来找这个类,加载并初始化静态代码块 Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException e){ throw new ExceptionInInitializerError(e); } } //连接数据库 public Connection getConnection() throws SQLException{ return DriverManager.getConnection(url,user,password); } //释放资源 public void free(ResultSet rs,Statement st,Connection conn) { try { if(rs!=null) rs.close(); }catch(SQLException e) { e.printStackTrace(); } finally { try { if(st!=null) st.close(); }catch(SQLException e) { e.printStackTrace(); } finally { if(conn!=null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
DaoFactory类
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class DaoFactory { static UserDao userDao = null; static DaoFactory instance = new DaoFactory(); private DaoFactory() { try { Properties prop=new Properties(); InputStream in=new FileInputStream(new File("C:\\Users\\fan\\Desktop\\javaStudy\\daoconfig.properties")); prop.load(in); String userDaoClass=prop.getProperty("UserDaoClss"); //根据配置文件找到相应的类名,根据类名加载类到虚拟机 Class<?> clazz=Class.forName(userDaoClass); //实例化该类 userDao=(UserDao)clazz.getDeclaredConstructor().newInstance(); in.close(); }catch(Exception e) { e.printStackTrace(); } } public static DaoFactory getInstance() { return instance; } public UserDao getUserDao() { return userDao; } }
UserDao接口
import cn.itcast.jdbc.domain.User; public interface UserDao { //增 public void addUser(User user); //查 public User getUser(int userId); //改 public void update(User user); //删 public void delete(User user); //查 public User findUser(String name,String password); }
UserDaoJdbclmpl类,该类实现了UserDao接口的所有方法
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import cn.itcast.jdbc.dao.DaoException; import cn.itcast.jdbc.dao.UserDao; import cn.itcast.jdbc.domain.User; import javaStudy.JdbcUtil; public class UserDaoJdbcImpl implements UserDao { public void addUser(User user) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //建立连接 conn = JdbcUtil.getJdbcUtil().getConnection(); //书写SQL语句 String sql = "insert into User (name,birthday,money,id) values(?,?,?,?)"; //创建执行SQL的语句 ps = conn.prepareStatement(sql); //设置?占位符的值 ps.setString(1, user.getName()); ps.setDate(2, new java.sql.Date(user.getBirthday().getTime())); ps.setFloat(3, user.getMoney()); ps.setInt(4, user.getId()); //执行语句 ps.executeUpdate(); } catch (SQLException e) { throw new DaoException(e.getMessage(), e); } finally { JdbcUtil.getJdbcUtil().free(rs, ps, conn); } } public User getUser(int userId) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; User u=null; try { conn = JdbcUtil.getJdbcUtil().getConnection(); String sql = "select name,birthday,money from user where id=?"; ps = conn.prepareStatement(sql); ps.setInt(1, userId); //处理执行结果 rs=ps.executeQuery(); while(rs.next()) { u=new User(); u.setId(userId); u.setName(rs.getString("name")); u.setBirthday(rs.getDate("birthday")); u.setMoney(rs.getFloat("money")); } } catch (SQLException e) { throw new DaoException(e.getMessage(), e); } finally { JdbcUtil.getJdbcUtil().free(rs, ps, conn); } return u; } public void update(User user) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=JdbcUtil.getJdbcUtil().getConnection(); String sql="update user set id=?,name=?,birthday=?,money=? where id=?"; ps=conn.prepareStatement(sql); ps.setInt(1, user.getId()); ps.setString(2, user.getName()); ps.setDate(3, new java.sql.Date(user.getBirthday().getTime())); ps.setFloat(4, user.getMoney()); ps.setInt(5, user.getId()); ps.executeUpdate(); }catch(SQLException e) { throw new DaoException(e.getMessage(),e); }finally { JdbcUtil.getJdbcUtil().free(rs, ps, conn); } } public void delete(User user) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=JdbcUtil.getJdbcUtil().getConnection(); String sql="delete from user where id=?"; ps=conn.prepareStatement(sql); ps.setInt(1, user.getId()); ps.execute(); }catch(SQLException e) { throw new DaoException(e.getMessage(),e); }finally { JdbcUtil.getJdbcUtil().free(rs, ps, conn); } } public User findUser(String name, String password) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; User u=null; try { conn = JdbcUtil.getJdbcUtil().getConnection(); String sql = "select id,name,birthday,money from user where name=?"; ps = conn.prepareStatement(sql); ps.setString(1, name); rs=ps.executeQuery(); while(rs.next()) { u=new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); u.setBirthday(rs.getDate("birthday")); u.setMoney(rs.getFloat("money")); } } catch (SQLException e) { throw new DaoException(e.getMessage(), e); } finally { JdbcUtil.getJdbcUtil().free(rs, ps, conn); } return u; } }
UserDaoTest类,此类用来测试程序是否能正常运行
import java.util.Date; import cn.itcast.jdbc.dao.impl.UserDaoJdbcImpl; import cn.itcast.jdbc.domain.User; public class UserDaoTest { public static void main(String[] args) { User user=new User(); user.setId(3); user.setName("小狗"); user.setBirthday(new Date()); user.setMoney((float) 16000); UserDao dao=DaoFactory.getInstance().getUserDao(); dao.addUser(user); } }