资讯专栏INFORMATION COLUMN

用户登陆注册【JDBC版】

jayzou / 1658人阅读

前言
在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文!

本来使用的是XML文件作为小型数据库,现在使用Mysql数据库,代码究竟要改多少呢?我们拭目以待!

使用C3P0数据库连接池 导入C3P0的开发包和导入配置文件

开发包导入的是这个:c3p0-0.9.2-pre1和mchange-commons-0.2.jar.

C3P0不仅性能好,而且配置文件可以使用XML文档来配置!

类似的配置文件可以在官方文档上找得到

我们来改造一下:




    
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/zhongfucheng
        root
        root
    
        5
        10
        5
        20
    
    
    
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/zhongfucheng
        root
        root
    
        5
        10
        5
        20
    
    
    
    
        oracle.jdbc.driver.OracleDriver
        jdbc:oracle:thin:@//localhost:1521/事例名...
        用户名
        密码
    
        5
        10
        5
        20
    

写获取连接的工具类

    public class DBUtils {
    
        private static ComboPooledDataSource comboPooledDataSource = null;
    
        static {
    
            //它会自动寻找配置文件,节点为mysql的数据库【如果没有指定,就使用默认的!】
            comboPooledDataSource = new ComboPooledDataSource("mysql");
        }
    

        public static DataSource getDataSource() {
            return comboPooledDataSource ;
        }

        
        public static Connection getConnection() {
            try {
                return comboPooledDataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException("数据库初始化失败了!");
            }
        }
    }
设计数据库表

非常简单,根据实体表来设计就好了!


    CREATE TABLE user (
      id       VARCHAR(20) PRIMARY KEY,
      username VARCHAR(20) UNIQUE NOT NULL,
      password VARCHAR(20)        NOT NULL,
      email    VARCHAR(20),
      birthday DATE
    
    );


写一个操作数据库的Dao实现

    public class UserImplDataBase implements UserDao {
    
    
        @Override
        public User find(String username, String password) {
            
            return null;
        }
    
        @Override
        public void register(User user) {
    
            
        }
    }

下面我们就直接使用DBUtils框架了

导入DBUtils的开发包

具体的代码如下

    @Override
    public User find(String username, String password) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "SELECT * FROM user WHERE username=? AND password=?";

        try {
            User user = (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{username, password});

            return user == null ? null : user;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("登陆失败了!");
        }
    }

    @Override
    public void register(User user) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "INSERT INTO user (id, username, password, email,birthday) VALUES (?,?,?,?,?);";

        String id = user.getId();
        String username = user.getUsername();
        String password = user.getPassword();
        String email = user.getEmail();

        Date date = user.getBirthday();


        try {
            queryRunner.update(sql, new Object[]{id, username, password, email,date});

        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("注册失败了");
        }
    }
}

开发DaoFactory

我们的Dao实现已经有了XML版和JDBC版的,BusinessService调用Dao层方法的时候还是要new出具体的Dao实现,也就是以下的代码:

        
    UserDao userDao = new UserImplXML();

    //或者
    UserDao userDao= new UserImplDataBase();

这样做有点不够灵活,也就有点不够专业!下面我们来说一下为什么需要DaoFactory?

为什么需要DaoFactory?

参考博文:http://blog.sina.com.cn/s/blog_4ca34d0501008tpc.html

摘抄重点:

优点:

透明化:商业对象可以在完全不知道数据源如何具体实现的情况下来使用数据源. 访问数据源是透明的,因为实现细节已经被隐藏进了DAO.

迁移简单化:DAO 层的出现,使得应用程序向不同的数据库实现进行迁移变的容易.商业对象可以对底层数据实现一无所知.这样,迁移只涉及到了对DAO层的修改. 另外,如果使用工厂策略,则使为每一种底层数据实现提供一个具体的工厂实现成为可能.在这种情况下,迁移到一种不同的数据实现,其实就相当于为这个应用程序再提供一个新的工厂实现.

减少在商业对象中的编程难度:由于DAO管理着所有的数据访问细节,因而大大简化了在商业对象和其他使用DAO的数据客户端里的代码.所有的实现细节相关的代码比如(SQL 语句)都包含在DAO而不在商业对象中. 这样使得代码变的更加健壮而且大大提高了开发效率.

将所有的数据访问都多带带集中到一层中去: 因为所有的数据访问操作现在都已经被DAO所代理,所以这个多带带的数据访问层可以被看作可以是将数据访问实现和其余应用程序相互隔离的一层. 这样的集中,使得应用程序可以更加容易的来维护和管理.

缺点:

增加了多余的层:由于DAO在数据客户端和数据源之外多创建了一层对象,因而,需要对他进行设计和实现,来均衡这个设计模式的利弊. 但是,一般来说,采用此设计模式还是利大于弊的.

