Java架构设计之用户口

来自CloudWiki
跳转至: 导航搜索

任务描述

1.创建用户操作的业务逻辑层

  • 用户注册
  • 用户登陆验证
  • 展示所有用户

2. 对用户操作的数据访问层做必要改动

3. 编写表示层的代码


实训原理

Java2020-12-3.png

表示层

表示层又称表现层UI,位于三层构架的最上层,与用户直接接触,主要是B/S信息系统中的Web浏览页面。作为Web浏览页面,表示层的主要功能是实现系统数据的传入与输出,在此过程中不需要借助逻辑判断操作就可以将数据传送到BLL系统中进行数据处理,处理后会将处理结果反馈到表示层中。换句话说,表示层就是实现用户界面功能,将用户的需求传达和反馈,并用BLL或者是Models进行调试,保证用户体验。

业务逻辑层

业务逻辑层BLL的功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,会连接数据访问层DAL,访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的修改、获取、删除等功能,并将处理结果反馈到表示层UI中,实现软件功能。

数据访问层

数据访问层DAL是数据库的主要操控系统,实现数据的增加、删除、修改、查询等操作,并将操作结果反馈到业务逻辑层BLL。在实际运行的过程中,数据访问层没有逻辑判断能力,为了实现代码编写的严谨性,提高代码阅读程度,一般软件开发人员会在该层中编写DataAccessCommon,保证数据访问层DAL数据处理功能。


任务准备

加载指定数据库的驱动程序

Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件。

你可以从群邮件里下载MySQL驱动 jar 包:mysql-connector-java-5.1.39-bin.jar

导入数据库驱动程序

具体参见 Eclipse导入数据库驱动程序

创建测试数据

接下来我们在 MySQL 中创建 cloud 数据库,并创建 user 数据表,表结构如下:

mysql> create database cloud;
    
Query OK, 1 row affected (0.00 sec)

mysql> use cloud;
Database changed
mysql>  CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(100) NOT NULL,
   `password` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )  
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql>  CREATE UNIQUE INDEX uname on user(name);
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

插入一些数据:

mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123456');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123457');
ERROR 1062 (23000): Duplicate entry 'ma' for key 2

</nowiki>

建立数据连接类MyCon

 
package dao;

import java.sql.*;

public class MyCon {
	
	public static Connection conn = null;
	
	/**
	   * 连接数据库
	   * @param 值为空
	   * @return Connection 建立的数据库连接
	*/
    public static boolean getConn() {   
 
			// JDBC 驱动名及数据库 URL
		  final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
		  final String DB_URL = "jdbc:mysql://10.0.0.30:3306/cloud?characterEncoding=utf8";
		  final String USER = "root";
		  final String PASS = "000000";
		  
	    try {
	        Class.forName(JDBC_DRIVER); //classLoader,加载对应驱动
	        conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS);
	        System.out.println("MySQL连接成功!");
	    } catch (ClassNotFoundException e) {
	    	System.out.println(e.getMessage());
	    	return false;
	    } catch (SQLException e) {
	    	System.out.println(e.getMessage());
	    	return false;
	    }
	    return true;
   }
    public static boolean disConn() { 
		try {
           conn.close();
           System.out.println("MySQL关闭成功!");
        } catch (SQLException e) {
           System.out.println(e.getMessage());
           return false;
        }
		return true;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        getConn();
        disConn();
	}

}

运行一下,看看能否连接数据库 ?

数据访问层

UserDao接口

本接口改动不大,主要是queryUser( )返回值变成了ArrayList<User>类型。

变动的原因是 现在软件分层了,数据库查询到的数据不宜直接在dao层打印了,通过arraylist传出去

package dao;

import java.util.ArrayList;

import entity.User;

public interface UserDao {
	  public boolean addUser(User u);//添加用户
	 
	  public ArrayList<User> queryUser( );//查询用户,这里返回值改为了ArrayList<User>	   
	  
	  public int hasUser(String name);//查询某个用户是否存在,返回uid
	
	  public boolean verify(String name, String pwd);//验证用户名和密码是否一致
	  
	  
}


UserDaoSQL实现类

建立UserDaoSQL类

package dao;

import java.sql.*;
import java.util.ArrayList;
import java.util.Scanner;

import entity.User;

public class UserDaoSQL implements UserDao{
	
