【Java】json与java对象转换,获得数据库自增主键,保存返回数据 (个人梳理)

该博客梳理了如何在Java中转换JSON数据,将其存储到数据库并获取自增主键的过程。涉及Jackson依赖、控制层逻辑、DAO操作以及前端页面跳转。重点在于JSON到Java对象的转换,数据的持久化以及数据库返回的自增ID的获取。

【Java】json与java对象转换,获得数据库自增主键,保存返回数据 (个人梳理)


模拟请求API 获得json数据,将json转换为java对象,再将java对象转换为list集合,再将list集合转换为字符串,传入数据库,并且获取数据库里表的自增主键,通过打印日志输出到控制台。


前言

模拟请求API 解析保存返回数据
前端页面跳转,点击按钮解析,前端显示获取的json数据。后端处理json数据转换为java对象与 集合 到字符串 再存入数据库 最后在dao层用数据库自带的api获得存数据时的自增主键id,并将其用日志打印到控制台上


一、首先应具备jackson依赖

  <jackson.version>2.12.0</jackson.version>

二、控制层转换json的逻辑

1.先给前端写一个跳转页面的接口

代码如下:

    @RequestMapping("/getProductList")
    @ResponseBody
    public ModelAndView getJson() throws IOException {
   
   
        ModelAndView mv = new ModelAndView();
        mv.setViewName("getProductList");
        return mv;

    }

getProductList就是前端页面的名字同参

2.抒写控制层转换json和保存数据库的逻辑

代码如下):

@RequestMapping("/getProductListAndShow")
    @ResponseBody
    public Object getProductListAndShow(String url) {
   
   
       //请求接口返回字符串数据result,使用工具类(提供HttpJson)
        String result = HttpJson.get(url, "gbk");
        System.out.println(result);
        Map<String, Object> map = new HashMap<>();
        Connection conn = null;
       //字符串数据result转换为list对象:List<ShipProduct> list(提供工具类JSONUtil)
        List<ShipProduct> list = JSONUtil.jsonToArray(result, ShipProduct.class);
        System.out.println(list);

        map.put("title", result);

       // List<ShipProduct> shipProductList = GetJsonp.getJson();

        for (ShipProduct str : list) {
   
   

            ShipProductSave shipProductSave = new ShipProductSave();
              //再将list转换成字符串 用JSONUtiL工具类 为存储数据库做准备
            String shipProductStr = JSONUtil.objectToJson(str);
            shipProductSave.setShipProduct(shipProductStr);
            //System.out.println("字符串" + shipProductStr);
          //add返回自增主键 .add调用的写在dao层实现类的sql方法
            int add = studentDao.add(shipProductSave);
           //日志输出返回自增主键id
            logger.info(String.valueOf(add));


        }

        return map;
    }

三、存储数据库用到的DAO及DAO实现类

public interface IStudentDao {
   
   

    
        int add(ShipProductSave shipProductSave);
     /**      
     * 新增对象
     */
   
    
@Repository
public class StudentDaoImpl  implements IStudentDao {
   
   

    //private StudentMapper mapper = new StudentMapper();

  
//数据库表名 并不是库名 分析换库
    @Override
    public  int  add(ShipProductSave shipProductSave){
   
   
        String sql="INSERT INTO `t_ship_product`(`ship_product`,`create_time`,`update_time`) values(?,now(),now())";
//now()是数据自带的插入时间api  values前面括号里是数据库字段
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator(){
   
   
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
   
   
                PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
               //这里数据库只有1个存值字段所以填一个
                ps.setString(1,shipProductSave.getShipProduct());
                return ps;
            }
        }, keyHolder);
        //返回了自增主键的id值
        return keyHolder.getKey().intValue();    
    }

二、接下来在PO层 写两个实体类,第1个对应json数据的字段,第二个对应存储进数据库的字段

1.ShipProduct (对应json数据的字段)

代码如下:

public class ShipProduct {
   
   
    private String express_type;
    private Long product_id;
    private String product_shortname;

    public String getExpress_type() {
   
   
        return express_type;
    }

    public void setExpress_type(String express_type) {
   
   
        this.express_type = express_type;
    }

    public Long getProduct_id() {
   
   
        return product_id;
    }

    public void setProduct_id(Long product_id) {
   
   
        this.product_id = product_id;
    }

    public String getProduct_shortname() {
   
   
        return product_shortname;
    }

    public void setProduct_shortname(String product_shortname) {
   
   
        this.product_shortname = product_shortname;
    }


    }

2.ShipProductSave (对应存入数据库的字段)

代码如下:

import java.util.Date;

public class ShipProductSave {
   
   
    private Integer id;
    private String shipProduct;
    private Date createTime;
    private Date updateTime;


    public ShipProductSave() {
   
   
    }

