这只是一次老师的作业.
老师作业的大体要求如下:
(1)数据库分层设计实验。
① 用root登录MySQL,在MySQL中创建数据库,注意使用中文字符集,然后创建用户,授予该用户对你创建的数据库的所有的操作权限,用你创建的用户登录数据库,在数据库中建立顾客表,字段设置如下:顾客ID——整型,自增长,主键;顾客身份证号——变长字符串,长度20,非空;顾客姓名—变长字符串,长度20,非空;电话——变长字符串,长度20,可空;出生日期——日期型,可空。
②建立针对顾客表相应的JavaBean。(注意:顾客ID属性的数据类型是整型,在JavaBean中要用Integer类型;出生日期是日期型,在JavaBean中要用java.util.Date类型)
③按指定接口的要求,实现立顾客表的DAO实现类,要包含增、删、改、查几项基本功能。
接口如下:
public interface ICustomerDAO {
public void addCustomer(Customer c) throws Exception;//增
public Customer getCustomerById(int id) throws Exception;//查一个
public void deleteCustomer(Customer c) throws Exception;//删
public void updateCustomer(Customer c, String newIdCard, String newName, String newPhone, String newBirthday) throws Exception;//改
public List<Customer> allCustomers() throws Exception;//查所有
}
④写一个测试类,测试DAO中的每一项功能。
在实现过程中我做了一些小的改动.整个做下来不太难 , 希望会有人能借鉴一下哈哈哈哈.
耗时一天 , 给我留下特别印象的是一个bug. java.sql.Date 和 java.util.Date 的转换.这个在代码注释里有体现.
首先是实现题目接口 , 代码如下:
import java_bean.*;
import java.util.*;
public interface ICustomerDAO {
public void addCustomer(customer_bean c) throws Exception;//增
public void getCustomerById(customer_bean c) throws Exception;//查一个
public void deleteCustomer(customer_bean c) throws Exception;//删
public void updateCustomer(customer_bean c) throws Exception;//改
public void allCustomers() throws Exception;//查所有
}
接着,写一个Javabean,代码如下:
package java_bean;
import java.util.Date;
public class customer_bean
{
//customer_table中的属性: number name telephone birthday
String number;
String name;
String telephone;
Date birthday;
int ID;
//get()
public String getNumber()
{
return number;
}
public String getName()
{
return name;
}
public String getTelephone()
{
return telephone;
}
public Date getBirthday()
{
return birthday;
}
public int getID()
{
return ID;
}
public void setID(int id)
{
this.ID = id;
}
public void setNumber(String number)
{
this.number = number;
}
public void setName(String name)
{
this.name = name;
}
public void setTelephone(String telephone)
{
this.telephone = telephone;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
}
最后实现DAO.Java , 代码如下:
import java_bean.*;
import java.util.Scanner;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
public class DAO implements ICustomerDAO
{
public void addCustomer(customer_bean c) throws Exception
{
customer_bean customer = c;
Scanner sc = new Scanner(System.in);
String s;//暂存用户输入的信息
System.out.println("您正在执行的操作是:增加客户信息");
System.out.println("输入客户的姓名:");
s = sc.nextLine();
customer.setName(s);
System.out.println("输入客户的身份证号:");
s = sc.nextLine();
customer.setNumber(s);
System.out.println("输入客户的电话号码:");
s = sc.nextLine();
customer.setTelephone(s);
System.out.println("输入客户的出生日期: 格式(yyyy-MM-dd)");
s = sc.nextLine();
SimpleDateFormat format;
Date date = new Date();
try
{
format = new SimpleDateFormat("yyyy-MM-dd");
date = format.parse(s); //format解析字符串后返回的是java.util.date 不是java.sql.date
}
catch(ParseException e)
{
System.out.println("日期输入格式不正确.");
}
customer.setBirthday(date);
//将数据插入数据库
try
{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
String url = "jdbc:sqlserver://localhost:1433;DatebaseName=experiment_second";
Connection con = DriverManager.getConnection(url , "sa" , "123");
String sql_insert = "use experiment_second ; insert into customer_table(number , name , telephone , birthday ) values(? , ? , ? ,? ) ;";
PreparedStatement ps = con.prepareStatement( sql_insert , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString( 1 , customer.getNumber());
ps.setString( 2 , customer.getName());
ps.setString( 3 , customer.getTelephone());
/*
这个包中统一用的是java.util.Date类.
java.text.SimpleDateFormat 的 parse()方法解析日期后返回一个java.util.Date类型的Date
而PreparedStatement 的 setDate()方法参数为 java.sql.Date
所以这里在设置参数时将java.util.Date类型转换为java.sql.Date类型
*/
java.sql.Date dt = new java.sql.Date(customer.getBirthday().getYear() , customer.getBirthday().getMonth() , customer.getBirthday().getDay());
ps.setDate( 4 , dt );
ps.executeUpdate();
System.out.println("增加客户信息操作成功!");
ps.close();
}
catch(Exception e)
{
System.out.println("程序出现了错误,用户创建失败!");
}
}//addCustomer
public void getCustomerById(customer_bean c) throws Exception
{
//查一个
customer_bean customer = c;
System.out.println("您正在执行的操作是: 按用户 ID 查找 ");
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户ID进行查找:");
int id = Integer.parseInt(sc.nextLine() );
customer.setID(id);
try
{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
String url = "jdbc:sqlserver://localhost:1433;DatebaseName=experiment_second";
Connection con = DriverManager.getConnection(url , "sa" , "123");
String sql_select_id = "use experiment_second select * from customer_table where ID = ? ;";
PreparedStatement ps = con.prepareStatement( sql_select_id , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setInt( 1 , customer.getID());
ResultSet rs = ps.executeQuery();
if(rs.next())
{
System.out.println("查询到匹配用户:");
System.out.println("用户姓名:" + rs.getString("name"));
System.out.println("用户身份证号:" + rs.getString("number"));
System.out.println("用户电话:" + rs.getString("telephone"));
System.out.println("用户生日:" + rs.getDate("birthday"));
}
else
{
System.out.println("没有查询到用户信息 , 请检查输入的用户ID是否存在.");
}
ps.close();
}
catch(Exception e)
{
System.out.println("执行查询操作失败,失败原因:" + e.getMessage());
}
}
public void deleteCustomer(customer_bean c)
{
System.out.println("您正在执行的操作是:删除用户信息");
Scanner sc = new Scanner(System.in);
String number;
customer_bean customer = c;
System.out.println("请输入您要删除的用户身份证号:");
number = sc.nextLine();
customer.setNumber(number);
try
{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
String url = "jdbc:sqlserver://localhost:1433;DatebaseName=experiment_second";
Connection con = DriverManager.getConnection(url , "sa" , "123");
String sql_delete_number = "use experiment_second ; select * from customer_table where number = ? ;";
PreparedStatement ps = con.prepareStatement( sql_delete_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString( 1 , customer.getNumber());
ResultSet rs = ps.executeQuery();
if(rs.next())
{
System.out.println("即将要删除的用户: " +"姓名:" + (rs.getString("name") ) + " 电话:" + (rs.getString("telephone") ) + " 出生日期:" + (rs.getDate("birthday")) );
System.out.println("确定要将该用户删除吗? ------ Y/N");
String del = sc.nextLine();
switch(del)
{
case "Y":
{
sql_delete_number = "use experiment_second ; delete from customer_table where ID = ? ;";
ps = con.prepareStatement( sql_delete_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY);
ps.setString(1 , customer.getNumber());
ps.executeUpdate();
ps.close();
break;
}
case "N":
{
System.out.println("您已放弃删除该用户");
break;
}
default:
{
System.out.println("输入不合法");
}
}
}
else
{
System.out.println("未查询到您要删除的用户,请核对您输入的身份证号");
}
}
catch(Exception e)
{
System.out.println("执行删除操作失败,失败原因:" + e.getMessage());
}
}//删
public void updateCustomer(customer_bean c) throws Exception
{
//暂时不写
System.out.println("请输入您要更改的用户身份证号:");
Scanner sc = new Scanner(System.in);
String number;
number = sc.nextLine();
try
{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
String url = "jdbc:sqlserver://localhost:1433;DatebaseName=experiment_second";
Connection con = DriverManager.getConnection(url , "sa" , "123");
String sql_update_number = "use experiment_second ; select * from customer_table where number = ? ;";
PreparedStatement ps = con.prepareStatement( sql_update_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString(1 , number); //先注入值 , 在执行executeQuery()
ResultSet rs = ps.executeQuery();
if(rs.next())
{
int i;
System.out.println("请输入您要更改的字段信息------1:身份证号------2:姓名------3:电话号码------ ");
i = Integer.parseInt(sc.nextLine());
switch(i)
{
case 1:
{
System.out.println("请输入新的身份证号:");
String n = sc.nextLine();
sql_update_number = "use experiment_second ; update customer_table set number = ? where number = ? ; ";
ps = con.prepareStatement( sql_update_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString(1 , n);
ps.setString(2 , number);
ps.executeUpdate();
System.out.println("身份证号已更新");
}
case 2:
{
System.out.println("请输入新的姓名:");
String n = sc.nextLine();
sql_update_number = "use experiment_second ; update customer_table set name = ? where number = ? ; ";
ps = con.prepareStatement( sql_update_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString(1 , n);
ps.setString(2 , number);
ps.executeUpdate();
System.out.println("姓名已更新");
break;
}
case 3:
{
System.out.println("请输入新的电话号码:");
String n = sc.nextLine();
sql_update_number = "use experiment_second ; update customer_table set telephone = ? where number = ? ; ";
ps = con.prepareStatement( sql_update_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ps.setString(1 , n);
ps.setString(2 , number);
ps.executeUpdate();
System.out.println("电话号码已更新");
break;
}
default:
{
System.out.println("输入错误");
}
}//switch
}//if
else
{
System.out.println("您要更改的用户不存在,请检查输入的身份证号是否正确");
}
ps.close();
}//try
catch(Exception e)
{
System.out.println("执行修改操作失败 , 失败原因:" + e.getMessage());
}
}
public void allCustomers() throws Exception
{
System.out.println("正在执行--查看全部信息--的功能");
System.out.println("全部信息如下:");
try
{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
String url = "jdbc:sqlserver://localhost:1433;DatebaseName=experiment_second";
Connection con = DriverManager.getConnection(url , "sa" , "123");
String sql_update_number = "use experiment_second ; select * from customer_table ;";
PreparedStatement ps = con.prepareStatement( sql_update_number , ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ResultSet rs = ps.executeQuery();
while(rs.next())
{
System.out.println("身份证号:" + (rs.getString("number")) + " 姓名:" + (rs.getString("name")) + " 电话:" + (rs.getString("telephone")) + "出生日期:" + (rs.getDate("birthday").toString()));
}
ps.close();
}
catch(Exception e)
{
System.out.println("执行查看全部信息操作失败 , 失败原因:" + e.getMessage());
}
}
public static void main(String [] args)
{
try
{
customer_bean c = new customer_bean();
DAO dao = new DAO();
//dao.addCustomer(c);
//dao.allCustomers();
//dao.updateCustomer(c);
//dao.deleteCustomer(c);
boolean exit = true;
do
{
System.out.println("-------------菜单------------");
System.out.println("---------1:添加用户----------");
System.out.println("---------2:按ID查找用户------");
System.out.println("---------3:删除用户----------");
System.out.println("---------4:更改用户信息------");
System.out.println("---------5:查询所有信息------");
System.out.println("---------6:退出菜单----------");
System.out.println("------------请输入-----------");
Scanner sc = new Scanner(System.in);
int i = Integer.parseInt(sc.nextLine());
switch(i)
{
case 1:
{
dao.addCustomer(c);
break;
}
case 2:
{
dao.getCustomerById(c);
break;
}
case 3:
{
dao.deleteCustomer(c);
break;
}
case 4:
{
dao.updateCustomer(c);
break;
}
case 5:
{
dao.allCustomers();
break;
}
case 6:
{
exit = false;
break;
}
default:
{
System.out.println("输入数据不正确");
}
}
}
while(exit);
}
catch(Exception e)
{
System.out.println("主函数执行出现错误 , 错误原因:" + e.getMessage());
}
}
}
最后,给出数据库建立用户表的sql语句:
//创建一个数据库
use master
create database experiment_second
on
(
name = experiment_second_data,
filename ='F:\HelloWorld\JavaEE\Code\shangJiShiYan\experiment_second_data.mdf',
size = 6MB,
maxsize = 10,
filegrowth = 10%
)
log on
(
name = experiment_second_log,
filename ='F:\HelloWorld\JavaEE\Code\shangJiShiYan\experiment_second_log.ldf',
size = 6,
maxsize = 17,
filegrowth = 1MB
)
go
--建表
/*
用root登录MySQL,在MySQL中创建数据库,注意使用中文字符集,然后创建用户,授予该用户对你创建的数据库的所有的操作权限,用你创建的用户登录数据库,
在数据库中建立顾客表,字段设置如下:顾客ID——整型,自增长,主键;顾客身份证号——变长字符串,长度20,非空;顾客姓名—变长字符串,长度20,非空;电话——变长字符串,
长度20,可空;出生日期——日期型,可空。
*/
use experiment_second
create table customer_table
(
ID int identity(1,1) primary key,
number varchar(20) not null ,
name varchar(20) not null ,
telephone varchar(20) null,
birthday datetime default getdate() null
)
go
--插入一个实例数据
-- number '20162025051' name '李浩' telephone '18846791357' birthday '2016-03-20'
use experiment_second
insert into customer_table( number , name ,telephone , birthday)
values('20162025051' , '李浩' , '18846791357' , '2016-03-20');
我发现一个很有意思的事情,如果代码有错在csdn里插入代码片段会出现敲不了回车而无法操作的情况 , 这是真的吗?各位朋友有了解的吗?
最后一点简单的说明:
1:将数据库的数据文件(experiment_second_data)附加到数据库
如果因为sql server版本问题导致附加数据库失败,则需要重新创建数据库
找到data.sql文件,在数据库管理工具中执行文件中的语句. 则创建数据库成功.
需要保证该数据库的登录名是sa 密码 123
2:执行DAO.class文件.
如果由于jdk版本问题导致编译的class文件报错,则需要在具体环境下重新编译所有java文件.
执行过程如下:
1:编译ICustomerDAO.java文件
2:编译customer_bean.java文件
3:编译DAO.java文件
4:执行主类文件------java DAO
结束了!