javawebday45(DAO层进行接口对象化dao层优化和页面连接数据库 )

UserDao
修改项目
1、把UserDao修改为接口,然后把原来的UserDao修改类名为UserDaoImp
2、修改UserService中对UserDao的实例化:private UserDao userDao = Daofactory.getUserDao();
1、DAO模式
    DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)直接
        实体域,即操作的对象,例如我们操作的是user表,那么就需要先写一个User类
        DAO模式需要先提供一个DAO接口
        然后再提供一个DAO接口的实体类
        再编写一个DAO工厂,Service通过工厂来获取DAO实现

时间类型
SQL包下相关时间的方法
    java.sql.ResultSet#java.sql.Date.getDate()
    java.sql.PreparedStatement#setDate(int col,java.sql.Data date)

    例如 user.setBirthday(rs.getDate("birthday"));其中rs.getDate()方法返回的是java.sql.Date而User的birthday必须是java.util.Date类型。把sql包的Date赋给util包下的Date这是子类给父类,不用强转

    例如:pstmt.setDate(3,user.getBirthday())其中user.getBirthday() 返回的是util包下的Date,而setDate()方法的参数类型是sql包下的Date,这说明需要把utilDate转换成sqlDate。这需要处理类型转换问题

    pstmt.setDate(3,new java.sql.Date(user.getBirthday().getTime()))

数据库类型与java中类型的对应关系
DATE->java.sql.Date
TIME->java.sql.Time
TIMESTAMP->java.sql.TimeStamp   

    领域对象(domain)中的所有属性不能出现java.sql包下的东西。即不能使用java.sql.Date
    ResultSet#getDate()返回的是java.sql.Date()
    PreparedStatement#setDate(int,Date) 其中第二个参数也是java.sql.Date 

时间类型的转换
    java.util.Date->java.sql.Date、Time、Timestamp
        把util的Date转换成毫秒值
        使用毫秒值创建sql的Date、Time、Timestamp
    java.sql.Date、Time、Timestamp->java.util.Date    
        不需要处理了:因为java.sql.Date是java.util.Date
    java.util.Date date = new java.sql.Date();儿子给爸爸 不用转换

    java.util.Date date = new java.util.Date();
    long l = date.getTime();
    java.sql.Date sqlDate = new java.sql.Date(l);

Java中的时间类型
    java.sql包中给出三个与数据库相关的日期时间类型,分别是
        Date:表示日期,只有年月日,没有时分秒。会丢失事件
        Time:表示时间,只有时分秒,没有年月日。会丢失日期
        Timestamp:表示时间戳,有年月日时分秒,以及毫秒

    这三个类都是java.util.Date的子类     

UserDao.java 接口类

/**
 * 
 * @author Administrator
 * 接口不容易换 实现类容易换, 按照一定规则能换人,规则不轻易换
 * 遵循开辟原则 
 */
public interface UserDao {
    public User findByUsername(String username);
    public void add(User user);
}

DaoFactory.java

/**
 * 通过配置文件得到dao实现类的名称
 * 通过类名称,完成创建类对象(反射完成的)
 * @author Administrator
 *
 */
public class DaoFactory {
    private static Properties props = null;
    static{
        //加载配置内容到props对象中
        try{
            InputStream in = DaoFactory.class
                    .getClassLoader().getResourceAsStream("dao.properties");
            //不能再在前面加Properties不然会报空指针异常
            props = new Properties();
            props.load(in);
        } catch(Exception e){
            throw new RuntimeException(e);
        }
    }
    /**
     * 返回一个具体UserDao的实现类对象
     * @return
     */

    public static UserDao getUserDao(){
        /*
         * 给出一个配置文件,文件中给出UserDao接口的实现类名称
         * 我们这个方法,获取实现类的类名,通过反射完成创建对象
         */
        /*
         * 得到dao实现类的名称  名字长点防止冲突
         */
        String daoClassName = props.getProperty("my.user.dao.UserDao");
        /*
         * 通过反射来创建实现类的对象
         */
        try {
            Class clazz = Class.forName(daoClassName);  
            return (UserDao) clazz.newInstance();//返回的Object需要进行强转
        } catch (Exception e) {
            throw new RuntimeException(e);
        } 
    }
    /*@Test
    public void fun1(){
        InputStream in = DaoFactory.class
                .getClassLoader().getResourceAsStream("dao.properties");
         props = new Properties();
        try {
            props.load(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String daoClassName = props.getProperty("my.user.dao.UserDao");
        try {
            Class clazz = Class.forName(daoClassName);
            System.out.println(clazz.newInstance());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }*/
}

UserDaoImpl.java

/**
 * 数据类 持久层(数据层)
 * 用来访问xml文件
 * @author Administrator
 *
 */
