JDBC--使用DAO工厂模式(代码超经典)



1.创建配置文件  daoconfig.properties
代码
<
# key=value 其中 key 不可以重复
userDaoFactory=cn.zsc.jdbc.dao.impl.UserDaoJdbcImpl
>

2.创建实体类 User.java
代码
    import java.util.Date;
    public class User {

        private int id ;

        private String name ;

        private Date biethday ;

        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 getBiethday() { 

            return biethday; 

        } 

        public void setBiethday(Date biethday) { 

            this.biethday = biethday; 

        }

        public float getMoney() { 

            return money; 

        } 

        public void setMoney(float money) { 

            this.money = money; 

        }

    }


3. 创建接口 UserDao.java
代码
    package cn.zsc.jdbc.dao;
    import java.sql.SQLException;
    import cn.zsc.jdbc.domain.User;
    // 创建接口
    public interface UserDao {

        public void addUser(User user) ;

        public User getUser(int uid);

        public User getUser(String username,String password);

        public void delUser(int uid);

        public void updateUser(User user);

    }

4.创建实现接口类  UserDaoJdbcImpl.java
代码
package cn.zsc.jdbc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.zsc.jdbc.JdbcUtils;
import cn.zsc.jdbc.dao.DaoException;
import cn.zsc.jdbc.dao.UserDao;
import cn.zsc.jdbc.domain.User;
//接口的实现类
public class UserDaoJdbcImpl implements UserDao {
@Override
public void addUser(User user) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConn();
String sql = "insert into user(name,birthday,money) values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, user.getName());
ps.setDate(2, new java.sql.Date(user.getBiethday().getTime()));
ps.setFloat(3, user.getMoney());
ps.executeUpdate();
}catch(SQLException e){
//  为了不让业务逻辑层处理该异常,
throw new DaoException(e.getMessage(),e) ;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
@Override
public User getUser(int uid) {
User user = new User();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConn();
String sql = "select id,name,birthday,money from user where id= ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, uid);
rs = ps.executeQuery();
while(rs.next()){
user.setId(rs.getInt("id"));
user.setBiethday(rs.getDate("birthday"));
user.setName(rs.getString("name"));
}
}catch(SQLException e){
//  为了不让业务逻辑层处理该异常,
throw new DaoException(e.getMessage(),e) ;
} finally {
JdbcUtils.free(rs, ps, conn);
}
return user ;
}
@Override
public User getUser(String username, String password) {
return null;
}
@Override
public void delUser(int uid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConn();
String sql = "delete from user where id=";
ps.setInt(1, uid);
ps.executeUpdate();
}catch(SQLException e){
//  为了不让业务逻辑层处理该异常,
throw new DaoException(e.getMessage(),e) ;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
@Override
public void updateUser(User user) {
}
}


5.创建接口工厂  DaoFactory.java
代码
package cn.zsc.jdbc.dao;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class DaoFactory {
// 注意 对象的 创建顺序
private static UserDao userDao = null;
private static DaoFactory instance = new DaoFactory();
private DaoFactory() {
try {
Properties prop = new Properties();
// InputStream inStream = new FileInputStream(new File("src/daoconfig.properties"));
//  优点:文件不一定要和路径绑定,只要文件从在于 ClassPath 中 就可以找得到
InputStream inStream = DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");
prop.load(inStream);
// 从配置文件中获得的 value 值 都是字符串(String)
String userDaoClzz = prop.getProperty("userDaoFactory");
// 通过反射方式 创建对象
Class clazz = Class.forName(userDaoClzz);
userDao = (UserDao) clazz.newInstance();
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static DaoFactory getInstance() {
return instance;
}
public static UserDao getUserDao(){
return userDao ;
}
}


6.自定义异常处理类 DaoException.java
代码
public class DaoException extends RuntimeException {
private static final long serialVersionUID = 1L;
public DaoException() {
}
public DaoException(String message) {
super(message);
}
public DaoException(Throwable cause) {
super(cause);
}
public DaoException(String message, Throwable cause) {
super(message, cause);
}
}


7.代码测试类 UserDaoTest.java
代码
<
import java.util.Date;
import cn.zsc.jdbc.domain.User;
public class UserDaoTest {
public static void main(String[] args) {
UserDao userDao = DaoFactory.getInstance().getUserDao();
User user = new User();
user.setName("dao name1");
user.setBiethday(new Date());
user.setMoney(1000f);
userDao.addUser(user);
userDao.getUser(2);
user.setMoney(4000f);
}
}
8.数据库创建连接类 JdbcUtils.java
代码
<
package cn.zsc.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

// 该工具类不需要被继承
public final class JdbcUtils {
private static String url = "jdbc:mysql://localhost:3306/db_jdbc";
private static String user = "root";
private static String password = "admin";
//不允许被创建
private JdbcUtils(){
}
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConn() throws SQLException{
return DriverManager.getConnection(url, user, password);
}
public static 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{
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}



>







  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值