[英]How to map resultset into composite object in mapper class
I have query which will return 8 columns for order placement POC, First 4 will be same for few rows(person details) and remaining 4 alone will differ(order details).我有查询将返回 8 列用于订单放置 POC,前 4 行对于几行(人员详细信息)是相同的,剩下的 4 行会有所不同(订单详细信息)。 Its a non normalized table.
它是一个非标准化表。
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8
-----------------------------------------------------
a aaa bbb ccc ddd eee fff ggg
a aaa bbb ccc hhh iii jjj kkk
My object looks like我的对象看起来像
class OrderBook{
int id;
int name;
String age;
String mailId;
List<Order> orderList;
}
class Order{
String productName;
int price;
int quantity;
String address;
}
how can i loop through the result set and map the rows into the Orderbook object.我如何遍历结果集并将行映射到 Orderbook 对象中。 Response should look something like below
响应应如下所示
{
"id": 1,
"name": "dude",
"age" : 22,
"mailId": "dude@abc.com",
"orderList": [
{
"productName": "Milk",
"price":23,
"quantity":2,
"address": "dude, 1st street"
},
{
"productName": "Egg",
"price":5,
"quantity":10,
"address": "dude, 1st street"
}
]
}
I dont know how to loop it here我不知道如何在这里循环
while(rs.next()){
???
}
If you are using ResultSet directly you have to implement transformers directly from RS to Object instance.如果您直接使用 ResultSet,则必须直接实现从 RS 到 Object 实例的转换器。 And use it from your DAO layer Something like:
并从您的DAO层使用它,例如:
@Override
public User getByID(int id) {
OrderBook book = new OrderBook();
try {
PreparedStatement select = OrderBookTransformer.getInstance().getSelectStatementById(id);
ResultSet rs = select.executeQuery();
while (rs.next()) {
book = OrderBookTransformer.getInstance().fromRsToObject(rs);
}
} catch (SQLException e) {
log.error(e);
}
return book;
}
Where OrderBookTransformer
could be like: OrderBookTransformer
可能是这样的:
@Override
public OrderBook fromRsToObject(ResultSet rs) {
OrderBook book = new OrderBook();
try {
user.setId(rs.getInt("id"));
user.setName(rs.getInt("name"));
user.setAge(rs.getString("age"));
// set other fields
} catch (SQLException e) {
log.error(e);
}
return user;
}
For the initialisation transformer I used the Singleton pattern:对于初始化转换器,我使用了单例模式:
public class OrderBookTransformer implements BaseTranformer<OrderBook> {
private static final Logger log = Logger.getLogger(OrderBookTransformer.class);
private static OrderBookTransformer instance = null;
protected OrderBookTransformer() {
}
public static OrderBookTransformer getInstance() {
if (instance == null) {
instance = new OrderBookTransformer();
}
return instance;
}
And select statement something like:并选择语句类似于:
@Override
public PreparedStatement getSelectStatementById(int id) {
PreparedStatement select = null;
try (Connection connection = ConnectionManager.getConnection()) {
select = connection
.prepareStatement("SELECT FROM order_books WHERE id = ?");
select.setInt(1, id);
} catch (SQLException e) {
log.error(e);
}
return select;
}
My suggestion will be to use Spring Data instead of processing the Result Set directly.我的建议是使用Spring Data而不是直接处理结果集。
You will need to do just a few more steps:您只需再执行几个步骤:
spring data
dependency to your build toolspring data
依赖项添加到您的构建工具 @Entity
class OrderBook {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer name;
private String age;
private String mailId;
@ElementCollection(targetClass = Order.class, fetch = FetchType.EAGER)
@CollectionTable(name = "orders", joinColumns = @JoinColumn(name = "book_id"))
private List<Order> orderList;
// no args constructor + getters/setters
}
@Entity
class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String productName;
private Integer price; // consider use Double here
private Integer quantity;
private String address;
}
public OrderBookRepository implements JpaRepository<OrderBook, Integer> {}
公共 OrderBookRepository 实现 JpaRepository<OrderBook, Integer> {}
and use it for retrieving data from DB.并将其用于从数据库检索数据。
You should convert resultset to DataObject (OrderBook) firstly.您应该首先将结果集转换为 DataObject (OrderBook)。
List<OrderBook> list = new ArrayList<>();
while(rs.next()){
OrderBook orderBook = mapToOrderBook(rs);
list.add(orderBook);
}
Few basic functions which you should write.您应该编写的几个基本函数。
private List<OrderBook> getOrderBooks();
private OrderBook mapToOrderBook(ResultSet rs);
If you don't know how to get data from resultset:如果您不知道如何从结果集中获取数据:
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html
Then you can use jackson to convert List to json data.然后就可以使用jackson 将List 转换为json 数据。 Spring mvc already handled it for you.
Spring mvc 已经为你处理好了。
@RequestMapping("/orderbooks")
public List<OrderBook> getOrderBooks() {
return orderbookService.getOrderBooks();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.