    Connection conn;
	
    public UserDaoSQL(){
    	conn  = MyCon.conn;//建立数据连接;
    }
    public static void main(String[] args) throws Exception{
}
}

添加用户方法addUser

	  /**
	   * 向数据库中添加用户
	   * @param user,要添加的用户
	   * @return 返回值为空
	   */
	public boolean addUser(User user){//添加用户     
		
        String sql = "insert into user (name,password) values(?,?)";
        PreparedStatement pstmt;
        try {
            pstmt = (PreparedStatement) conn.prepareStatement(sql);
            pstmt.setString(1, user.getName());
            pstmt.setString(2, user.getPwd());  //pstmt.setInt(2, user.getAge()); pstmt.setDate  
                        
            int i = pstmt.executeUpdate();
            pstmt.close();
            if(i!=0){
            	return true;
            	//System.out.println(g.getName()+"插入成功!");
	        }    
            
        } catch (SQLException e) {
        	System.out.println(e.getMessage());
        }
        return false;
        
	}

查询某用户是否存在hasUser()

	  /**
	   * 验证用户名是否存在
	   * @param name,用户名	 
	   * @return 布尔值
	   */
	  public int hasUser(String name){//查询某个用户是否存在
		  int id = 0;//标记验证是否成功          
		
	    	try { 
	    		   		
	    		String sql = "select id from user where name=? ";
	    		PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);	    		
	            pstmt.setString(1, name);
	            
	            ResultSet rs = pstmt.executeQuery();//执行查询    		
	    		
	    		if(rs.next()) {  
	    			//System.out.println("欢迎" + rs.getString("name"));
	    			id=rs.getInt("id");
	    		} 
	    		pstmt.close();           
	            
	    	 }catch (SQLException e) {
	             System.out.println(e.getMessage());
	         }
	        	 
	    	return id;   
  
	  }

查询所有用户queryUser

	 /**
	   * 向数据库中查询所有用户
	   * @param 值为空
	   * @return 值为空
	   */
	  public ArrayList<User> queryUser( ){//查询用户	 
		  String sql = "select * from user";
	      PreparedStatement pstmt;
	      ArrayList<User> uarray = new ArrayList<>();
	      try {
	            pstmt = (PreparedStatement)conn.prepareStatement(sql);
	            ResultSet rs = pstmt.executeQuery();//执行查询
	            int col = rs.getMetaData().getColumnCount();//获取字段数
	            //System.out.println("============================");
	            while (rs.next()) {   
		               int id =rs.getInt(1);
		               String name = rs.getString(2);
		               String pwd = rs.getString(3);
		               User u = new User(id,name,pwd); 
		               uarray.add(u);
		               //System.out.print(rs.getString(i) + "\t");	               
		            }
	            //System.out.println("============================");
	        } catch (SQLException e) {
	        	System.out.println(e.getMessage());
	        }
	        return uarray;
	  }

验证用户名和密码是否正确verify

	/**
	   * 验证用户名和密码是否正确
	   * @param usename,用户名
	   * @param password,密码
	   * @return 建立的数据库连接
	   */
	 public   boolean verify(String username, String password) {
		 boolean success=false;
		
		 try { 
		    		
		    		ResultSet rs = null;   //建立一个空的结果集

		                //1.创建PreparedStatement 对象,让它与一条SQL模板绑定;
		    		String sql = "select * from user where name=? and password=?";
		    		PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
		    		

		                //使用2. setXXX()系列方法为sql命令设置值
		                pstmt.setString(1, username);//
		                pstmt.setString(2, password);  //setInt,setFloat

		                //3.执行查询 
		                rs = pstmt.executeQuery();//   		
		    		
		    		if(rs.next()) {  
		    			success=true;
		    		} else {  
		    			success=false;
		    		}
		    		pstmt.close();
		           
		}catch (SQLException e) {
		            System.out.println(e.getMessage());
		}
		
		return success;	    	
		    
	 }
	 

测试代码

