数据库通用查询方法封装:
public static List<Object> executeQueryList(String sql, String className,Object... params){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
List<Object> list=new ArrayList<>();
String url="jdbc:mysql://localhost:3306/shopdb?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn= DriverManager.getConnection(url,"root","wanmait");
ps=conn.prepareStatement(sql);
for(int i=0;i<params.length;i++){
ps.setObject(i+1,params[i]);
}
rs=ps.executeQuery();
//使用resultSetMetaDate获取ResultSet里面每条数据的字段名(数据库表里面的)
ResultSetMetaData rsmd=rs.getMetaData();
//查询结果一共有多少列,数据库表里面有多少个字段(属性)
int count=rsmd.getColumnCount();
String[] cols=new String[count];
for(int i=0;i<cols.length;i++){
cols[i]=rsmd.getColumnName(i+1);
}
Class clazz=Class.forName(className);
while(rs.next()){
Object obj=clazz.newInstance();
Field[] fields=clazz.getDeclaredFields();
for(Field f:fields){
for(int i=0;i<cols.length;i++){
if(f.getName().equalsIgnoreCase(cols[i])){
f.setAccessible(true);
f.set(obj,rs.getObject(cols[i]));
}
}
}
list.add(obj);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}使用:
public List<Product> findAll(){
String sql="select * from product";
List<Object> productList=DBHelper.executeQueryList(sql,"com.example.demo.Product");
return (List<Product>)(List)productList;
}此方法需要数据库字段和vo类属性一一对应,如果不对应可以使用下面的方法:
public static List<Map<String,Object>> executeQueryList(String sql, Object... params){
List<Map<String,Object>> list=new ArrayList<>();
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
String url="jdbc:mysql://localhost:3306/shop?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn= DriverManager.getConnection(url,"root","wanmait");
ps=conn.prepareStatement(sql);
for(int i=0;i<params.length;i++){
ps.setObject(i+1,params[i]);
}
rs=ps.executeQuery();
//使用resultSetMetaDate获取ResultSet里面每条数据的字段名(数据库表里面的)
ResultSetMetaData rsmd=rs.getMetaData();
//查询结果一共有多少列,数据库表里面有多少个字段(属性)
int count=rsmd.getColumnCount();
while(rs.next()){
Map<String,Object> map=new HashMap<>();
for(int i=0;i<count;i++){
String columnName=rsmd.getColumnName(i+1);
String columuType=rsmd.getColumnTypeName(i+1);
if(columuType.equalsIgnoreCase("datetime")){
map.put(columnName,new Date(rs.getTimestamp(columnName).getTime()));
}
else if(columuType.equalsIgnoreCase("decimal")){
map.put(columnName,rs.getDouble(columnName));
}
else{
map.put(columnName,rs.getObject(columnName));
}
}
list.add(map);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}使用:
public List<Product> findAll(){
List<Product> productList=new ArrayList<>();
String sql="select * from product";
List<Map<String,Object>> list=DBHelper.executeQueryList(sql);
for(Map<String,Object> m:list){
Product p=new Product();
p.setId((Integer) m.get("id"));
p.setTitle((String)m.get("title"));
p.setPrice((Double)m.get("price"));
p.setInputTime((Date)m.get("input_time"));
productList.add(p);
}
return productList;
}

0条评论
点击登录参与评论