    public ShipProductSave(Integer id, String shipProduct, Date createTime, Date updateTime) {
   
   
        this.id = id;
        this.shipProduct = shipProduct;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    public Integer getId() {
   
   
        return id;
    }

    public void setId(Integer id) {
   
   
        this.id = id;
    }

    public String getShipProduct() {
   
   
        return shipProduct;
    }

    public void setShipProduct(String shipProduct) {
   
   
        this.shipProduct = shipProduct;
    }

    public Date getCreateTime() {
   
   
        return createTime;
    }

    public void setCreateTime(Date createTime) {
   
   
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
   
   
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
   
   
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
   
   
        return "ShipProduct{" +
                "id=" + id +
                ", shipProduct='" + shipProduct + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}

前面用到的封装到的工具类

HttpJson

import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpJson {
   
   
	private static final Logger log = Logger.getLogger(HttpJson.class);

	private static final int TIMEOUT         = 5 * 1000; // 连接超时时间

	private static final int SO_TIMEOUT      = 60 * 1000; // 数据传输超时

	public static String get(String strURL,String charset) {
   
   
		log.info(strURL);
		try {
   
   
			URL url = new URL(strURL);// 创建连接
			HttpURLConnection connection = (HttpURLConnection) url
					.openConnection();
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setUseCaches(false);
			connection.setInstanceFollowRedirects(true);
			connection.setReadTimeout(SO_TIMEOUT);
			connection.setConnectTimeout(TIMEOUT);
			connection.setRequestMethod("GET"); // 设置请求方式
			connection.setRequestProperty("Accept", "application/xml"); // 设置接收数据的格式
			connection.setRequestProperty("Content-Type", "application/xml"); // 设置发送数据的格式
			connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
			connection.connect();
			OutputStreamWriter out = new OutputStreamWriter(
					connection.getOutputStream(), charset); // utf-8编码
			//out.append(params);
			out.flush();
			out.close();
			// 读取响应
			int length = (int) connection.getContentLength();// 获取长度
			InputStream is = connection.getInputStream()
声明:该设计资料来源于网友eeworld-lb8820265的开源分享,仅供学习参考,不可用途商业用途。 你是否也和我一样有这样的疑惑:论文中那么多四旋翼控制算法和姿态解算算法,为何在开源四旋翼平台中见不到?控制算法都是PID,姿态解算都是mahony和EKF。 但现在四旋翼控制还存在很多问题,例如:抗干扰能力和鲁棒性有待继续提高,变重心变质量情况下的控制效果不佳,起飞不稳定,室内自主悬停控制不够理想,惯性导航和室内导航精度低等。可研究的内容还很多,任重而道远。会发现当仿真通过后,却找不到一个趁手的四旋翼平台进行验证。 目前适合研究的四旋翼平台: Pixhawk功能强大,可扩展性好。但是也存在着如下的问题: 1. 编译复杂,开发环境不是IDE,无法在线debug 2. Nuttx操作系统复杂,而且实时性有待提高,传感器数据读取到最后控制输出的时间过长 3. 很多代码用matlab生成,不利于阅读,没有利用F4的Dsp核,效率低下,且代码结构复 杂,不利于二次开发 4. 数传速度低,只有1Hz,不能实时分析 5. IMU没有减震,需要整个飞控加减震 6. 修改程序到成功烧录过程繁琐,且不支持无线更新 大疆的M100和guidance是不错的开发平台,但是却主要用来开发视觉算法。控制算法和姿态解算给封装了。 其他:某宝上面的各种飞控,元器件性能低下,无操作系统,控制算法和姿态解算算法性能低,接口少,作为玩具还可以,作为科研那就呵呵了。Ascending Technologies公司的四旋翼开发平台倒是经常被各个科研院校和比赛使用,但是价格摆在那里。 因此越来越感受到拥有一个适合研究的四旋翼平台的重要性,无奈我个人的精力和能力有限,因此开贴聚拢志同道合的朋友共同学习,只有开源才能促进技术的进步。 初步设想的四旋翼具有如下的特点: 1. 具有先进的控制和姿态解算算法 2. 程序模块化设计,方便各种算法的实现 3. 提供Matlab仿真和理论支持 4. 高速数传,数据波形实时查看和分析 5. 高性能MCU和IMU 6. 优化代码,充分利用DSP核 7. 支持无线更新 8. 使用IDE编写、编译、调试和烧录 9. 采用简单高效的操作系统,充分减少控制延时 10. IMU放到有减震海绵的铝盒子里,接口形式可更换不同方案 11. 提供多种常见接口,也提供以太网接口,方便连接机载电脑 根据我个人的优势和技术的特点,初步确定四旋翼软硬件如下: MCU+GPS+IMU盒子方案一: 元器件 型号 MCUSTM32F746ZGT6 GPS+Mag3DR GPS Acc+MagLSM303AGR GroL3GD20H Acc+GroLSM6DSM 气压计LPS22HB IMU盒子方案一全部采用ST最新的高性能元器件,有现成的驱动,和Pixhawk一样采用双陀螺仪加速度计冗余设计。MCU 采用高性能F746,可以运行复杂算法。 IMU盒子方案二:元器件型号 AccADXL354 GroADXRS642 ×3 气压计MS5803 IMU盒子方案二采用ADI高性能惯性传感器和高性能气压计,满足更高性能需求。飞控软件相关: 部分 具体 操作系统FreeRTOS 文件系统FatFs 通信协议Mavlink 开发环境Keil+QT 协同工作Github 开源协议BSD3-clause 四旋翼飞控的主板,IMU,元器件和主控板第一代实物截图: 过一番探讨,决定第一版硬件采用三部分组成,核心版采用Nucleo F767,主板固定在机架上,IMU做成减震盒子。 主板上接口与硬件:PWM遥控接口,PPM遥控接口,8个电机控制接口,1个PWM用户接口, 3DR GPS的接口,SD卡接口,电源管理,Flash,三色LED灯,F450机架接口。 IMU上硬件与接口:LSM6DSM,LPS22HB,LSM303AGR,ICM20608,2W加热电阻,3.3V电源,14pin的排线接口。 IMU上采用了很多冗余器件,例如LSM6DSM与ICM20608功能重合,主要是为了测试性能。 说明: EEDrone开源四旋翼从零开始详细的制作步骤,详见“相关文件”超链。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值