public static void main(String[] args) throws Exception{
		 
		 MyCon.getConn();//建立数据库连接
		 UserDaoSQL uds =new UserDaoSQL();
		 Scanner sc = new Scanner(System.in);
		 
		 /* 用户登录操作 */
		 boolean success;
		 String name,pwd;
		 
		 do {
		    System.out.println("请输入用户名:");//"ma","123456"
	    	name =sc.next();
	        System.out.println("请输入密码:");
	        pwd = sc.next();
	        success=uds.verify(name, pwd);
	        if(success) {
		    	 System.out.println("登录成功!");
		     }else {
		    	 System.out.println("登录失败!");
		     }
		 }while(success!=true);
		 
		 /* 添加新用户 */
		 int id =0;
	     do {
	    	System.out.println("新用户注册:");
	    	System.out.println("请输入新用户名:");
	    	name =sc.next();
	        System.out.println("请输入新密码:");
	        pwd = sc.next();
	        id=uds.hasUser(name);
	        System.out.println("该用户的id号为:"+id);
	        if(id!=0) {System.out.println("已存在,请另寻新名");}
	     }while(id!=0);//验证此用户名是否存在,否则,重复输入     
	     
	     User u1=new User(name,pwd);
	     if(uds.addUser(u1)==true) {
	    	 System.out.println("注册成功!");
	     }else {
	    	 System.out.println("注册失败!");
	     }
		 
	     /*查询 所有用户 */
	     System.out.println("现有全部用户");
	     System.out.println(uds.queryUser());
	     
	     /*关闭连接 */	     
	     sc.close();
	     MyCon.disConn();
	 }

业务逻辑层

Java2020-12-1.png

创建服务类UserService

package service;
import java.util.ArrayList;

import dao.*;
import entity.*;
//import exception.UserException;
public class UserService {
	
	/**
	 * 用户集类(用于存储用户
	 */
	private UserDao userset = null;
	
	
	public UserService() {
		userset = new UserDaoSQL();
	}
}

添加用户addUser()

	
	public String addUser(User user){
		String message = "";
		boolean success = userset.addUser(user);
		if(success == true) {
            message =("用户 "+user.getName() +" 注册成功");
		}else {
			message =("用户 "+user.getName() +" 注册失败");
		}
		return message;
	}

查询函数queryUser( )

/*
	 * 查询仓库中的用户
	 */
	public ArrayList<User> queryUser( ){		
		ArrayList<User> users =userset.queryUser();
		//测试代码
		/*
		System.out.println("本店现有如下用户:");
		for(User user:users){
			System.out.println(user); 
		}
		*/
		return users;


	}

验证函数login()

	public String [] login(String name, String pwd) {//返回:1. uid,2.登录信息
		String[]  info = new String[2];
		
		int id = userset.hasUser(name);
		info[0]= Integer.toString(id);info[1]="";//info0:uid号;info1:提示信息
		if(id == 0){
			//throw new UserException("用户 "+name+":该用户不存在");
			info[1] = ("用户 "+name+":该用户不存在");
			
		}else if(!userset.verify(name, pwd)){
			//throw new UserException("用户 "+name+":用户名或密码错误");
			info[1] = ("用户 "+name+":用户名或密码错误");
			
		}else {
		    info[1] = ("用户 "+name+" 登陆成功!");
		}
		return info;
	
	}

main方法中测试

	
	public static void main(String[] args) {
		MyCon.getConn();//建立数据库连接		
	    UserService us =new UserService();
	    Scanner sc = new Scanner(System.in);
	    
	    /* 用户登录操作 */
		 
		String name,pwd;		
		System.out.println("请输入用户名:");//"ma","123456"
	    name =sc.next();
	    System.out.println("请输入密码:");
	    pwd = sc.next();
	    String[] info = us.login(name,pwd);
	    System.out.println("该用户的id号为"+info[0]);
	    System.out.println(info[1]);
		
		 
		 /* 添加新用户 */
	     
	    System.out.println("新用户注册:");
	    System.out.println("请输入新用户名:");
	    name =sc.next();
	    System.out.println("请输入新密码:");
	    pwd = sc.next();       
	       
	    User u1=new User(name,pwd);
	    System.out.println(us.addUser(u1));
		 
	     /*查询 所有用户 */
	    System.out.println("现有全部用户");
	    System.out.println(us.queryUser());
	     
	     /*
	    User u1=new User("zhangliu","456");
	    System.out.println(us.addUser(u1));
	    System.out.println(us.queryUser( ));
	    System.out.println(us.login("zhangliu","123"));
	    */
	    /*关闭连接 */	     
	    MyCon.disConn();
		
	}

