针对于表中的字段名与类的属性名不相同的情况:
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 PreparedStatementQueryTest2.2:通用查询多条数据{ 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; } }
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与数据库的类型对应



