为了书写简单我将所有的类都放到同一个包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;
}
}
}
(代码拙劣仅供参考)
注:以上代码均来自实际编写,如有问题请留言,转载请注明出处。