需要对类的相互继承关系进行设计:当使用工厂策略的时候,具体工厂类的继承关系和由这些工厂类生成的产品需要进行设计和实现. 我们需要仔细考虑这些多付出的工作是否真的可以产生出来更高的灵活性. 使用这个策略会使设计变的更加复杂,然而,你可以先从工厂方法模式开始来实现这个策略,然后在需要的情况下再转向抽象工厂

设计DaoFactory

首先,我们把DaoFactory设计成单例的【工厂有一个就够了!】

    public class DaoFactory {
    
        private DaoFactory() {
            
        }
    
        private static final DaoFactory DAO_FACTORY = new DaoFactory();
        
        //暴露公开方法获取工厂对象
        public static DaoFactory newInstance() {
            return DAO_FACTORY;
        }
        
    }

目前我们操作的是User,所以工厂造UserDao对象,而UserDao对象是JDBC版呢,还是XML版呢,我们通过配置文件来定(这样就更灵活了)!

在src目录下加入配置文件

注意:不要加""字符串的符号!!!!!我就是这里搞了很久!!!!

#class需要的是完整的对象名称(包括包)
#userClass=zhongfucheng.dao.impl.UserImplDataBase
userClass=zhongfucheng.dao.impl.UserImplXML

读取配置文件的信息,创建相对应的UserDao对象,直接在构造函数做就行了(其实就是个初始化的操作罢了)

    private static UserDao userDao = null;

    private DaoFactory() {


        try {

            //读取配置文件的信息
            InputStream inputStream = DaoFactory.class.getClassLoader().getResourceAsStream("UserDao.properties");
            Properties properties = new Properties();
            properties.load(inputStream);
            String userClass = properties.getProperty("userClass");

            //利用反射机制创建相对应的对象
            userDao = (UserDao) Class.forName(userClass).newInstance();

        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("读取文件失败了!");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new RuntimeException("反射失败了!");
        } catch (InstantiationException e) {
            e.printStackTrace();
            throw new RuntimeException("反射失败了!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("反射失败了!");
        }

    }

    public static UserDao createUserDao() {
        return userDao;
    }
在BusinessService层中用DaoFactory获取UserDao对象
    UserDao userDao = DaoFactory.newInstance().createUserDao();
测试

如果我们的mysql驱动版本太低,就出现以下的异常!我们只需要下载新的mysql的jar包,导入项目即可!

    java.sql.SQLException: Feature not implemented Query:insert into guestbook (id,name,email,url,title,content,time) value(?,?,?,?,?,?,?) Parameters: [1, qwq,wqwq,qwqw,qw,qw, 2010-09-13]

JDBC版的成功的效果如下

XML版的成功效果如下:

总结

由于我们的Service层可能有多种实现【jdbc,xml】,如果我们直接是使用new具体的Service,那么这耦合性就有点高了

于是我们有了工厂,工厂的目的就是解耦,我们通过配置文件来创建具体的对象。

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68532.html

相关文章

  • Java3y文章目录导航

    摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...

    KevinYan 评论0 收藏0
  • AJAX+JAVA用户登陆注册验证

    摘要:需求通过异步刷新页面验证用户输入的账号密码是否在数据库中存在。下面是下查询的代码查询用户名是否存在语句连接代码关于类关于控制层获取到输入的用户名调用中的查询方法设置字符编码关闭资源 需求 通过ajax异步刷新页面验证用户输入的账号密码是否在数据库中存在。 技术栈 JSP+Servlet+Oracle 具体代码 JSP部分: Insert title here fu...

    Forelax 评论0 收藏0
  • web开发安全框架中的Apache Shiro的应用

    摘要:安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证授权加密和会话管理等功能。本质上是一个特定安全的。当配置时,必须指定至少一个用来进行身份验证和或授权。提供了多种可用的来获取安全相关的数据。 web开发安全框架中的Apache Shiro的应用前阶段就hadoop的分享了一些内容,希望对新手入门的朋友有点帮助吧!对于hadoop新手入门的,还是比较推荐大快搜索...

    2json 评论0 收藏0
  • MySQL笔记 —— jdbc工具类(网站的修改密码,注册账号,注销账号功能)

    摘要:比如将建立连接的代码放入工具类里面,工具类提供给外界一个获取的方法,需要的时候直接调用方法即可。 在之前的这篇博客里面MySQL笔记 —— jdbc连接数据库(增删...

    NickZhou 评论0 收藏0
  • Servlet编写注册登录页面

    摘要:新建一个项目选择自己的文件勾选项目构造如下设置项目配置快捷键选择配置红色框选择时,运行成功会会自动运行下方的链接测试运行出现如下便创建成功编写第一个代码,测试环境是否设置成功第一个设置响应内容类型实际的逻辑是 新建一个servlet项目 Flies --> new --> project-->ProjectSDK选择自己的JDK文件-->勾选Web Appliction -->Next...

    hellowoody 评论0 收藏0

发表评论

0条评论

jayzou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<