mysql数据库的一个学生信息管理系统案例,涉及了一些sql语句的用法以及增删改查的通用方法,适合初学mysql数据库的同学借鉴,方法都是最基本的方法,易懂

为了书写简单我将所有的类都放到同一个包stu包中了,代码的具体实现原理均有注解,
适合初学mysql数据库的同学借鉴,方法都是最基本的方法,易懂。
关于数据库表的字段:除了sid是int类型,且是主键和自增长约束,其他的name、age等都是varchar
先看实体类,只是简单定义了几个简单的属性,其信息与数据库中表的字段信息一致

package com.stu;

public class Stu //定义实体类,//private一些表字段信息作为属性
{
	private int sid;//学号
	private String sname;//姓名
	private String sage;//年龄
	private String sex;//性别
	private String saddress;//住址
	private String grade;//院系
	public int getSid() //通过set/get方法进行属性值的修改与获取
	{
		return sid;
	}
	public void setSid(int sid) 
	{
		this.sid = sid;
	}
	public String getSname() 
	{
		return sname;
	}
	public void setSname(String sname) 
	{
		this.sname = sname;
	}
	public String getSage() 
	{
		return sage;
	}
	public void setSage(String sage) 
	{
		this.sage = sage;
	}
	public String getSex() 
	{
		return sex;
	}
	public void setSex(String sex)
	{
		this.sex = sex;
	}
	public String getSaddress() 
	{
		return saddress;
	}
	public void setSaddress(String saddress) 
	{
		this.saddress = saddress;
	}
	public String getGrade() 
	{
		return grade;
	}
	public void setGrade(String grade) 
	{
		this.grade = grade;
	}
	
}

接口:接口中总共定义了五个要实现的功能方法,

package com.stu;

import java.util.List;
import java.util.Map;

public interface StuDao //定义接口,定义要实现的功能方法
{
	public boolean addStu(Stu s);//增加的方法
	public boolean deleteStu(Stu s);//删除的方法
	public boolean updataStu(Stu s);//修改的方法
	public Map<String,Object> selectByIdStu(Stu s);//查单个信息的方法
	public List<Map<String,Object>> selectAllStu(Stu s);//查询所有信息的方法
}

简单的工具类,进行数据库的链接与关闭,并定义了两个操作数据库的通用方法。