完整代码


package service;
import java.util.ArrayList;
import java.util.Scanner;

import dao.*;
import entity.*;
//import exception.UserException;
public class UserService {
	
	/**
	 * 用户集类(用于存储用户
	 */
	private UserDao userset = null;
	
	
	public UserService() {
		userset = new UserDaoSQL();
	}
	
	public String addUser(User user){
		String message = "";
		boolean success = userset.addUser(user);
		if(success == true) {
            message =("用户 "+user.getName() +" 注册成功");
		}else {
			message =("用户 "+user.getName() +" 注册失败");
		}
		return message;
	}
	
	public String [] login(String name, String pwd) {//返回:1. uid,2.登录信息
		String[]  info = new String[2];
		
		int id = userset.hasUser(name);
		info[0]= Integer.toString(id);info[1]="";//info0:uid号;info1:提示信息
		if(id == 0){
			//throw new UserException("用户 "+name+":该用户不存在");
			info[1] = ("用户 "+name+":该用户不存在");
			
		}else if(!userset.verify(name, pwd)){
			//throw new UserException("用户 "+name+":用户名或密码错误");
			info[1] = ("用户 "+name+":用户名或密码错误");
			
		}
		info[1] = ("用户 "+name+" 登陆成功!");
	    
		return info;
	
	}
	
    /*
	 * 查询仓库中的用户
	 */
	public ArrayList<User> queryUser( ){		
		ArrayList<User> users =userset.queryUser();
		//测试代码
		/*
		System.out.println("本店现有如下用户:");
		for(User user:users){
			System.out.println(user); 
		}
		*/
		return users;


	}
	
	public static void main(String[] args) {
		MyCon.getConn();//建立数据库连接		
	    UserService us =new UserService();
	    Scanner sc = new Scanner(System.in);
	    
	    /* 用户登录操作 */
		 
		String name,pwd;		
		System.out.println("请输入用户名:");//"ma","123456"
	    name =sc.next();
	    System.out.println("请输入密码:");
	    pwd = sc.next();
	    String[] info = us.login(name,pwd);
	    System.out.println("该用户的id号为"+info[0]);
	    System.out.println(info[1]);
		
		 
		 /* 添加新用户 */
	     
	    System.out.println("新用户注册:");
	    System.out.println("请输入新用户名:");
	    name =sc.next();
	    System.out.println("请输入新密码:");
	    pwd = sc.next();       
	       
	    User u1=new User(name,pwd);
	    System.out.println(us.addUser(u1));
		 
	     /*查询 所有用户 */
	    System.out.println("现有全部用户");
	    System.out.println(us.queryUser());
	     
	     /*
	    User u1=new User("zhangliu","456");
	    System.out.println(us.addUser(u1));
	    System.out.println(us.queryUser( ));
	    System.out.println(us.login("zhangliu","123"));
	    */
	    /*关闭连接 */	     
	    MyCon.disConn();
		
	}
}

显示层

显示层 调用业务逻辑层的代码,完成查询

Java2020-12-4.png

客户端

main/TestUser:

package main;

import java.util.Scanner;

import dao.MyCon;
import service.*;

public class TestUser {
	public  static void start(Scanner sc){
		
		System.out.println("****************************");
		System.out.println("*****欢迎登录商院面馆平台客户端****");
		System.out.println("****************************");
		System.out.println("账号:");
		String uname = sc.nextLine();
		System.out.println("密码:");
		String pwd = sc.nextLine();
		//System.out.println("用户名为:"+uname+",密码为:"+pwd);	
			    
	    UserService us =new UserService(); 
		String info[]= us.login(uname,pwd);
		int uid = Integer.valueOf(info[0]);
	    System.out.println("用户ID:"+uid+" 登录信息:"+info[1]);//打印登录信息
	    
		 	
   }
	
	
	public static void main(String[] args) throws Exception{
		MyCon.getConn();//建立数据库连接	 
		Scanner sc = new Scanner(System.in);
		start(sc);
		MyCon.disConn();//关闭数据库连接	
	     
	 }
}

输出结果:

Java2020-12-5.png

管理端

管理端显示层功能:

1. 添加用户

2. 展示所有用户

管理员先在这两个功能中选择其一,然后根据选择、调用业务逻辑层的不同方法,实现功能。