项目介绍:
环境使用的是mysql5.2+java1.7+navicat_java。
项目内涉及到MVC模式,数据库连接,JDBC等知识。
项目要求连接到数据库上,使用Java代码实现对数据库增删改查操作。
一,设计功能
二,准备工作(UML属性图,建立数据库,MVC模式简介)
1,设计相关属性类型
这里有必要说一下为啥id使用varchar类型,因为使用整型的id,在网页地址上就会很容易的被不法分子猜到下一个用户的id,对于用id索引的页面来说这样是非常不安全的,容易泄露内部信息。所以,这里推荐使用32位随即生成的UUID类型的id,id重复率极低,并且也保护了用户信息。
2,设计数据库,数据表
3,设计MVC模式功能
架构应该做到可维护性,可修改性。
MVC模式:用视图层(View)访问业务层(Model),业务层写功能。控制器接受请求。视图层和Controller进行交互。控制器向模型层索要用户列表。模型层找到用户列表的模型,返回给模型,模型再返回给控制器,控制器再拿给视图。
三,编写JDBC工具包
编写JDBC工具类,写一个工具类受用终身。数据库不也就是增删改查嘛,写好之后以后工作直接拿来用,赛高。
位置:
参考程序:
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 数据库连接工具类 * @author Administrator * */ public class JDBCUtil { private static final String DB_USER_NAME="root";//数据库用户名 private static final String DB_PASSWORD="root";//数据库密码 private static final String DB_NAME="user_management";//数据库名称 private static final String IP="127.0.0.1";//服务器IP地址 private static final String URL="jdbc:mysql://"+IP+":3306/"+DB_NAME;//mysql连接 private static Connection conn;//创建连接对象(路) private static Statement stmt;//执行命令的对象(执行sql语句)(人) private static ResultSet rs;//保存select之后查询结果的数据的对象(车) /** * 获取数据库连接对象Connection * @return * @throws ClassNotFoundException * @throws SQLException */ private static Connection getCon() throws ClassNotFoundException, SQLException{ //加载MySql驱动 Class.forName("com.mysql.jdbc.Driver"); if(conn==null||conn.isClosed()){ conn=DriverManager.getConnection(URL, DB_USER_NAME, DB_PASSWORD); } return conn;//java单例模式可以让代码更优秀 } /** * 获得statement对象用于执行Sql语句 * @return * @throws ClassNotFoundException * @throws SQLException */ private static Statement openStmt() throws ClassNotFoundException, SQLException{ stmt=getCon().createStatement(); return stmt; } /** * 执行数据库的增(insert),删(delete),改(update)操作 * @param sql * @return */ public static int executeSQL(String sql){ int i=0; try { i=openStmt().executeUpdate(sql);//执行sql语句 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //关闭数据库相关对象 close(); } return i; } /** * 执行数据库查询(select)的操作 * @param sql * @return */ public static ResultSet search(String sql){ try { rs=openStmt().executeQuery(sql); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return rs; } /** * 关闭数据库的方法 */ public static void close(){ //先关车,再关人,最后关路 try { if(rs!=null) { rs.close();//关闭ResultSet(车) } if(stmt!=null) { stmt.close();//关闭Statement对象(人) } if(conn!=null) { conn.close();//关闭Connrction对象(路) } } catch (SQLException e) { e.printStackTrace(); } } }
四,编写MVC模式功能
像这样先建好mvc分开的三个包存储对应的代码,这样子方便维护。
就拿注册界面举例,其他功能都是换汤不换药。
1,在Model里面建立一个model界面
这里是注册功能用的RegeditModel界面(名字我们自己取的)
参考 程序:
package model; import java.util.UUID; import entity.User; import util.JDBCUtil; /** * 用户注册导包 * @author Administrator * */ public class RegeditModel { public boolean userRegedit(User user){ boolean isOk=false; String id=(UUID.randomUUID()+"").replace("-",""); //字符串截断,镶嵌id String sql = "insert into t_user values('"+id+"', '"+user.getUsername()+"', '"+user.getPwd()+"', '"+user.getSex()+"', "+user.getAge()+", '"+user.getPhone()+"', '"+user.getEmail()+"', '"+user.getIdcard()+"', '"+user.getAddr()+"')"; int i=JDBCUtil.executeSQL(sql); if(i>0) isOk=true; return isOk; } }
2,建立一个Controller来做中转用
不管多少个功能,都可以写在一个controller文件下,他就是实例化对象调用函数用的。
参考程序:
package controller; import java.sql.ResultSet; import entity.User; import model.LoginModel; import model.RegeditModel; import model.ShowModel; import model.UpdateModel; /** * 控制层 * @author Administrator * */ public class UserController { /** * 找到用户业务模型,并执行业务方法 * @param user * @return */ public boolean regedit(User user){ RegeditModel model=new RegeditModel(); return model.userRegedit(user); }
这里头是注册功能,所以实例化了一个User对象,用来储存属性值信息。放在了enitity包下
参考程序:
package entity; public class User { private String id; private String username; private String pwd; private String sex; private int age; private String phone; private String email; private String idcard; private String addr; public User(){ } public User(String id, String username, String pwd, String sex, int age, String phone, String email, String idcard, String addr) { this.id = id; this.username = username; this.pwd = pwd; this.sex = sex; this.age = age; this.phone = phone; this.email = email; this.idcard = idcard; this.addr = addr; } public final String getId() { return id; } public final void setId(String id) { this.id = id; } public final String getUsername() { return username; } public final void setUsername(String username) { this.username = username; } public final String getPwd() { return pwd; } public final void setPwd(String pwd) { this.pwd = pwd; } public final String getSex() { return sex; } public final void setSex(String sex) { this.sex = sex; } public final int getAge() { return age; } public final void setAge(int age) { this.age = age; } public final String getPhone() { return phone; } public final void setPhone(String phone) { this.phone = phone; } public final String getEmail() { return email; } public final void setEmail(String email) { this.email = email; } public final String getIdcard() { return idcard; } public final void setIdcard(String idcard) { this.idcard = idcard; } public final String getAddr() { return addr; } public final void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", pwd=" + pwd + ", sex=" + sex + ", age=" + age + ", phone=" + phone + ", email=" + email + ", idcard=" + idcard + ", addr=" + addr + "]"; } }
3,建立View界面
参考程序:
package view; import controller.UserController; import entity.User; /** * 视图层 * @author Administrator * */ public class RegeditView { public static void main(String[] args) { UserController controller=new UserController(); User u = new User(null, "admin", "123456", "男", 20, "13333337890", "2342434@qq.com", "220980776853675524", "吉林省长春市朝阳区"); if(controller.regedit(u)){ System.out.println("注册成功"); } else{ System.out.println("注册失败"); } } }
4,其他功能请重复123........
五,全部程序
全部程序我粘贴在这里:
1,Controller
package controller; import java.sql.ResultSet; import entity.User; import model.LoginModel; import model.RegeditModel; import model.ShowModel; import model.UpdateModel; /** * 控制层 * @author Administrator * */ public class UserController { /** * 找到用户业务模型,并执行业务方法 * @param user * @return */ public boolean regedit(User user){ RegeditModel model=new RegeditModel(); return model.userRegedit(user); } public boolean login(String name,String pwd){ LoginModel model=new LoginModel(); return model.userLogin(name, pwd); } public ResultSet show(String name){ ShowModel model=new ShowModel(); return model.showinfo(name); } public int update(String id,String username,String pwd,String sex,int age,String phone,String email,String idcard,String addr){ UpdateModel model=new UpdateModel(); return model.userUpdate(id, username, pwd, sex, age, phone, email, idcard, addr); } }
2,Model
这里一定要记得在业务层关闭数据库啊!!! 不然不部关数据库的话 当使用人数变多的时候 数据库就会反应不过来而导致崩溃的啊!!!一定要加上JDBCUtil.close();!!!
登录功能LoginModel
package model; import java.sql.ResultSet; import java.sql.SQLException; import util.JDBCUtil; public class LoginModel { public boolean userLogin(String uname,String pwd){ boolean isOk=false; String sql="select* from t_user where username='"+uname+"' and pwd='"+pwd+"'"; ResultSet rs=JDBCUtil.search(sql); try { isOk=rs.next(); } catch (SQLException e) { e.printStackTrace(); }
JDBCUtil.close(); return isOk; } }
注册功能RegeditModel
package model; import java.util.UUID; import entity.User; import util.JDBCUtil; /** * 用户注册导包 * @author Administrator * */ public class RegeditModel { public boolean userRegedit(User user){ boolean isOk=false; String id=(UUID.randomUUID()+"").replace("-",""); //字符串截断,镶嵌id String sql = "insert into t_user values('"+id+"', '"+user.getUsername()+"', '"+user.getPwd()+"', '"+user.getSex()+"', "+user.getAge()+", '"+user.getPhone()+"', '"+user.getEmail()+"', '"+user.getIdcard()+"', '"+user.getAddr()+"')"; int i=JDBCUtil.executeSQL(sql); if(i>0) isOk=true;
JDBCUtil.close(); return isOk; } }
展示信息ShowModel
package model; import java.sql.ResultSet; import util.JDBCUtil; public class ShowModel { public ResultSet showinfo(String name){ String sql="select * from t_user where username='"+name+"'"; ResultSet rs=JDBCUtil.search(sql); JDBCUtil.close(); return rs; } }
更新功能UpdateModel
package model; import util.JDBCUtil; public class UpdateModel { public int userUpdate(String id,String username,String pwd,String sex,int age,String phone,String email,String idcard,String addr){ String sql="update t_user set username='"+username+"',pwd='"+pwd+"',sex='"+sex+"',age='"+age+"',phone='"+phone+"',email='"+email+"',idcard='"+idcard+"',addr='"+addr+"' where id='"+id+"'"; int i=JDBCUtil.executeSQL(sql); System.out.println("更新"+username+"的数据成功");
JDBCUtil.close(); return i; } }
3,View
登录页面LoginView
package view; import java.util.Scanner; import controller.UserController; public class LoginView { public static void main(String[] args) { /** * 用户登录 */ UserController controller=new UserController(); boolean flag=true; while(flag){ System.out.println("用户登录"); System.out.println("请输入用户名"); Scanner sc=new Scanner(System.in); String name=sc.next(); System.out.println("请输入密码:"); String pwd=sc.next(); if(controller.login(name,pwd)){ System.out.println("登陆成功"); flag=false; }else{ System.out.println("登陆失败"); } } } }
注册界面RegeditView:
package view; import controller.UserController; import entity.User; /** * 视图层 * @author Administrator * */ public class RegeditView { public static void main(String[] args) { UserController controller=new UserController(); User u = new User(null, "admin", "123456", "男", 20, "13333337890", "2342434@qq.com", "220980776853675524", "吉林省长春市朝阳区"); if(controller.regedit(u)){ System.out.println("注册成功"); } else{ System.out.println("注册失败"); } } }
展示信息界面ShowView:
package view; import java.sql.ResultSet; import java.sql.SQLException; import controller.UserController; public class ShowView { public static void main(String[] args) { UserController controller=new UserController(); ResultSet rs=controller.show("陆双"); try { while(rs.next()){ String id=rs.getString("id"); String name=rs.getString("username"); String pwd=rs.getString("pwd"); String sex=rs.getString("sex"); int age=rs.getInt("age"); String phone=rs.getString("phone"); String email=rs.getString("email"); String idcard=rs.getString("idcard"); String addr=rs.getString("addr"); System.out.println(id+","+name+","+pwd+","+pwd+","+sex+","+age+","+phone+","+email+","+idcard+","+addr); } } catch (SQLException e) { e.printStackTrace(); } } }
更新界面UpdateView:
package view; import controller.UserController; public class UpdateView { public static void main(String[] args) { UserController controller=new UserController(); int i=controller.update("d8a27f32ad8a4b98a49d6de2ab584b36", "陆双", "122332", "女", 20, "13309098080", "232323@qq.com", "211321200109097776", "黑龙江省"); System.out.println(i); } }
六,代码优化
优化的是查询功能
可以使用ArrayList 内部存储User类型数据,让查询功能更有结构化
1,Model.UserListModel
package model; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import entity.User; import util.JDBCUtil; public class UserListModel { public List<User> selectUsers(){ List<User> users=new ArrayList<>(); String sql="select * from t_user"; ResultSet rs=JDBCUtil.search(sql); try { while(rs.next()){ String id=rs.getString("id"); String username=rs.getString("username"); String pwd=rs.getString("pwd"); String sex=rs.getString("sex"); int age=rs.getInt("age"); String phone=rs.getString("phone"); String email=rs.getString("email"); String idcard=rs.getString("idcard"); String addr=rs.getString("addr"); User u=new User(id, username, pwd, sex, age, phone, email, idcard, addr); users.add(u); } JDBCUtil.close(); } catch (SQLException e) { e.printStackTrace(); } return users; } }
2,Controller
package controller; import java.sql.ResultSet; import java.util.List; import entity.User; import model.LoginModel; import model.RegeditModel; import model.ShowModel; import model.UpdateModel; import model.UserListModel; /** * 控制层 * @author Administrator * */ public class UserController { /** * 找到用户业务模型,并执行业务方法 * @param user * @return */ public boolean regedit(User user){ RegeditModel model=new RegeditModel(); return model.userRegedit(user); } public boolean login(String name,String pwd){ LoginModel model=new LoginModel(); return model.userLogin(name, pwd); } public ResultSet show(String name){ ShowModel model=new ShowModel(); return model.showinfo(name); } public int update(String id,String username,String pwd,String sex,int age,String phone,String email,String idcard,String addr){ UpdateModel model=new UpdateModel(); return model.userUpdate(id, username, pwd, sex, age, phone, email, idcard, addr); } /** * 获得全部用户 */ public List<User> getusers(){ UserListModel model=new UserListModel(); return model.selectUsers(); } }
3,View.UserView
package view; import java.util.List; import controller.UserController; import entity.User; public class UserView { public static void main(String[] args) { UserController con=new UserController(); List<User> list=con.getusers(); for(User a:list){ System.out.println(a); } } }