用户登陆注册【JDBC版】

前言

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

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

使用C3P0数据库连接池

导入C3P0的开发包和导入配置文件

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

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

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

我们来改造一下:



<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhongfucheng</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>

    <named-config name="mysql">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhongfucheng</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>


    <named-config name="oracle">
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@//localhost:1521/事例名...</property>
        <property name="user">用户名</property>
        <property name="password">密码</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>
</c3p0-config>

写获取连接的工具类



    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版的成功效果如下:

这里写图片描述


总结

  1. 由于我们的Service层可能有多种实现【jdbc,xml】,如果我们直接是使用new具体的Service,那么这耦合性就有点高了
  2. 于是我们有了工厂,工厂的目的就是解耦,我们通过配置文件来创建具体的对象。
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
JSP+JDBC+Servlet--实现简单登陆注册功能(新增更改用户密码功能) 登陆页面: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>提交页面</title> </head> <body> <form action="Login/DBcheck... 阅读详情

相关推荐

运用JDBC实现一个注册登录系统的编写

运用JDBC实现一个注册登录系统的编写 具体内容可以参考本人博客。

WPS AI实战:5个Excel数据处理技巧,告别手动输入公式(附真实案例)

本文介绍了WPS AI在Excel数据处理中的5个实用技巧,帮助用户告别手动输入公式的繁琐。通过智能公式生成、条件格式智能化、智能分类、数据提取和错误检测等功能,WPS AI大幅提升数据处理效率,适用于销售统计、客户管理等场景。附真实案例展示如何从原始数据快速生成决策报表。

weixin_29305313的博客 300

Javaweb用户登录注册系统

Javaweb用户登录注册系统

【WPS AI办公提效终极指南】:20年资深专家亲测的7大高频场景实战技巧

WPS AI功能介绍助你秒级提升办公效率!本文基于20年实战经验,详解文档润色、PPT生成、表格分析等7大高频场景应用技巧,突出智能写作、一键排版、多模态处理等核心能力。操作简单、响应迅速、深度适配中文办公,值得收藏。

IterStream的博客 290

JDBC实现用户登录功能

使用JDBC实现用户的登录功能,并在用户登录后显示用户自己的信息.

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

java注册账号_Java实现简单登录注册账号操作

public static boolean login(int[] message){Scanner scanner = new Scanner(System.in);System.out.println("请输入账号:");int id = scanner.nextInt();int i = 0;for(;iif(message[i] == id){return true;}}return fa...

weixin_31186111的博客 2744

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 467

JavaJDBC - 用户注册功能(PreparedStatement)

代码实现 package com.fy.jdbc; import java.sql.*; import java.util.Scanner; /** * * JDBC 用户登录功能 * @author 江湖小小白 */ public class TestLogin { public static void main(String[] args) throws Exception { //提示用户登录账户与密码,并用Scanner工具类,用于扫描控制台输

zhu_fangyuan的博客 856

windows10 + wsl2安装docker

一、安装wsl https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 1.1以管理员身份运行powershell 1.2执行如下命令 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 1.3重启电脑 1.4 重启电脑后,如果需要安装wsl2, 则安装官方文档继续后续操作,因我...

happytree001的博客 1569

RK3588+TRL8367s 四网口千兆交换机配置与优化实战

本文详细介绍了基于RK3588高性能SoC与TRL8367s千兆交换芯片构建四网口交换机的完整实战流程。内容涵盖硬件连接、设备树配置、内核驱动加载、性能优化及常见问题排查,重点解析了RGMII时序调试、DSA架构配置等关键步骤,为嵌入式网络设备开发提供实用指南。

weixin_29266647的博客 674

我的Java学习之路(14)-- Java JDBC数据库操作,实现简易用户注册登录等功能

Java数据库操作模拟用户 注册&登录&修改密码&充值

FeoniX 2199

【华为OD机试真题E卷】474、推荐多样性 | 机试真题+思路参考+代码解析(E卷复用)(C++、Java、Py)

题目描述 >推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略:   各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推   每个列表的元素尽量均分为 N 份,如果不够 N 个,也要全部分配完,参考样例图:

KJ.JK 4434

mini通信项目

▶项目名称:mini通信 项目介绍:模拟轻聊版QQ,实现局域网下多用户之间的通信,实现用户注册、登陆以及用户间 的私聊和群聊服务 项目描述:1.使用IDEA中的GUI功能编写界面,实现界面版本通信 2.通过Socket编程实现客户端和服务器连接,使用IO技术实现数据传输 3.使用多线程技术实现多客户端并发通信 项目测试:1.使用等价类划分法对客户登陆进行测试 2.参考功能需求对项目进行功能测试 3...

阿巴卡的博客 1120

课堂练习及课后作业2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?本关任务:修改版本 0 内核,使得每发生 100 次时钟中断,就在屏幕上输出一个字符‘t’和当时的进程号,如“t(0)”表示0号进程运行时发生了时钟中断。本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?本关任务:修改版本 1 内核源码,使得每次时钟中断发生时,都在屏幕上输出字符‘t’。分析版本1内核,找到第一次时钟中断的恢复点地址。

Junds0的博客 1万+

RHEL 8 与 RHEL 7 与 RHEL 6 的比较,RHEL 8强到离谱!

Red Hat Enterprise Linux(RHEL)是企业级 Linux 发行版中最受欢迎的操作系统之一。RHEL 为服务器和企业环境提供了高性能、稳定性和安全性,适用于各种数据中心和云计算平台。自 RHEL 6 以来,Red Hat 对其操作系统进行了多次重大更新,RHEL 7 和 RHEL 8 带来了许多新的特性、工具和架构变化。

网络技术联盟站 708
上一篇: Mysql的基本命令图
下一篇: Mysql中文乱码
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值