public class UserDaoImpl implements UserDao {
    private String path="D:/users.xml";//依赖数据文件
    /**
     * 按用户名查询
     */
    public User findByUsername(String username){
        /*
         * 1、得到Document
         * 2、xpath查询
         *  3、校验查询结果是否为null,如果为null,返回null
         *  4、如果不为null,需要把Element封装到User对象中。
         */
        /*
         * 1、得到document
         */
        //创建解析器
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(path);
            /*
             * 2、通过xpath查询得到Element
             */
            Element ele = (Element) doc.selectSingleNode("//user[@username='"+username+"']");
            /*
             * 3、校验ele是否为null,如果为null,返回null
             */
            if(ele == null) return null;
            /*
             * 4、把ele的数据封装到User对象中
             */
            User user = new User();
            String attrUsername = ele.attributeValue("username");//获取该元素的名为username 的属性值
            String attrPassword = ele.attributeValue("password");//获取该元素的名为password的属性值
            user.setUsername(attrUsername);
            user.setPassword(attrPassword);
            return user;
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 添加用户
     * @param user
     */
    public void add(User user){
        /*
         * 1、得到Document
         * 2、通过Document得到root元素<users>
         * 3、使用参数user,转发成Element对象
         * 4、把element添加到root元素中
         * 5、保存Document
         */
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(path);
            //得到根元素
            Element root = doc.getRootElement();
            //通过根元素创建新元素
            Element userEle = root.addElement("user");
            //为userEle设置属性
            userEle.addAttribute("username", user.getUsername());
            userEle.addAttribute("password", user.getPassword());
            /*
             * 保存文档
             */
            //创建输出格式化器
            OutputFormat format = new OutputFormat("\t",true);//缩进使用\t,是否换行,使用是
            format.setTrimText(true);//清空原有的换行和缩进 不然有之前留着的换行格式很不好看
            //创建XmlWriter
            //XMLWriter writer = new XMLWriter(new FileWriter(path),format);//没有编码方式 需要换另外的输出方式
            XMLWriter writer;
            try {
                writer = new XMLWriter(
                        new OutputStreamWriter(
                                new FileOutputStream(path),"utf-8"),format);//保证编码方式
                writer.write(doc);//保存document对象
                writer.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            } 

        } catch (DocumentException e) {
            throw new RuntimeException();
        }
    }
}

JdbcUtils

/**
 * v1.0
 * @author Administrator
 *
 */

public class JdbcUtils {
    private static Properties props = null;
    //只在JdbcUtils类被加载一次
    static{
        //props进行初始化,即加载dbconfig.properties文件到props对象中
        try {
            /*
             * 1.加载配置文件
             * 2、加载驱动类
             * 3、调用DriverManager.getConnection()
             */
            //加载配置文件
            InputStream in = JdbcUtils.class.getClassLoader()
                    .getResourceAsStream("dbconfig.properties");
            props = new Properties();
            props.load(in);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        try {
            //加载驱动类
            Class.forName(props.getProperty("driverClassName"));
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    //获取连接
    public static Connection getConnections() throws SQLException{

        //得到Connection
        return DriverManager.getConnection(props.getProperty("url"),
                props.getProperty("username"),
                props.getProperty("password"));
    }
}

JdbcUserImpl.java

/**
 * 针对数据库的实现
 * @author Administrator
 *
 */
public class JdbcUserDaoImpl implements UserDao {

    @Override
    public User findByUsername(String username) {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            /*
             * 一、得到连接
             */
            con = JdbcUtils.getConnections();
            /*
             * 二、准备sql模版,得到pstmt
             */
            String sql = "SELECT * FROM t_user WHERE username=?";
            pstmt = con.prepareStatement(sql);
            /*
             * 三、为pstmt中的问号赋值
             */
            pstmt.setString(1, username);
            /*
             *四、执行之 
             */
            rs = pstmt.executeQuery();
            /*
             * 五、把rs转换成User类型,返回
             */
            if(rs == null){
                return null;
            }
            if(rs.next()){
                //转换成User对象,并返回
                //ORM-->对象关系映射 把表的东西放到对象中 hibernate ORM工具
                User user = new User();
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                return user;
            }else{
                return null;
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally{
            try {
                if(pstmt!=null) pstmt.close();
                if(con!=null) con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void add(User user) {
        Connection con = null;
        PreparedStatement pstmt = null;
        try {
            /*
             * 一、得到连接
             */
            con = JdbcUtils.getConnections();
            /*
             * 二、准备sql模版,得到pstmt
             */
            String sql = "INSERT INTO t_user Values(?,?)";
            pstmt = con.prepareStatement(sql);
            /*
             * 三、为pstmt中的问号赋值
             */
            pstmt.setString(1, user.getUsername());
            pstmt.setString(2, user.getPassword());
            /*
             *四、执行之 
             */
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally{
            try {
                if(pstmt!=null) pstmt.close();
                if(con!=null) con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值