利用反射实现orm

需求:从数据库表中查询数据,并且以json的格式输出

由于类中的属性太多了,不想一个一个写了,所以使用反射直接set进去,这样比较方便,也比较实用,并且加深了对反射的理解。

并且使用了jackson 将List转换成了 json格式的字符串

代码如下

public class test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/book_shop?useSSL=false","root","111111");
System.out.println("连接数据库成功");
/**
* 先查询图书的种类
*/
Statement statement = null;
statement= connection.createStatement();
ResultSet resultSet = null;
resultSet = statement.executeQuery("SELECT * FROM TB_CATEGORY");
List<category> c = new ArrayList<>();
while (resultSet.next()){
category category = new category();
category.setCategoryId(resultSet.getInt(1));
category.setCategoryName(resultSet.getString(2));
c.add(category);
}
/**
* 利用反射,读取book里面的属性
*/
Class clazz = Class.forName(Book.class.getName());
Field[] fields = clazz.getDeclaredFields();
List<String> fs = new ArrayList<>();
for (Field f: fields) {
fs.add(String.valueOf(f));
// System.out.println(f);
}
/**
* 使用流,将 属性名前面的去掉,留下简化的属性名
*/
fs = fs.stream().map(x->x.replaceAll(x,x.split("\\.")[x.split("\\.").length-1])).collect(Collectors.toList());
// System.out.println(fs);
/**
* 查询图书
*/
String sql = "SELECT * FROM TB_BOOK";
Statement st = null;
st = connection.createStatement();
ResultSet rs = null;
rs = st.executeQuery(sql);
ResultSetMetaData rd = rs.getMetaData();
int count = rd.getColumnCount();
List<Book> books = new ArrayList<>();
while (rs.next()){
int i = 1;
Book book = new Book();
while (i<count){
//循环将数据库中的值set 到book类中
String stringValue = rs.getString(i);
String ColumnName = rd.getColumnName(i);
setValues(ColumnName,stringValue,book,fs);
//book中category代表数的种类,但是是用数字表示的,因此要转换成为name并且赋值
if(ColumnName.equals("category_id")){
for(category category: c){
if(category.getCategoryId()==Integer.valueOf(stringValue)){
book.setCategory_name(category.getCategoryName());
}
}
}
i++;
}
books.add(book);
// System.out.println();
}
// for(Book b:books){
// System.out.println(b);
// }
/**
* 利用jackson实现序列化
*/
//创建映射对象
ObjectMapper mapper = new ObjectMapper();
try {
String json = mapper.writeValueAsString(books);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
/**
* 利用反射,调用 set方法
* @param ColumnName
* @param stringValue
* @param book
* @param fs
* @throws ClassNotFoundException
*/
public static void setValues(String ColumnName,String stringValue, Book book,List<String> fs) throws ClassNotFoundException {
Class clazz = book.getClass();
Field[] fields = clazz.getDeclaredFields();
Field f = null;
//我们这里要获得与之对应的属性,因为要调用set,必须得传参数进去,因此我们需要得到属性的类型
for(Field field:fields ){
if(ColumnName.equals(field.toString().split("\\.")[field.toString().split("\\.").length-1])){
f = field;
break;
}
}
//准备拼接set方法,将属性名称前面改为大写
String fileName = initStr(ColumnName);
try {
//拼接方法
Method setBookValue = clazz.getDeclaredMethod("set"+fileName,f.getType());
// System.out.println(f.getType());
//book属性中有integer类型,因此需要判断并且转换类型
if(f.getType().toString().equals("class java.lang.Integer")){
setBookValue.invoke(book,Integer.valueOf(stringValue));
}
//同理,有int类型
else if(f.getType().toString().equals("int")){
setBookValue.invoke(book,Integer.valueOf(stringValue));
}
else{
setBookValue.invoke(book,stringValue);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 将首个字母大小写
* @param old
* @return
*/
public static String initStr(String old){
String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
return str ;
}
}

Book类

public class Book {
Integer book_id;
Integer category_id;//类别
String category_name;//类别名称
String book_name;
String author;
String publisher;
int price;
int sale_price;
int amount;
public Integer getBook_id() {
return book_id;
}
public void setBook_id(Integer book_id) {
this.book_id = book_id;
}
public Integer getCategory_id() {
return category_id;
}
public void setCategory_id(Integer category_id) {
this.category_id = category_id;
}
public String getCategory_name() {
return category_name;
}
public void setCategory_name(String category_name) {
this.category_name = category_name;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public int getSale_price() {
return sale_price;
}
public void setSale_price(int sale_price) {
this.sale_price = sale_price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
@Override
public String toString() {
return "Book{" +
"book_id=" + book_id +
", category_id=" + category_id +
", category_name='" + category_name + '\'' +
", book_name='" + book_name + '\'' +
", author='" + author + '\'' +
", publisher='" + publisher + '\'' +
", price=" + price +
", sale_price=" + sale_price +
", amount=" + amount +
'}';
}
}

categorie 类

public class category {
Integer categoryId;//类别
String categoryName;//类别名称
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
@Override
public String toString() {
return "category{" +
"categoryId=" + categoryId +
", categoryName='" + categoryName + '\'' +
'}';
}
}

__EOF__

本文作者Reisen7
本文链接https://www.cnblogs.com/reisen7/p/18547109.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Reisen7  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示