登录注册页面(连接MySQL8.0.15版本)
原文链接
前言:在讲解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?&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?&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>
具体的代码如下
@Override
public 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("登陆失败了!");
}
} @Override
public 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();
登录注册页面(连接MySQL8.0.15版本)的更多相关文章
- Java连接MySQL8.0以上版本数据库方式
MySQL 8.0 开始数据库相比常用的 5.X 版本发生了比较大的变化,我们在连接数据库的过程中许多地方也要发生一些变化. 总结一下,想要利用 mysql-connector-java 与 MySQ ...
- 使用navicat连接mysql8.0.12版本 出现client does not support。。。解决办法
navicat版本的问题 出现连接失败的原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password ...
- Navicat连接mysql8.0.1版本出现1251--Client does not support authentication protocol requested by server的解决
转载自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客 ...
- 关于8.0.15版本的mysql下载与安装
下载MYSQL 官网下载MYSQL8.0.15版本,链接地址https://www.mysql.com/downloads/,流程如下 点击进入后,网页滑到最下面,根据自己电脑的型号下载相应的版本 安 ...
- (Win10)Java,Maven,Tomcat8.0,Mysql8.0.15安装与环境配置,以及IDEA2019.3使用JDBC连接MySQL、创建JavaEE项目
之前用windows+linux的双系统,最近不怎么舒服就把双系统给卸了,没想到除了问题,导致有linux残余,于是就一狠心重装了电脑,又把Java及其相关的一些东西重新装了回来,还好当初存了网盘链接 ...
- mysql8.0.15二进制安装
mysql8.0.15二进制安装 今天有幸尝试安装了社区版本的mysql8.0.15,记录下来,供以后方便使用.特此感谢知数堂的叶老师,提供了配置文件的模板. # 第一部分:系统配置 # 1.安装系统 ...
- Linux下安装二进制版mysql-8.0.15
1.添加用户## 添加用户组groupadd mysql## 添加用户,指定用户home目录useradd -g mysql mysql -d /data/mysql## 解压下载的mysql二进制包 ...
- MySQL安装 8.0.15版本
windows下MySQL 8.0.15的安装和设置 MySQL下载地址:https://dev.mysql.com/downloads/mysql/ 我的百度网盘下载(win64位):链接:http ...
- Centos7 安装MySQL8.0.15
1.删除原有的mariadb,不然mysql装不进去 mariadb-libs-5.5.52-1.el7.x86_64 rpm -qa|grep mariadb rpm -e --nodeps mar ...
随机推荐
- 2018-2019-2 20175236实验二《Java面向对象程序设计》实验报告
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 没有Linux基础的同学建议先学习<Lin ...
- [UE4]Spline使用注意事项
一.如果在Character中使用Spline,则使用Add Spline Mesh Componet的时候,要注意设置Transform.Mobility为Movable 二.使用Predict P ...
- IIS发布ASP.NET Core
安装IIS.程序和功能--程序卸载--启用或关闭Windows功能 安装.NET Core SDK和Runtime.下载网址 https://www.microsoft.com/net/downloa ...
- windows下的Redis主从集群搭建
Redis官方不提供Windows版本,目前Windows下的版本是有微软开源团队(Microsoft Open Tech group)维护. http://redis.cn/ redis中文网 wi ...
- Windows10最新更新破坏了PowerShell功能
Java9%E6%8E%A5%E8%BF%91%E4%BA%A4%E4%BB%98%E6%97%A5%E6%9C%9F%E5%92%8C%E8%8C%83%E5%9B%B4%E5%AE%A1%E6%9 ...
- CentOS7下安装Redis5.0.2
1.下载redis 地址 http://download.redis.io/releases/redis-5.0.2.tar.gz 2.解压tar -zxf redis-5.0.2.tar.gz 3. ...
- Oracle数据库中OVER()函数的了解
1.over函数介绍: 开窗函数,Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. ...
- Android开发 解决EditText与NestedScrollView 滚动冲突问题
问题简述 在将EditText套进NestedScrollView的情况下,EditText输入了多行内容后,无法触摸滚动到第一行 问题原因 在将EditText套进NestedScrollView的 ...
- Exp3 免杀原理与实践 20164313
基础 AV厂商检测恶意软件的三种主流方式: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 实现免杀就是防止恶意软件被这是三种方式找到.具体手段为: 改变特征码 改变行为 非常规恶意软件 ...
- (14/24) css进阶:(入门)去除冗余的css
在平时的项目开发中,我们会引入一些框架,比如:Bootstrap,但是在项目中通常我们只使用它的一小部分,还有部分是冗余的.更有甚有时候需求更改,带来DOM结构的更改,这时候我们可能无暇关注CSS样式 ...