原文链接

前言:在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!

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

使用C3P0--数据库连接池

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

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

        <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>mchange-commons-java</artifactId><version>0.2.15</version></dependency>    

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

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

我们来改造一下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/first?&amp;serverTimezone=UTC</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.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/first?&amp;serverTimezone=UTC</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>

注意:使用高版本MySQL8.0和mysql-connector-java:8.0.15驱动(用Maven导包)时:

    1、driverClass为com.mysql.cj.jdbc.Driver,而不是com.mysql.jdbc.Driver。

    2、jdbcUrl后面一定要设置时区:serverTimezone(如果用IDEA直连MySQL数据库也要设置!如下图)

    

    3、如果直连时提示没有驱动,而IDEA自动下载失败时(Class那一栏也要改成com.mysql.cj.jdbc.Driver,虽然我还是自动下载失败),可以手动导入(如果Maven过,在本地仓库找包)

    

    4.查看官方文档,mysql-connector-java:8.0.15驱动需要JDK1.8.x。

Connector/J version JDBC version MySQL Server version JRE Supported JDK Required for Compilation Status
8.0 4.2 5.6, 5.7, 8.0 1.8.x 1.8.x General availability. Recommended version.
5.1 3.0, 4.0, 4.1, 4.2 5.6*, 5.7*, 8.0* 1.5.x, 1.6.x, 1.7.x, 1.8.x* 1.5.x and 1.8.x General availability

     * JRE 1.8.x is required for Connector/J 5.1 to connect to MySQL 5.6, 5.7, and 8.0 with SSL/TLS when using some cipher suites.

写获取连接的工具类DBUtils

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("数据库初始化失败了!");}}}

设计数据库表

根据实体表来设计就好了!(如果直连了IDEA就直接new Table,否则用navicat,当然命令行也行)

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 {public User find(String username, String password) {return null;}public void register(User user) {}}

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

  • 导入dbutils的开发包

    <dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.6</version>
    </dependency>

具体的代码如下

@Overridepublic User find(String username, String password) {QueryRunner queryRunner = new QueryRunner(DBUtils.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;} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("登陆失败了!");}}@Overridepublic void register(User user) {QueryRunner queryRunner = new QueryRunner(DBUtils.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版呢,我们通过配置文件来定(这样就更灵活了)!

  • 在resources目录下加入配置文件

  • 注意:不要加""字符串的符号!

#class需要的是完整的对象名称(包括包)
userClass=dao.UserImplDataBase
#userClass=dao.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;}

在Service层中改用DaoFactory获取UserDao对象

  UserDao userDao = DaoFactory.newInstance().createUserDao();

转载于:https://www.cnblogs.com/yolo929/p/10743460.html

登录注册页面(连接MySQL8.0.15版本)相关推荐

  1. Java连接MySQL8.0以上版本

    Java连接MySQL8.0以上版本 MySQL和JDBC版本 连接步骤与注意事项 整个流程的代码 MySQL和JDBC版本 MySQL8.0 mysql-connector-java-8.0.13. ...

  2. Java连接MySQL8.0以上版本数据库方式

    Java连接MySQL8.0以上版本数据库方式 MySQL 8.0 开始数据库相比常用的 5.X 版本发生了比较大的变化,我们在连接数据库的过程中许多地方也要发生一些变化. 总结一下,想要利用 mys ...

  3. Navicat连接mysql8.0.1版本出现1251--Client does not support authentication protocol requested by server的解决

    转载自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客 ...

  4. Navicat连接mysql8.0.1版本出现1251--Client

    ```bash ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

  5. FineReport——JDBC 连接 MySQL8.0 版本数据库

    1.描述 下面介绍 Windows 操作系统下 JDBC 连接 MySQL8.0 版本数据库的两种方法. 2. 方法一 1)删除%FR_HOME%\webapps\webroot\WEB-INF\li ...

  6. Navicat连接MySQL8.0版本时出现Client does not support authentication protocol requested by server;报错的问题解决办法

    Windown系统下 遇到 Navicat连接MySQL8.0版本时出现Client does not support authentication protocol requested by ser ...

  7. 关于Mysql8.0.26版本与IDEA连接的配置

    关于Mysql8.0.26版本与IDEA连接的配置 driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?us ...

  8. Mybaits连接MySQL8.0版本的配置

    Mybaits连接MySQL8.0版本的配置 1.更改Maven配置文件 2.修改Mybaits的配置文件 2.1使用的是xml配置方式 2.2 使用的是properties文件的配置方式 1.更改M ...

  9. 七.【Python3.8+Django3.0从零开始系列】Django3.0+Python3.8连接MySql8.0及遇到的问题解决

    目录 一.Django3.0连接MySql8.0准备 二.安装pymysql 三.安装mysqlclient 错误解决方法: 四.使用PyCharm的可视化数据库管理工具,连接Mysql8创建数据库 ...

  10. Linux下安装二进制版mysql-8.0.15

    1.添加用户 ## 添加用户组 groupadd mysql ## 添加用户,指定用户home目录 useradd -g mysql mysql -d /data/mysql ## 解压下载的mysq ...

最新文章

  1. NC14414 小AA的数列
  2. 企业网络推广——企业网络推广专员讲述网站友链交换如何做
  3. 全球及中国原料药产业投资动态及未来运行前景分析报告2021-2027年
  4. a类学科计算机,最全名单来了!上海交大25个学科获评A类学科
  5. c语言课程设计加密程序,C语言课程设计文件加密解密.doc
  6. 数据结构---顺序查找和二分查找
  7. [css] 要是position跟display、overflow、float这些特性相互叠加后会怎么样?
  8. 前端 验证码隐藏怎么实现_Python爬虫教程:200行代码实现一个滑动验证码
  9. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
  10. 信息学奥赛C++语言:蛋糕盒子
  11. C++中如何小数点后精确到两位输出
  12. vue mianjs 引用css_7个有用的Vue开发技巧
  13. Linux 安装DenyHost防止ssh被暴力破解
  14. 同事乱用分页 MySQL 卡爆,我真是醉了...
  15. mysql temp table_新特性解读 | MySQL 8.0 Temptable 引擎介绍
  16. 带蓝牙5.0芯片选型厂商总结和市场趋势分析
  17. IP地址中,A、B、C三类地址的区别
  18. mti杂波抑制仿真 matlab,MTI+MTD+CFAR简单仿真
  19. 基于ssm的仿微博系统的设计与实现
  20. 线性代数笔记【特征值】

热门文章

  1. 如何优雅的使用iBatis
  2. 哈希(不可逆)加密通用类库函数
  3. cmd 下关闭不需要的进程
  4. “霸榜CLUE” ,刚刚发布的业界最大中文NLP预训练模型有多强?
  5. 介绍4个大神常用而你不常用的python函数--assert,map,filter,reduce
  6. 【福利派送】高质量AI书籍免费送给大家
  7. IDEA报Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
  8. Zabbix监控系统深度实践
  9. 二十一天学通Java:调用对象为null值的引用
  10. 16.4 多模态情感识别