栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDBC第三天

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDBC第三天

一:针对于Order表的查询及总结新知识:

 针对于表中的字段名与类的属性名不相同的情况:
     1.必须声明sql时,使用类的属性名来明明字段的别名
     2.使用ResultSetmetaData时:需要用getColumnLable()来替换getColumnName()
         获取列的别名;
         说明:如果sql中没有给字段名取别名,则获得的就是列名

package Test;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetmetaData;
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;

import JDBCutil.JDBCconn;

public class OrderTableQuery {
	
	public OrdertableObject query(String sql,Object...args)  {
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
			Properties p1 = new Properties();
			p1.load(is);
			String url = p1.getProperty("url");
			String user = p1.getProperty("user");
			String psw = p1.getProperty("password");
			String Driver = p1.getProperty("driverClass");
			// 2.注册驱动
			Class.forName(Driver);
			//3.获取链接
			conn = DriverManager.getConnection(url, user, psw);
			ps=conn.prepareStatement(sql);
			for(int i = 0 ;i

对应将数据库中的信息传入类中,此类如下:

package Test;

import java.sql.Date;

public class OrdertableObject {
private int id;
private String name;
private Date date;
public OrdertableObject() {
	super();
}
public OrdertableObject(int id, String name, Date date) {
	super();
	this.id = id;
	this.name = name;
	this.date = date;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public Date getDate() {
	return date;
}
public void setDate(Date date) {
	this.date = date;
}
@Override
public String toString() {
	return "OrdertableObject [id=" + id + ", name=" + name + ", date=" + date + "]";
}


}

总结: 对于数据库中,数据库的一个表对应java的一个类,而数据库的一条记录对应java 的一个属性,没有规定字段名要与属性名一致,使用ResultSetmetaData时:需要用getColumnLable()来替换getColumnName()获取列的别名;说明:如果sql中没有给字段名取别名,则获得的就是列名。

二:针对通用查询多表已经查多条数据:
2.1:查询一条记录但通用任何表
package Test;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetmetaData;
import java.sql.SQLException;
import java.util.List;

import javax.management.Query;

import org.junit.Test;


import JDBCutil.JDBCconn;

public class PreparedStatementQueryTest {
   
     public static void main(String[] args) {
    	String sql = "select id,name,email,birth from customers where id=?";
     	QueryBean query = query(QueryBean.class,sql,1);
     	System.out.println(query);
    	 String sql1 = "select order_id AS id,order_name AS name,order_date AS date from `order` where order_id=?";
    	 OrdertableObject query1 = query(OrdertableObject.class,sql1,1);
      	System.out.println(query1);
	}
	// 通用表 由于不知道要返回哪种对象 所以用泛型参数来代替
    //Class clazz 通过反射 传入一个指定类型 的一个运行时类的实例
	public static  T query(Class clazz, String sql, Object... args) {
		//1.获取4个基本信息已经获取链接, 由于写多了,所以将其封装到一个类方法中
		Connection conn = null;

		PreparedStatement ps = null;

		ResultSet rc = null;

		// 1.获取链接
		try {
			conn = JDBCconn.getConn();
			// 2.获取预编译准备
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			//执行并返回结果集
			rc = ps.executeQuery();
			//通过结果集的元数据,获取列数
			ResultSetmetaData data = rc.getmetaData();
			//获取数据库的总共的字段名字的个数
			int count = data.getColumnCount();
			if (rc.next()) {
				//通过运行时类的实例用newInstance()创建类型的对象
				T t = clazz.newInstance();
				for (int i = 0; i < count; i++) {
					//获取对应 比如id,name等在数据库的值
					Object columnVluea = rc.getObject(i + 1);
					//获取数据库中的字段起了别名的名字
					String columnLabel = data.getColumnLabel(i + 1);
                    //通过反射将结果集中的数据赋值给对应的属性
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnVluea);
				}
				return t;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCconn.closeResource(conn, ps, rc);
		}

		return null;
	}
}

 2.2:通用查询多条数据
package CommonTable;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetmetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import Test.QueryBean;
import org.junit.Test;

import JDBCutil.JDBCconn;

public class QueryTest {
	//由于返回多条,用的是一个集合来存进去数据
	// 通用表 由于不知道要返回哪种对象 所以用泛型参数来代替
    //Class clazz 通过反射 传入一个指定类型 的一个运行时类的实例
	public  List query(Class clazz, String sql, Object... args) {
		// 1.获取4个基本信息并获取链接
		Connection conn = null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		try {
			conn = JDBCconn.getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			//执行并返回结果集
			rs = ps.executeQuery();
			//通过结果集的元数据,获取列数
			 ResultSetmetaData data = rs.getmetaData();
			//获取数据库的总共的字段名字的个数
			int count = data.getColumnCount();	
			//创建存放数据的对应类型的集合
			Listlist = new ArrayList<>();
			//由于是多条 故不用if 而用while
			while (rs.next()) {
				//通过运行时类的实例创建的对象
				E e = clazz.newInstance();
				for (int i = 0; i < count; i++) {
					//获取对应 比如id,name等在数据库的值
					Object columnValue = rs.getObject(i + 1);
					//获取数据库中的字段起了别名的名字
					String columnName = data.getColumnLabel(i + 1);
					//通过反射将结果集中的数据赋值给对应的属性
					Field field = clazz.getDeclaredField(columnName);
					field.setAccessible(true);
					field.set(e, columnValue);
				}
				//当for结束时 将一个对象塞进去集合
				 list.add(e);
			}
			//当循环结束时,返回整个集合
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCconn.closeResource(conn, ps, rs);
		}
		return null;
	}
	@Test
	public void test() {
		String sql ="select id,name,email,birth from customers where id between ? and ?";
		List query = query(QueryBean.class, sql, 2,5);
//		Iterator i = query.iterator();
//		while(i.hasNext()) {
//			QueryBean next = i.next();
//			System.out.println(next);
//		}
		query.forEach(System.out::println);
	}
}
对于查询的总结:

面向接口编程,通过实现接口来和数据库打交道。

查询过程流程图 

 

 java与数据库的类型对应

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292797.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号