工厂模式连接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&amp";
    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);
        
    }
}

 

posted on 2018-07-27 14:47  yfyfyf947  阅读(451)  评论(0编辑  收藏  举报