MySQL设计软件登录模块
2016-04-22 20:59
507 查看
学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例。
大致实现的功能就是注册于登录还有就是用到了一点,分层思想。仅此而已,所以非常的适合新手围观。
首先是建表语句咯。
从这里就可以简单的看到分层的脉络了吧。
核心就是MVC设计理念,每一个都肩负着自己的使命,完成不同的任务。Model + View + Controller 结合是我们今后开发软件必不可少的一项能力。所以我们一定要在平时锻炼自己这方面的思维,这样才能游刃有余。
domain:即所谓的实体层,也成为bean层,“盛放”的就是一个对象,我们的数据元。
dao:即Data Access Object,数据访问对象。肩负着和底层(比如数据库,网络请求等等)打交道的责任。
service:业务逻辑层,主要是一个桥梁的作用,连接着DAO层和View层,实现我们在View层中进行的业务逻辑。
view:视图层,直接和用户打交道的层。给用户展现一个视图,方便用户使用软件,和直接进行操作。
util: 工具包。我们常用的比如数据库utils,网络请求utils,ioutils等等吧,都可以放到这里面来,给开发带来方便快捷的使用,也在一定程度上减少了重复性代码的编写,利于代码的维护。
test: 如果说在软件开发过程中,有一个包必不可少。那么这一定是test包,我们可以使用System.out.println的方式调试,也可以打断点的方式,或者使用JUnit的方式来完成对某一段代码编写完成后的简单的测试。所有的测试都是有必要的,因为很有可能一个很小的前期的bug,就会引起后期开发过程中的致命的危险。
bean类如下User.java:
DbUtils.java:
UserDao.java:
下面附上这个项目的打包的源码,有需要的博友可以拿去参考一下拙作。
项目源码下载链接
大致实现的功能就是注册于登录还有就是用到了一点,分层思想。仅此而已,所以非常的适合新手围观。
建立好数据库
我这里使用的是MySQL数据库,当然了,你可以选择任何你喜欢的你熟悉的数据库管理软件,只不过在建立数据库连接的时候细节不一样罢了。其作用都是一样的。首先是建表语句咯。
/* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50624 Source Host : localhost:3306 Source Database : database01 Target Server Type : MYSQL Target Server Version : 50624 File Encoding : 65001 Date: 2016-04-22 20:01:09 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `tb_user` -- ---------------------------- DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(15) NOT NULL, `password` varchar(20) NOT NULL, `email` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
然后是我的目录结构
从这里就可以简单的看到分层的脉络了吧。
导包
千万千万,记得导入MySQL的jar包,然后BuildPath这是必不可少的一步。否则的话,项目就进行不下去咯。然后是思路,这也是最核心的地方
之所以分层,就是为了解决开发过程中的迷茫。这就好比我们盖房子,如果没有一个框架,随心所欲的按照自己的思路来盖房子,有可能在盖房子的中途就会出现各种意想不到的问题,到最后即使是盖出了房子,恐怕也不是我们心目中想要的结果吧。而分层就相当于搭建好一个框架,然后我们按照一种模式,在本模块上进行“丰富”,到最后把这些模块整合起来就成为了我们所希望的了。这同时也是面向对象编程的核心思想。在面向对象的世界里,万事万物皆是对象。有时候我们感觉迷茫,不是因为事物本身,而是我们面向对象解决问题的思路还没有打开罢了。核心就是MVC设计理念,每一个都肩负着自己的使命,完成不同的任务。Model + View + Controller 结合是我们今后开发软件必不可少的一项能力。所以我们一定要在平时锻炼自己这方面的思维,这样才能游刃有余。
domain:即所谓的实体层,也成为bean层,“盛放”的就是一个对象,我们的数据元。
dao:即Data Access Object,数据访问对象。肩负着和底层(比如数据库,网络请求等等)打交道的责任。
service:业务逻辑层,主要是一个桥梁的作用,连接着DAO层和View层,实现我们在View层中进行的业务逻辑。
view:视图层,直接和用户打交道的层。给用户展现一个视图,方便用户使用软件,和直接进行操作。
util: 工具包。我们常用的比如数据库utils,网络请求utils,ioutils等等吧,都可以放到这里面来,给开发带来方便快捷的使用,也在一定程度上减少了重复性代码的编写,利于代码的维护。
test: 如果说在软件开发过程中,有一个包必不可少。那么这一定是test包,我们可以使用System.out.println的方式调试,也可以打断点的方式,或者使用JUnit的方式来完成对某一段代码编写完成后的简单的测试。所有的测试都是有必要的,因为很有可能一个很小的前期的bug,就会引起后期开发过程中的致命的危险。
代码展示
由于代码比较多,我就列出来几个简单的类吧,方便查看。bean类如下User.java:
package domain; import java.io.Serializable; public class User implements Serializable { private String username; private String password; private String email; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", email=" + email + "]"; } public User(String username, String password, String email) { super(); this.username = username; this.password = password; this.email = email; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
DbUtils.java:
package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbUtils { private static String URL = "jdbc:mysql://localhost:3306/database01"; private static String DRIVER = "com.mysql.jdbc.Driver"; private static String ROOT = "root"; private static String PASSWORD = "mysql"; private static Connection conn = null; /** * 获得数据库连接对象 * @return */ public static Connection getConnection() { try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, ROOT, PASSWORD); if(conn != null ) { return conn; } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if(conn == null ){ throw new RuntimeException("Sorry, Connection is null! Please Check it!"); } } return null; } /** * 释放数据库连接对象,避免出现资源的空等和浪费 */ public void releaseConnection() { try { if(conn != null ){ conn.close(); conn = null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
UserDao.java:
package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import domain.User; import utils.DbUtils; public class UserDao { /** * 与数据库打交道的数据访问层,注册用户方法的实现 * @param user * @return */ public boolean register(User user) { if(isUserExist(user.getUsername())){ return false; } Connection conn = null; try { conn = DbUtils.getConnection(); String sql = "insert into tb_user(username,password,email) values(?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getEmail()); boolean counts = ps.execute(); if (counts) { return true; } else { return false; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (SQLException e2) { // TODO: handle exception } } return false; } /** * 登录 * 只有在用户名和密码都匹配的情况下才能获取登陆成功的权限 * @param username * @param password * @return */ public boolean login(String username, String password) { Connection conn = null; try { conn = DbUtils.getConnection(); String sql = "select count(*) totalCount from tb_user where username='" + username + "' and password= '" + password + "'"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet result = ps.executeQuery(); boolean counts = result.next(); int totalCount = 0; if (counts) { totalCount = result.getInt("totalCount"); if(totalCount>=1){ return true; }else { return false; } } } catch (Exception e) { // TODO: handle exception } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } ////////////////////////////////////////////////////////////////////////////////////////////////这个方法存在问题:不管用户名是什么都会返回一个true,然而这显然不是我想要的结果 /** * 给定一个用户名,判断该用户名是否已经被注册 * * @param username * @return */ public boolean isUserExist(String username) { Connection conn = null; try { conn = DbUtils.getConnection(); String sql = "select password from tb_user where username='" + username + "'"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet result = ps.executeQuery(); boolean userPassword = result.next(); if(userPassword){ return true; }else{ return false; } } catch (Exception e) { // TODO: handle exception } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return true; } }
总结
本次代码量不是很大,而且不是很难,就是些简单的和数据库操作,Swing创建,以及MVC架构的实现。可能在代码中有些地方做得不够好,希望大家予以批评指正。下面附上这个项目的打包的源码,有需要的博友可以拿去参考一下拙作。
项目源码下载链接
相关文章推荐
- MySQL设计软件登录模块
- 【MySQL】存储过程、游标、循环简单实例
- Mysql执行计划查看
- mysql - 内存表使用总结
- hibernate mysql查询首字母排序两表连接外键
- mysql 存储过程while循环插入语句
- 利用mycat实现基于mysql5.5主从复制的读写分离
- 利用mycat实现基于mysql5.5主从复制的读写分离
- MYSQL 的SQL 语句用法大全
- sqlite、mysql和postgresql对比
- 使用mysqladmin命令修改Mysql密码
- 第一次配置mysql是出现错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- 使用mysqladmin命令修改Mysql密码
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
- 记录一下mysql的递归。。
- mysql添加用户
- MySQL 主从热备份(读写分离)
- 用户命令行方式连MYSQL数据库
- MySQL单表操作
- 查看 MySQL 数据库中每个表占用的空间大小