您的位置:首页 > 数据库

用程序创建数据库并导入宠物信息,并可以实现关键字查找

2018-03-21 21:47 567 查看
此习题来源于《java开发实战经典》第17章习题4
//表格创建类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class CreateTable {
//这个方法需要已经连接好的数据库连接conn,表格名称name,以及列的定义args[].
public  CreateTable(Connection conn,String name, String[] args) throws SQLException {
String sql0 = "drop table if exists " + name;//表格名前面有个空格不要老是忘记了
//id INT AUTO_INCREMENT这个还是不要放进去了,主程序中设置全部属性更加直观
String sql1 = "create table " + name + "(";
for (int i = 0; i < args.length; i++) {
sql1 = sql1 + args[i] + ",";
}
sql1 = sql1 + "PRIMARY KEY(id))";
PreparedStatement pstmt0=conn.prepareStatement(sql0);//实例化pstmt0;
pstmt0.executeUpdate();//执行sql0语句的删除表格处理
pstmt0.close();
PreparedStatement pstmt1=conn.prepareStatement(sql1);//实例化pstmt1;
pstmt1.executeUpdate();//执行sql1语句的创建表格处理
pstmt1.close();
}

}
//数据插入类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
public class InsertTable {
private PreparedStatement pstmt;
/*这个类用于插入数据内容。需要连接好的数据库连接conn,将要插入的表名称name,
* 列定义(包括列字段名称和类型,第一列默认为id,为格式统一需要在数组中)字符串数组args,以及列内容字符串数组args1.*/
public InsertTable(Connection conn, String name, String[] args, String[] args1) throws Exception {
// 先从列定义数组中提取列字段名称,以及字段类型
String[] nameargs = new String[args.length];// 列名称数组
String[] typeargs = new String[args.length];// 类型数组
for (int i = 0; i < args.length; i++) {
String[] s = args[i].split(" ");
nameargs[i] = s[0];
typeargs[i] = s[1];
}
String sql = "INSERT INTO ";
sql = sql + name +"("+ nameargs[1];// nameargs[0]为id默认的不需要设置
for (int i = 2; i < nameargs.length; i++) {// 从nameargs[2]开始循环
sql = sql + "," + nameargs[i];

}
sql = sql + ")values(?";// 为了?号的个数和上面一致先加一个?再从第三个开始循环,
for (int i = 2; i < nameargs.length; i++) {
sql = sql + ",?";
}
sql = sql + ")";
pstmt = conn.prepareStatement(sql);
for (int i = 1; i < nameargs.length; i++) {// 主程序中,第一个值是宠物名字,对应的是第二个名称类型及是typeargs[1]
setData(i, args1[i - 1], typeargs[i]);//将字符串数组的值分别设置进?中调用下面setData方法
System.out.println(i+"?"+i+"值:"+args1[i - 1]+",值的类型:"+typeargs[i]);
}
System.out.println(sql);
pstmt.executeUpdate();
}

/*下面是设置?内容的方法,
*  n为问号的个数,columnname为设置内容,type为列的类型字符串名称.这个是在列类型未知的情况下设置?的内容*/
public void setData(int n, String columnname, String type) throws Exception {
System.out.println("columnname:" + columnname + ",type:" + type);
if (type.length() > 6) {// 需要这个判断以保证下面s2.substring(0,6)不会出异常。
if (type.substring(0, 7).equalsIgnoreCase("varchar")) {//java一般是有头无尾,0.7截取的是0123456不包含7

4000
pstmt.setString(n, columnname);
System.out.println("pstmt.setString成功");
}
}
if (type.equalsIgnoreCase("int")) {
pstmt.setInt(n, Integer.parseInt(columnname));
System.out.println("pstmt.setInt成功");
}
if (type.equalsIgnoreCase("date")) {
java.util.Date temp = null;
temp = new SimpleDateFormat("yyyy-MM-dd").parse(columnname);
java.sql.Date sd = new java.sql.Date(temp.getTime());
pstmt.setDate(n, sd);
System.out.println("pstmt.setDate成功");
}
if (type.length() > 4) {// 需要这个判断以保证下面s2.substring(0,4)不会出异常。
if (type.substring(0, 5).equalsIgnoreCase("float")) {
pstmt.setFloat(n, Float.parseFloat(columnname));
System.out.println("pstmt.setFloat成功");
}
}
}

}