package com.stu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BaseDao //定义一个基本的工具类
{
	public static Connection getCon()//链接数据库的方法 ,数据库为school,表为stu
	{	
		Connection con=null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","root");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	public static void closeCon(Connection con,ResultSet rs,PreparedStatement psmt)
	{  //关闭数据库的方法
		try {
			if(con!=null)//不判断会报空指针异常
			{
				con.close();
			}
			if(rs!=null)
			{
				rs.close();
			}
			if(psmt!=null)
			{
				psmt.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public boolean update(String sql,Object...o)//定义一个通用的增删改的方法
	{
		Connection con=null;
		PreparedStatement psmt=null;
		boolean flag=false;
		try {
			con=BaseDao.getCon();//链接数据库
			psmt=con.prepareStatement(sql);//带参预编译
			for(int i=0;i<o.length;i++)
			{
				psmt.setObject(i+1, o[i]);//将传进来的可变参数数组进行set赋值
			}
			int num=psmt.executeUpdate();//num>0表示方法执行
			if(num>0)
			{
				flag=true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			BaseDao.closeCon(con, null, psmt);
		}
		return flag;
	}
	public List<Map<String,Object>> query(String sql,Object...o)//顶一个通用的查询方法
	{
		Connection con=null;
		PreparedStatement psmt=null;
		ResultSet rs=null;
		List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
		try {
			con=BaseDao.getCon();//链接数据库
			psmt=con.prepareStatement(sql);//传递带参sql
			for(int i=0;i<o.length;i++)
			{
				psmt.setObject(i+1, o[i]);//将传进来的可变参数数组通过循环set值
			}
			rs=psmt.executeQuery();//将查询结果放到结果集中
			ResultSetMetaData rsmd=rs.getMetaData();
			/*通过rs的getMetaData方法获取关于 结果集 对象中 列的类型和属性信息的对象然后存入ResultSetMetaData容器中
			 * DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 
			 * ResultSet 关于某个表的信息或一个查询的结果
			 * ResultSetMetaData 有关 ResultSet 中列的名称和类型的信息。 */
			int count=rsmd.getColumnCount(); //获取结果集中列的数目
			String cname[]=new String[count];//创建一个长度为结果集列数大小的数组
			for(int i=0;i<cname.length;i++)
			{
				cname[i]=rsmd.getColumnName(i+1);//获取结果集的列名并存入到数组中
			}
			while(rs.next())
			{
				Map<String,Object> map=new HashMap<String,Object>();//每有一个结果集行,就new一个map对象,将行内容put到map中
				for (int i=0;i<cname.length;i++)                   
				{
					map.put(cname[i],rs.getObject(i+1));//将列名作为键,传入的参数作为值存入到map集合中
				}
				list.add(map);//将所有的map都add到list集合中
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			BaseDao.closeCon(con, null, psmt);
		}
		return list;
	}
}

接口的实现类

package com.stu;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class StuDaoImpl extends BaseDao implements StuDao//接口的实现类
{
	public boolean addStu(Stu s) //添加的方法
	{
		String sql="insert into stu values(null,?,?,?,?,?)";
		return this.update(sql, s.getSname(),s.getSex(),s.getSage(),s.getSaddress(),s.getGrade());
	}
	public boolean deleteStu(Stu s) //删除信息的方法
	{
		String sql="delete from stu where sid=?";
		return this.update(sql, s.getSid());
	}
	public boolean updataStu(Stu s) //修改信息的方法
	{
		String sql="update stu set sname=?,ssex=?,sage=?,saddress=?,grade=? where sid=?";
		return this.update(sql,s.getSname(),s.getSex(),s.getSage(),s.getSaddress(),s.getGrade(), s.getSid());
	}
	public Map<String, Object> selectByIdStu(Stu s) //查一个
	{
		String sql="select * from stu where sid=?";
		return  this.query(sql,s.getSid()).get(0);
	}
	public List<Map<String, Object>> selectAllStu(Stu s) //查所有
	{
		String sql="select * from stu";
		return this.query(sql);
	}
	public List<Map<String,Object>> selecLike(String x)//自定义了一个模糊查询,可以根据表的所有字段检索
	{
		String sql="select * from stu where sid like ? or sname like ? or sage like ? or ssex like ? or saddress like ? or grade like ? ";
		return this.query(sql,"%"+x+"%","%"+x+"%","%"+x+"%","%"+x+"%","%"+x+"%","%"+x+"%");
		//由于sql语句的格式和java工具里的语句格式不同,"%"+x+"%"在mysql数据库中就相当于'%x%',字符串x随便传什么进来
	}
}

测试类

package com.stu;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class StuTest //测试类
{
	public static void main(String[] args) 
	{
		Scanner sc=new Scanner(System.in);
		Stu s=new Stu();
		StuDaoImpl s1=new StuDaoImpl();

//		s.setSid(1001);  查一个按学号
//		s1.selectByIdStu(s);
//		for(Map.Entry<String , Object> m:s1.selectByIdStu(s).entrySet())
//		{
//			System.out.println(m);
//		}
//		List<Map<String,Object>> list=s1.selectAllStu(s); //查所有
//		Iterator<Map<String,Object>> it=list.iterator();
//		while(it.hasNext())
//		{
//			System.out.println(it.next());
//		}
		List<Map<String,Object>> list=s1.selectAllStu(s);//使用迭代器先打印一遍所有信息  根据需求进行后续操作
		Iterator<Map<String,Object>> it=list.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
		System.out.println("请选择你要进行的操作:1、查询  2、修改  3、退出");//提示语句,提供三种功能
		int a=sc.nextInt();
		switch(a)
		{
			case 1:
				System.out.println("请输入要查询的名字/学号/性别/住址/院系");提示语句
				String x=sc.next();
				List<Map<String,Object>> list1=s1.selecLike(x);//调用模糊查询的方法
				Iterator<Map<String,Object>> it1=list1.iterator();
				while(it1.hasNext())//打印查询的相关内容
				{
					System.out.println(it1.next());
				}
			break;
			case 2:
				System.out.println("请选择操作:a.增加信息  b.删除信息 c.修改信息");//提示语句
				String b=sc.next();
				switch(b)
				{
				case "a"://添加信息
					System.out.println("请分别输入名字、性别、年龄、住址、院系按空格隔开");
					sc.nextLine();//在使用行接收的时候要注意之前的键盘接收方式,如果之前接收方式为next,
					//在这里使用nextline的时候默认会先接收上一种接收方式的结束方式,比如这里就会默认接收nextInt的回车空格结束,
					//然后在回车的时候自然而然的先接受了一整行的空内容。
					String aa=sc.nextLine();//接收用户输入的字符串
					String []xs=aa.split(" ");//将接收到的字符串按空格拆分成若干子字符串,然后放入数组中
					s.setSname(xs[0]);//数组的第一个元素为名字.然后调用set方法为sname赋值...所有属性依次类推
					s.setSex(xs[1]);
					s.setSage(xs[2]);
					s.setSaddress(xs[3]);
					s.setGrade(xs[4]);
					s1.addStu(s);//调用添加信息的方法
					System.out.println("添加成功");提示语句
//					System.out.println("请输入名字");//不会字符串拆分可以用此方法,功能与上述7行代码等效
//					s.setSname(sc.next());
//					System.out.println("请输入性别");
//					s.setSex(sc.next());
//					System.out.println("请输入年龄");
//					s.setSage(sc.next());
//					System.out.println("请输入住址");
//					s.setSaddress(sc.next());
//					System.out.println("请输入院系");
//					s.setGrade(sc.next());
//					s1.addStu(s);
//					System.out.println("添加成功");
				break;
				case "b"://删除信息
					System.out.println("请输入学号");//提示语句
					s.setSid(sc.nextInt());
					s1.deleteStu(s);//调用删除方法,根据学号进行删除
					System.out.println("删除成功");
				break;
				case "c"://修改信息的方法,等效于上述添加的方法,相当于是一种值覆盖的操作
					System.out.println("请输入要修改信息的学号");
					s.setSid(sc.nextInt());
					System.out.println("请分别输入要修改的名字、性别、年龄、住址、院系,按空格隔开");
					sc.nextLine();//用来接收switch(b)后遗留下的空行,不然下面的nextLine无法正常接收
					String []ss=sc.nextLine().split(" ");
					s.setSname(ss[0]);
					s.setSex(ss[1]);
					s.setSage(ss[2]);
					s.setSaddress(ss[3]);
					s.setGrade(ss[4]);
					s1.updataStu(s);
					System.out.println("修改成功");
				break;
					
				}
			break;
			case 3:
				System.exit(0);
			break;
		}
	}
}

(代码拙劣仅供参考)
注:以上代码均来自实际编写,如有问题请留言,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值