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

此习题来源于《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
				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.cj.jdbc.Driver";
	// 定义MySQL数据库的连接地址,此版本连接与前版本有所不同。在数据库名称andrew之后有一串判断字符。
	public static final String DBURL = "jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=CTT";
	// MySQL数据库的连接密码                                             
	public static final String DBPASS = "z10113269";
	public static final String DBUSER = "root";

	// 主方法
	public static void main(String[] args) throws Exception {
		Class.forName(DBDRIVER);
		Connection conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		//conn在其他方法中都要用,所以定义在主方法中.
		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();
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值