本篇文章给大家谈谈将SQL表转换为javabean类,以及sql转dsljava的知识点,同时本文还将给你拓展android-如何使用RxJava将双精度值的嵌套列表转换为Java类?、Excel数据
本篇文章给大家谈谈将SQL表转换为java bean类,以及sql转dsl java的知识点,同时本文还将给你拓展android-如何使用RxJava将双精度值的嵌套列表转换为Java类?、Excel数据转换为JavaBean对象、HashMap对象转换为JavaBean对象、java - 如何使用嵌套集模型将平面列表转换为Java中的嵌套树?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 将SQL表转换为java bean类(sql转dsl java)
- android-如何使用RxJava将双精度值的嵌套列表转换为Java类?
- Excel数据转换为JavaBean对象
- HashMap对象转换为JavaBean对象
- java - 如何使用嵌套集模型将平面列表转换为Java中的嵌套树?
将SQL表转换为java bean类(sql转dsl java)
关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。
想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。
2年前关闭。
改善这个问题
我正在使用大量SQL表在Web应用程序中工作。我需要为每个表创建一个Java bean类。我正在寻找一种可以将SQL表转换为Java
Bean类的工具。这将有助于节省时间。
这是一个例子:
studentTable(studentId,名字,姓氏,年份)
-->
public class Student {
@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO)
private int studentId;
@Column
private String firstname;
@Column
private String lastname;
@Column
private int yearLevel;
public Student(){}
public Student(int studentId,String firstname,String lastname,int yearLevel) {
super();
this.studentId = studentId;
this.firstname = firstname;
this.lastname = lastname;
this.yearLevel = yearLevel;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public int getYearLevel() {
return yearLevel;
}
public void setYearLevel(int yearLevel) {
this.yearLevel = yearLevel;
}
}
您对这种工具有任何想法吗?
android-如何使用RxJava将双精度值的嵌套列表转换为Java类?
在我的Android客户端中,我从后端收到此JSON数据:
[
[
1427378400000,
553
],
[
1427382000000,
553
]
]
这是实际加载数据的例程.我在这里使用RxAndroid和Retrofit.
private void getProductLevels() {
Observable<List<List<Double>>> responSEObservable =
mProductService.readProductLevels();
AppObservable.bindFragment(this, responSEObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// Todo: Transform List<List<Double>> into List<ProductLevel>
.subscribe(new Subscriber<List<List<Double>>>() {
@Override
public void onCompleted() {}
@Override
public void one rror(Throwable e) {}
@Override
public void onNext(List<List<Double>> response) {}
});
}
如何映射内部List< Double>使用RxJava运算符转换到特定的java类(例如ProductLevel)?
public class ProductLevel {
public Double mTimeStamp;
public Double mLevel;
public ProductLevel(Double timeStamp, Double level) {
mTimeStamp = timeStamp;
mLevel = level;
}
}
最后,我想收到以下信息:List< ProductLevel>.
解决方法:
根据您的数据,您会收到一个配对列表(时间戳,级别).该对由仅包含2个值的列表表示.
因此,您要发出每对,并将每对转换为ProductLevel.
为此,您必须flatMap配对列表以发出每个配对.然后将每对映射到ProductLevel.最后,只需构建一个包含所有发射项目的列表.
(java8样式)
AppObservable.bindFragment(this, responSEObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMapIterable(listofList -> listofList) // or flatMap(l -> Observable.from(l))
.map(pair -> new ProductLevel(pair.get(0),pair.get(1))) // build ProductLevel for each pair
.toList() // build a list with all ProductLevel
.subscribe(listofProductLevel -> /** ... **/);
Excel数据转换为JavaBean对象
package com.eigpay.framework.util.ExcelUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* <p>Title: ExcelUtil</p>
* <p>Description: Excel数据转换为JavaBean对象</p>
* 支持:Excel Date、Integer、Double、Float、Boolean类型
* 支持:Excel2003-2007,再高版本未做测试
* <p>Email: yuyue_qty@163.com</p>
* @author 晴天雨
* @date 2016年3月26日下午5:31:54
* @version 1.0
*/
public class ExcelUtil<T> {
private static final Logger logger = Logger.getLogger(ExcelUtil.class);
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
/**
* Excel数据转换为对象
* <p>Description: </p>
* @param file
* @param t
* @return
* @throws Exception
* @date 2016年3月26日下午4:18:20
*/
public List<T> excel2OJavaBean(File file, Class<T> t) throws Exception{
if(!file.exists()){
throw new FileNotFoundException();
}
List<T> result = new ArrayList<T>();
int beginRowNum = 1;
String[][] data = getData(file, beginRowNum);
int rowNum = data.length;
if(rowNum < 2){
throw new RuntimeException("Excel is not data.");
}
int cellNum = data[beginRowNum].length-1;
if(rowNum < 1){
throw new RuntimeException("Excel is not data.");
}
Field[] fields = t.getDeclaredFields();
int propertyNum = fields.length;
if(propertyNum < cellNum){
logger.info("cellNum=" + cellNum + " propertyNum=" + propertyNum);
throw new RuntimeException("Excel column number is greater than the number of object properties.");
}
for(int x=0; x<rowNum; x++){
T obj = t.newInstance();
for(int y=0; y<cellNum; y++){
Field field = fields[y];
String fieldType = field.getGenericType().toString();
Object value = data[x][y];
if(fieldType.equals("class java.util.Date")){
value = strToDate(value);
}else if(fieldType.equals("class java.lang.Integer")){
value = Integer.parseInt(value.toString());
}else if(fieldType.equals("class java.lang.Double")){
value = Double.parseDouble(value.toString());
}else if(fieldType.equals("class java.lang.Float")){
value = Float.parseFloat(value.toString());
}else if(fieldType.equals("class java.lang.Boolean")){
value = Boolean.parseBoolean(value.toString());
}
field.setAccessible(true);
field.set(obj, value);
field.setAccessible(false);
}
result.add(obj);
}
return result;
}
public static String[][] getData(File file, int ignoreRows) {
int rowSize = 0;
List<String[]> result = new ArrayList<String[]>();
InputStream in = null;
try {
in = new FileInputStream(file);
Workbook wb = WorkbookFactory.create(in);
if (wb instanceof XSSFWorkbook) {
result = getXSSFResult(wb, ignoreRows);
} else if (wb instanceof HSSFWorkbook) {
result = getHSSFResult(wb, ignoreRows);
}
String[][] returnArray = new String[result.size()][rowSize];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null)
in.close();
} catch (Exception ex) {
}
}
return new String[0][0];
}
public static List<String[]> getXSSFResult(Workbook wb, int ignoreRows) {
List<String[]> result = new ArrayList<String[]>();
XSSFCell cell = null;
int rowSize = 0;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
XSSFSheet st = (XSSFSheet) wb.getSheetAt(sheetIndex);
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {// 第一行为标题,不取
XSSFRow row = st.getRow(rowIndex);
if (row == null) {
continue;
}
int tempRowSize = row.getLastCellNum() + 1;
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
}
String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
String value = "";
cell = row.getCell(columnIndex);
if (cell != null) {
// cell.setEncoding(HSSFCell.ENCODING_UTF_16);//
// 注意:一定要设成这个,否则可能会出现乱码
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值
if (!cell.getStringCellValue().equals("")) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = sdf.format(date);
} else {
value = "";
}
} else {
value = new DecimalFormat("0.00").format(cell
.getNumericCellValue());
if (value.endsWith(".00")) {
value = value.substring(0,
value.length() - 3);
}
}
break;
case XSSFCell.CELL_TYPE_BLANK:
break;
case XSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y"
: "N");
break;
default:
value = "";
}
}
if (columnIndex == 0 && value.trim().equals("")) {
break;
}
values[columnIndex] = rightTrim(value);
hasValue = true;
}
if (hasValue) {
result.add(values);
}
}
}
return result;
}
@SuppressWarnings("deprecation")
public static List<String[]> getHSSFResult(Workbook wb, int ignoreRows) {
List<String[]> result = new ArrayList<String[]>();
HSSFCell cell = null;
int rowSize = 0;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet st = (HSSFSheet) wb.getSheetAt(sheetIndex);
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {// 第一行为标题,不取
HSSFRow row = st.getRow(rowIndex);
if (row == null) {
continue;
}
int tempRowSize = row.getLastCellNum() + 1;
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
}
String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
String value = "";
cell = row.getCell(columnIndex);
if (cell != null) {
// cell.setEncoding(HSSFCell.ENCODING_UTF_16);//注意:一定要设成这个,否则可能会出现乱码
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = sdf.format(date);
} else {
value = "";
}
} else {
value = new DecimalFormat("0.00").format(cell.getNumericCellValue());
if (value.endsWith(".00")) {
value = value.substring(0,value.length() - 3);
}
}
break;
case HSSFCell.CELL_TYPE_FORMULA:// 导入时如果为公式生成的数据则无值
if (!cell.getStringCellValue().equals("")) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y"
: "N");
break;
default:
value = "";
}
}
if (columnIndex == 0 && value.trim().equals("")) {
break;
}
values[columnIndex] = rightTrim(value);
hasValue = true;
}
if (hasValue) {
result.add(values);
}
}
}
return result;
}
/**
* 去掉字符串右边的空格
*
* @param str要处理的字符串
* @return 处理后的字符串
*/
public static String rightTrim(String str) {
if (str == null) {
return "";
}
int length = str.length();
for (int i = length - 1; i >= 0; i--) {
if (str.charAt(i) != 0x20) {
break;
}
length--;
}
return str.substring(0, length);
}
/**
* 字符串转Date
* 字符串格式为:2016/03/26
* <p>Description: </p>
* @param str
* @return
* @date 2016年3月26日下午4:20:46
*/
public static Date strToDate(Object str) {
Date date = null;
try {
date = sdf.parse(str != null ? str
.toString().replaceAll("/", "-") : null);
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
return date;
}
}
调用方法:
File file = new File("F:/upload/a.xlsx");
ExcelUtil<Payable> excelUtil = new ExcelUtil<Payable>();
List<Payable> payables = excelUtil.excel2OJavaBean(file, Payable.class);
for(Payable payable : payables){
System.out.println(JSON.toJSON(payable));
}
打印结果:
{"acceptDate":1454085600000,"amount":55555,"buyerMsg":"aaaaaaa","buyerPayableId":"AAAAAAAAAA","isOK":false,"payableDate":1453737600000,"supplierMsg":"ddddddddd","supplierName":"A供应商","terraceProductId":"001"}
{"acceptDate":1454086200000,"amount":66666,"buyerMsg":"bbbbbbb","buyerPayableId":"BBBBBBBBBB","isOK":true,"payableDate":1453737600000,"supplierMsg":"ddddddddd","supplierName":"B供应商","terraceProductId":"001"}
{"acceptDate":1454084400000,"amount":77777,"buyerMsg":"ccccccc","buyerPayableId":"CCCCCCCCCC","isOK":false,"payableDate":1453737600000,"supplierMsg":"ddddddddd","supplierName":"C供应商","terraceProductId":"001"}
技术点:
使用到POI读取Excel文件,利用反射技术将Excel文件列数据赋给对象属性(要求Excel列字段顺序与对象属性顺序一致),将对象封装成List<T>返回。
Excel支持2003和2007,其他版本未测试,支持 Date、Integer、Double、Float、Boolean类型
HashMap对象转换为JavaBean对象
问题:
在日常代码中,使用 spring包中的 BeanUtils.copyProperties(source,target),可以将A对象的属性复制到B对象中,但是有个问题
无法将HashMap中的属性复制到JavaBan对象中
解决方法:
引入 commons-beanutils依赖
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
使用 BeanUtils.populate(custVisitViewVO, map);可以将map复制到JavaBean中,注意第一个参数为target,第二个参数为source,与spring包中的BeanUtils正好相反
java - 如何使用嵌套集模型将平面列表转换为Java中的嵌套树?
如何解决java - 如何使用嵌套集模型将平面列表转换为Java中的嵌套树??
我正在使用 nested set model 在我的 postgres 数据库中存储类别层次结构。我能够查询给定类别 ID 的树,并查看其所有子项及其所在的深度。该查询的响应如下所示:
[
{
"id": "07e0b6c2-49cd-440b-a900-0f3d7ab88022","categoryId": "80d15a99-9e42-4b72-b44b-0b222ca5173e","name": "Root","lft": 1,"rgt": 18,"depth": 0
},{
"id": "ae53be00-c312-4cd5-a6b2-6baeaf760577","categoryId": "9b8bca09-2447-494c-be0d-0b3af7d30671","name": "Cat A","lft": 2,"rgt": 9,"depth": 1
},{
"id": "0a5d4b90-29b9-4c50-a436-d129dc6983ea","categoryId": "d06a143b-523e-4136-8a17-1049abbf76f4","name": "Cat B","lft": 3,"rgt": 4,"depth": 2
},{
"id": "11421455-abc0-464c-8bd0-e2d79302c270","categoryId": "5af63d5b-f480-4620-8393-f4b93f7972e0","name": "Cat D","lft": 5,"rgt": 6,{
"id": "4463dbce-a2bf-42fe-a864-59309ba54d22","categoryId": "21191930-a5b9-4868-883f-3798f29d70a3","name": "Cat E","lft": 7,"rgt": 8,{
"id": "0f40e7a0-e6eb-44a4-a9bd-b61512daa236","categoryId": "34b127e8-7a8f-40b3-9b7e-63c8d507cc7b","name": "Cat F","lft": 10,"rgt": 11,{
"id": "87e9991e-085c-47a5-8357-79c0e467b8ec","categoryId": "dfbbaac7-dda3-4f34-a787-183803f8e6fa","name": "Cat G","lft": 12,"rgt": 17,{
"id": "8a95b0ab-cf74-4083-9d17-40e70468350a","categoryId": "f7f04485-d089-4a5d-98cd-20b0abeba8fc","name": "Cat H","lft": 13,"rgt": 14,{
"id": "dccee476-af73-4eb6-a595-f862984d4af6","categoryId": "0eb165ec-0347-4336-8fc2-35c124bf26f2","name": "Cat I","lft": 15,"rgt": 16,"depth": 2
}
]
您会注意到树已经变平了。我试图将上述结构放入一个嵌套的树结构中,我可以将其作为 JSON 返回到我的 UI。理想情况下看起来像这样(为简洁起见省略了数据):
[
{
"name": "Cat A","children": [
{
"name": "Cat B","children": [
{
"name": "Cat C"
},{
"name": "Cat D"
}
]
},{
"name": "Cat E","children": [
{
"name": "Cat F"
}
]
}
]
}
]
我尝试了很多选项,最近的一个是将原始列表流式传输到地图中,然后根据每个节点所在的深度收集其值。这并不能完全满足我的要求,因为它对处于同一级别但不一定属于同一树的节点进行分组。
List<List<CategoryTree>> listofLists = new ArrayList<>(
categoryTreeList.stream()
.collect(Collectors.groupingBy(CategoryTree::getDepth))
.values());
似乎我应该尝试关闭 lft
和 rgt
值,以确定给定列表中的节点是否有任何子节点,这些子节点将通过大于值 1。
我该如何解决这个问题?
解决方法
我建议您创建一个类来保存您的结构数据,而不是尝试使用原始地图。
class Node {
private final String id;
private final String category;
private Node left = null;
private Node right = null;
public Node(String id,String category) {
this.id = id;
this.category = category;
}
// left and right setters
}
您需要分 2 次构建结构。
首先是创建节点并将它们添加到列表中,以便可以使用它们的索引。
List<Node> nodes = new ArrayList<>();
for (row: queryResult) {
nodes.add(new Node(row.id(),row.category()));
}
在第二遍中构建结构:
int i = 0;
for (row: queryResult) {
Node node = nodes.get(i++);
if (row.lft())
node.setLeft(nodes.get(row.lft()));
if (row.rgt())
node.setRight(nodes.get(row.rgt()));
}
有一些方法可以一次性完成,然后解析前向引用,但我真的怀疑这是否值得。
如果不能保证您的根节点是列表中的第一个节点,那么您需要查看列表,找到一个不是任何其他节点的子节点的节点。
真的没有必要存储或使用深度,除非您特别需要它来做其他事情。即便如此,除非保证结构是静态的,否则最好派生它(通过维护 parent
字段并沿层次结构向上走)。
转换为 json 最好使用一个库,例如 gson,然后使用递归转换整个结构的类的自定义转换器。
关于将SQL表转换为java bean类和sql转dsl java的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android-如何使用RxJava将双精度值的嵌套列表转换为Java类?、Excel数据转换为JavaBean对象、HashMap对象转换为JavaBean对象、java - 如何使用嵌套集模型将平面列表转换为Java中的嵌套树?等相关知识的信息别忘了在本站进行查找喔。
本文标签: