package com.imau.entry;
/*
*
-
用户表
*/
public class User {private Long id;
private String uname;
private String upass;
private String utel;public User(){
}
public User(Long id,String uname,String upass,String utel){
this.id= id; this.uname=uname; this.upass=upass; this.utel=utel;
}
public User(String uname,String upass,String utel){
this.uname=uname; this.upass=upass; this.utel=utel;
}
public Long getId(){
return id;
}
public void setId(Long id){
this.id=id;}
public String getUname(){
return uname;
}
public void setUname(String uname){
this.uname=uname;}
public String getUpass(){
return upass;
}
public void setUpass(String upass){
this.upass=upass;}
public void setUtel(String utel){
this.utel=utel;
}
public String getUtel(){
return utel;
}@Override
public String toString() {
return “User [id=” + id + “, uname=” + uname + “, upass=” + upass + “, utel=” + utel + “]”;
}
}
package com.iamu.view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.iamu.controller.UserController;
import com.iamu.view.Login.MyListener;
import com.imau.base.BaseFrame;
import com.imau.entry.User;
import com.imau.util.UserInfo;
public class UserPassEditView extends BaseFrame {
private UserController controller;
private JLabel loldPass;
private JLabel lnewPass;
private JLabel lnewPassConfim;
private JPasswordField toldPass;
private JPasswordField tnewPass;
private JPasswordField tnewPassConfim;
private JButton submit,cancel;
private JPanel panel;
//构造方法
public UserPassEditView(){
controller=new UserController();
this.setJMenuBar(initMenu());
init();
setFrame();
}
private void init(){
loldPass=new JLabel("旧密码");
lnewPass=new JLabel("新密码");
lnewPassConfim=new JLabel("确认新密码");
toldPass=new JPasswordField(10);
tnewPass=new JPasswordField(10);
tnewPassConfim=new JPasswordField(10);
submit=new JButton ("确认");
cancel=new JButton ("取消");
panel=new JPanel();
panel.add(loldPass);
panel.add(toldPass);
panel.add(lnewPass);
panel.add(tnewPass);
panel.add(lnewPassConfim);
panel.add(tnewPassConfim);
panel.add(submit);
panel.add(cancel);
this.add(panel);
}
private void initEvnet(){
submit.addActionListener(new MyListener2());
cancel.addActionListener(new MyListener2());
}
class MyListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String newPass=tnewPass.getText();
String oldPass=toldPass.getText();
String newPassConfim=tnewPassConfim.getText();
//判断旧密码是否正确
if(!UserInfo.getUser().getUpass().equals(oldPass)){
System.out.println("旧密码输入不正确");
}
//新密码和确认密码一样
if(!newPass.equals(newPassConfim)){
System.out.println("两次密码输入不一致");
}
User user= UserInfo.getUser();
user.setUpass(newPass);
controller.editPass(user);
}
}
}
package com.imau.dao.base;
import java.beans.FeatureDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import com.iamu.jdbc.DBUtils;
import com.imau.util.SqlType;
import com.imau.util.Sqlutil;
//数据库操作的基本父类
public class DaoImpl implements Dao {
private Connection conn;
private PreparedStatement pstm;
private ResultSet rs;
private T t2;
private String sql;
//反射
Class<T> type;
private FeatureDescriptor method;
//获取T的class对象,获取泛型的类型,泛型是在被子类继承时才确定
public DaoImpl()
{
//给反射泛型
//获取子类的类型
Class clazz=this.getClass();
//获取父类的类型
//getGenericSuperclass()用来获取当前类的父类的类型
//ParameterizedType表示的是带泛型的类型
ParameterizedType parameterizedType=(ParameterizedType) clazz.getGenericSuperclass();
//获取具体的泛型类型getActualTypeArguments获取具体的泛型的类型
//这个方法会返回一个type的数组
Type[] types=parameterizedType.getActualTypeArguments();
//获取具体的泛型的类型
this.type=(Class<T>) types[0];
}
@Override
public int add(T t) {
try{
sql=Sqlutil.getSql(t,1);
//1.获取连接
conn=DBUtils.getConn();
//2.执行命令
pstm=conn.prepareStatement(sql);
//3.填充占位符 如何调用对象的get方法
Sqlutil.initPstm(t,pstm,SqlType.Insert);
//4.执行命令
int row=pstm.executeUpdate();
//5.关闭连接
DBUtils.close(conn,pstm,null);
return row;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
//按照主键
@Override
public int delete(T t) {
try{
sql=Sqlutil.getSql(t, 2);
conn=DBUtils.getConn();
pstm=conn.prepareStatement(sql);
Sqlutil.initPstm(t, pstm, SqlType.Delete);
//3.处理结果
int row=pstm.executeUpdate();
//4.关闭连接
DBUtils.close(conn,pstm,null);
return row;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
@Override
public int update(T t) {
try{
sql=Sqlutil.getSql(t, 3);
//1.获取连接
conn=DBUtils.getConn();
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
Sqlutil.initPstm(t, pstm, SqlType.Update);
//3.处理结果
int row=pstm.executeUpdate();
//4.关闭连接
DBUtils.close(conn,pstm,null);
return row;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
//用户对象:
@Override
public T find(T t) {
try{
t2=type.newInstance();
sql=Sqlutil.getSql(t, 4);
//1.获取连接
conn=DBUtils.getConn();
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
Sqlutil.initPstm(t, pstm, SqlType.Query);
//3.查询
rs=pstm.executeQuery();
//4.处理结果
Sqlutil.handlerRs((Class<T>) t2, rs);
//5.关闭连接
DBUtils.close(conn,pstm,rs);
}catch(Exception e){
e.printStackTrace();
}
return t2;
}
public void fieldVau(T t,Field fields[],String colName,Object colVau){
for(Field field:fields){
try{
//找到对应的属性:int和integer类型可以互相转换的;拆箱
if(field.getName().equals(colName)&&!colName.equals("id")){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(field.getName(),t.getClass());
//属性可读的方法
System.out.println(method.getName()+","+colVau);
Method method=pd.getReadMethod();
//强制访问方法
}
}catch(Exception e){
e.printStackTrace();
}
}
}
//System.out.println(t);
//t:对象放的查询条件值:查询条件语句
@Override
public List query(T t) {
ArrayList<T> list;
try{
t2=type.newInstance();
sql=Sqlutil.getSql(t, 4);
//1.获取连接
conn=DBUtils.getConn();
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
Sqlutil.initPstm(t, pstm,SqlType.Query);
//3.查询
rs=pstm.executeQuery();
//4.处理结果
list= (ArrayList<T>) Sqlutil.handlerRs(type, rs);
//5.关闭连接
DBUtils.close(conn,pstm,rs);
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
@Override
public List<T> query(Object field, String oper,Object arg) {
ArrayList<T> list;
try{
t2=type.newInstance();
sql=Sqlutil.getSql(type,field, oper);
System.out.println(sql);
//1.获取连接
conn=DBUtils.getConn();
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
pstm.setObject(1,arg);
//3.查询
rs=pstm.executeQuery();
//4.处理结果
list= (ArrayList<T>) Sqlutil.handlerRs(type, rs);
//5.关闭连接
DBUtils.close(conn,pstm,rs);
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
package com.imau.util;
import java.beans.FeatureDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import com.imau.entry.User;
import com.mysql.jdbc.PreparedStatement;
public class Sqlutil {
private static final FeatureDescriptor method = null;
private static String tableName="";
private static String sql="";
private static StringBuffer sflied=new StringBuffer();
private static StringBuffer sValue=new StringBuffer();
private static StringBuffer sfield;
private static Object t;
//填充预处理命令占位符
public static <T> PreparedStatement initPstm(T t,java.sql.PreparedStatement pstm,SqlType sqlType){
Field fields[]=t.getClass().getDeclaredFields();
try{
for (int i=0;i<fields.length;i++){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(fields[i].getName(),t.getClass());
//属性可读的方法
Method method=pd.getReadMethod();
//添加 修改
if(sqlType==SqlType.Insert){
//排除主键
if(i!=0){
pstm.setObject(i, method.invoke(t));
}
}else if( sqlType==SqlType.Update){
//排除主键
if(i==0){
//upate ewt nds where id=?
pstm.setObject(fields.length, method.invoke(t));
}else{
pstm.setObject(i, method.invoke(t));
}
}else if( sqlType==SqlType.Delete)//删除
{
//字段是否是主键
if(fields[i].getName().equals("id")){
pstm.setObject(i, method.invoke(t));
}
int flag=0;
Object v=method.invoke(t);
if(v!=null ){
pstm.setObject(1,v);
}
}
}
} catch (Exception e){
e.printStackTrace();
}
return null ;
}
//返回sql语句1 2 3 4
public static <T> String getSql(T t,int sqlType){
tableName=t.getClass().getSimpleName().toLowerCase();
if(sqlType==1){
sql="insert into"+tableName+"(";
Field fields[]=t.getClass().getDeclaredFields();
for (int i=1;i<fields.length;i++){
if(i!=fields.length-1){
sflied.append(fields[i].getName()).append(",");
sValue.append("?");
}else{
sflied.append(fields[i].getName());
sValue.append("?");
}
}
sql=sql+sflied.toString()+") values("+sValue.toString()+")";
}
if(sqlType==2){
String sql="delete from "+tableName+" where id = ?";
}
if(sqlType==3){
sql="update"+tableName+" set ";
Field fields[]=t.getClass().getDeclaredFields();
for (int i=1;i<fields.length;i++){
if(i!=fields.length-1){
sflied.append(fields[i].getName()).append("=").append("?,");
}else{
sflied.append(fields[i].getName()).append("=").append("?");
}
}
sql=sql+sflied+" where id=?";
}
//new User(“ddd”,“123456”,“12355”)
if(sqlType==4){
try{
int flag=0;
sql="select *from"+tableName+"where uname=? and ss";
Field fields[]=t.getClass().getDeclaredFields();
for (int i=0;i<fields.length;i++){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(fields[i].getName(),t.getClass());
//属性可读的方法
Method method=pd.getReadMethod();
Object v=method.invoke(t);
if(v!=null ){
if(flag!=0){
sfield. append("and ");
sfield. append(fields[i].getName()).append(" = ? ");
}else{
sfield. append(fields[i].getName()).append(" = ? ");
flag=1;
}
}
}
sql=sql+sfield ;
}catch(Exception e){
e.printStackTrace();
}
}
return sql;
}
public static <T> String getSql(Class<T> clazz,Object field,String oper){
tableName=clazz.getSimpleName().toLowerCase();
sql="select*from"+tableName;
//select*from user where id>?
if(!field.equals(" ") && field!=null ){
sql=sql+"where"+field+""+oper+" ? ";
}
return sql;
}
//处理结果集:映射对象赋值
public static <T> List<T> handlerRs(Class<T> clazz,ResultSet rs){
ArrayList<T> list=new ArrayList<>();
try{
ResultSetMetaData rsmd=rs.getMetaData();
Field fields[]=clazz.getDeclaredFields();
while(rs.next()){
T t=clazz.newInstance();
//获取查询数据库的列数
for(int i=0; i<rsmd.getColumnCount();++i){
//字段列名->对象属性赋值
String colName =rsmd.getColumnName(i+1);
Object colVau=rs.getObject(colName);
fieldVau(t,fields,colName,colVau);
}
list.add(t);
}
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void fieldVau(T t,Field fields[],String colName,Object colVau){
for(Field field:fields){
try{
//找到对应的属性:int和integer类型可以互相转换的;拆箱
if(field.getName().equals(colName)&&!colName.equals("id")){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(field.getName(),t.getClass());
//属性可读的方法
System.out.println(method.getName()+","+colVau);
Method method=pd.getReadMethod();
//属性赋值
method.invoke(t, colVau);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
package com.imau.dao.base;
import java.util.List;
//数据库操作的基本规范
public interface Dao {
//增删改查
public int add(T t);
public int delete(T t);
public int update(T t);
public T find(T t);
public List<T> query(T t);
public List<T> query(Object field,String oper,Object arg);
}
package com.imau.util;
public enum SqlType {
Insert,Delete,Update,Query;
}
package com.iamu.service;
import com.imau.dao.base.UserDao;
import com.imau.dao.user.UserDaoImpl;
import com.imau.entry.User;
public class UserService {
private UserDaoImpl dao;
//在构造方法中初始化
public UserService(){
dao=new UserDaoImpl();
}
//按照用户名密码去查询:admin 123456
public User byNamePass(String uname,String upass) {
User user=new User();
user.setUname(uname);
user.setUpass(upass);
return dao.find(user);
}
public void editPass(User user){
dao.update(user);
}
}
package com.iamu.controller;
import com.iamu.service.UserService;
import com.imau.entry.User;
import com.imau.util.UserInfo;
public class UserController {
private UserService service;
//初始化
public UserController(){
service=new UserService();
}
//请求登录
public boolean login(String uname,String upass){
return service.byNamePass(uname,upass)==null ? false :true;
}
public boolean saveUserInfo(String uname,String upass){
User user=service.byNamePass(uname,upass);
UserInfo.setUser(user);
return true;
}
public void editPass(User user){
service.editPass(user);
}
}
package com.iamu.view;
import java.awt.;
import javax.swing.;
import com.iamu.controller.UserController;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Login extends JFrame {
private UserController controller;
private JLabel lname;
private JLabel lpass;
private JTextField tname;//用户名是明文
private JPasswordField tpass;//密码不是明文
private JButton login;
private void initEvnet(){
login.addActionListener(new MyListener());
}
private void init(){
lname=new JLabel("用户名");
lpass=new JLabel("密码");
tname=new JTextField(14);
tpass=new JPasswordField(14);
login=new JButton ("登录");
initEvnet();//做调用
this.setLayout(new FlowLayout(FlowLayout.CENTER));
this.add(lname);
this.add(tname);
this.add(lpass);
this.add(tpass);
this.add(login);
Dimension dim=getToolkit().getScreenSize();
int w=dim.height/2;
int h=dim.width/2;
this.setResizable(false);
this.setTitle("用户登录");
this.setSize(230,150);
this.setLocation(w-230/2,h-150/2);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Login(){
init();
controller=new UserController();
}
public void close(){
this.setVisible(false);
}
//处理器的方法
class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String uname=tname.getText();
String upass=tpass.getText();
//检查用户名密码
if(controller.login(uname, upass)){
//保存用户信息
controller.saveUserInfo(uname, upass);
//关闭当前页面
dispose();
//显示主页面
new MainView();
}else{
System.out.println("用户名密码错误");
}
}
}
}
package com.iamu.view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.iamu.controller.UserController;
import com.iamu.view.Login.MyListener;
import com.imau.base.BaseFrame;
import com.imau.entry.User;
import com.imau.util.UserInfo;
public class UserPassEditView extends BaseFrame {
private UserController controller;
private JLabel loldPass;
private JLabel lnewPass;
private JLabel lnewPassConfim;
private JPasswordField toldPass;
private JPasswordField tnewPass;
private JPasswordField tnewPassConfim;
private JButton submit,cancel;
private JPanel panel;
//构造方法
public UserPassEditView(){
controller=new UserController();
this.setJMenuBar(initMenu());
init();
setFrame();
}
private void init(){
loldPass=new JLabel("旧密码");
lnewPass=new JLabel("新密码");
lnewPassConfim=new JLabel("确认新密码");
toldPass=new JPasswordField(10);
tnewPass=new JPasswordField(10);
tnewPassConfim=new JPasswordField(10);
submit=new JButton ("确认");
cancel=new JButton ("取消");
panel=new JPanel();
panel.add(loldPass);
panel.add(toldPass);
panel.add(lnewPass);
panel.add(tnewPass);
panel.add(lnewPassConfim);
panel.add(tnewPassConfim);
panel.add(submit);
panel.add(cancel);
this.add(panel);
}
private void initEvnet(){
submit.addActionListener(new MyListener2());
cancel.addActionListener(new MyListener2());
}
class MyListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String newPass=tnewPass.getText();
String oldPass=toldPass.getText();
String newPassConfim=tnewPassConfim.getText();
//判断旧密码是否正确
if(!UserInfo.getUser().getUpass().equals(oldPass)){
System.out.println("旧密码输入不正确");
}
//新密码和确认密码一样
if(!newPass.equals(newPassConfim)){
System.out.println("两次密码输入不一致");
}
User user= UserInfo.getUser();
user.setUpass(newPass);
controller.editPass(user);
}
}
}
package com.imau.util;
import com.imau.entry.User;
public class UserInfo {
public static User user;
public static void setUser(User u){
user=u;
}
public static User getUser(){
return user;
}
}