//模糊关键字查找类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class VagueSearch {
private ResultSet rs;
//需要参数数据库连接conn,关键字keyword,数据表名称nam,对于列名称,类型及其描述的字符串数组args
public VagueSearch(Connection conn,String keyword,String name,String[] args) throws Exception {
// 先从列定义数组中提取列字段名称,以及字段类型
String[] nameargs = new String[args.length];// 列名称数组
String[] typeargs = new String[args.length];// 类型数组
for (int i = 0; i < args.length; i++) {
String[] s = args[i].split(" ");
nameargs[i] = s[0];
typeargs[i] = s[1];
}
String sql="select id";//从这里开始拼接sql执行语句。
for(int i=1;i<nameargs.length;i++) {//i从1开始时因为第一项为id已经加进去了
sql=sql+","+nameargs[i];
}
sql=sql+" from "+name+" where";
for(int i=1;i<nameargs.length;i++) {
sql=sql+" "+nameargs[i]+" like ?";//拼接空格 列名 空格 like ? 空格 or
if(i<nameargs.length-1) {
sql=sql+" or";
}
}
System.out.println("模糊查询语句:"+sql);
PreparedStatement pstmt=conn.prepareStatement(sql);
for(int i=1;i<nameargs.length;i++) {
pstmt.setString(i,"%"+keyword+"%");
}
   rs=pstmt.executeQuery();
while(rs.next()) {
System.out.print("编号:"+rs.getInt(1)+",");//如果不需要把id显示成为编号,和下面一起输出就可以可以了。
for(int i = 1;i<nameargs.length;i++) {//第一个默认编号id已经输出,从第二个开始
getData(i+1,nameargs[i],typeargs[i]);
if(i<nameargs.length-1) {
System.out.print(",");
}else {
System.out.print("\n");
}
}
}
rs.close();
pstmt.close();
}
//下面为取得列内容的方法,n为问号的个数,columnname为设置内容,type为列的类型字符串名称.这个是在列类型未知的情况下设置?的内容
public void getData(int n, String columnname, String type) throws Exception {
//System.out.println("columnname:" + columnname + ",type:" + type);
if (type.length() > 6) {// 需要这个判断以保证下面s2.substring(0,6)不会出异常。
if (type.substring(0, 7).equalsIgnoreCase("varchar")) {//java一般是有头无尾,0.7截取的是0123456不包含7
System.out.print(columnname+":"+rs.getString(n));
}
}
if (type.equalsIgnoreCase("int")) {
System.out.print(columnname+":"+rs.getInt(n));
}
if (type.equalsIgnoreCase("date")) {
System.out.print(columnname+":"+rs.getDate(n));
}
if (type.length() > 4) {// 需要这个判断以保证下面s2.substring(0,4)不会出异常。
if (type.substring(0, 5).equalsIgnoreCase("float")) {
System.out.print(columnname+":"+rs.getFloat(n));
}
}
}

}

//主方法
import java.sql.Connection;
import java.sql.DriverManager;
public class AndrewK17_164 {
//定义MySQL的数据库驱动程序。在CMD中是="org.git.mm.masql.Driver".
public static final String DBDRIVER="com.mysql.jdbc.Driver";
//定义MySQL数据库的连接地址,此版本连接与前版本有所不同。在数据库名称andrew之后有一串判断字符。
public static final String DBURL="jdbc:mysql://localhost:3306/andrew?useUnicode=true&characterEncoding=utf-8&useSSL=false";
//MySQL数据库的连接密码                                             
public static final String DBPASS="3269";
public static final String DBUSER="root";
//主方法
public static void main(String[] args) throws Exception {
Class.forName(DBDRIVER);
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
String name="petshop";
//为避免程序过长,将新表的列名,类型及其描述以字符串数组的形式输入。
String[] column= {"id int AUTO_INCREMENT","宠物名 varchar(30) not null","colour varchar(50) not null","age int not null"};
new CreateTable(conn,name,column);//创建表格
String[] pet0= {"白猫","白色的","2"};
String[] pet1= {"黑猫","黑色的","3"};
String[] pet2= {"花猫","花色的","3"};
String[] pet3= {"拉布拉多","黄色","3"};
String[] pet4= {"金毛","金色的","1"};
String[] pet5= {"黄狗","黄色的","2"};
String[] pet6= {"狮子狗","白色的","2"};
String[] pet7= {"泰迪狗","棕色的","1"};
new InsertTable(conn,name,column,pet0);//引用方法将表格内容数据插入
new InsertTable(conn,name,column,pet1);
new InsertTable(conn,name,column,pet2);
new InsertTable(conn,name,column,pet3);
new InsertTable(conn,name,column,pet4);
new InsertTable(conn,name,column,pet5);
new InsertTable(conn,name,column,pet6);
new InsertTable(conn,name,column,pet7);
new VagueSearch(conn,"狗",name,column); //引用方法模糊查找有关键字“狗”的数据行
conn.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