java序列化之将一个对象保存到mysql数据库并读取出来

序列化:将 Java 对象转换成字节流的过程(二进制数据)。
反序列化:将字节流转换成 Java 对象的过程。
基本思路:将一个实现序列化接口的类的实体类,保存到一个byte[]数组中,然后写入到mysql数据 库,数据类型是二进制类型
序列化优点:
1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输

2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象


序列化与反序列化

  • java序列化之将一个对象保存到mysql数据库并读取出来
  • 1.java代码:
  • 1.1自定义的类并implments Serializable
  • 1.2写一个方法将一个实体类写入数据库:
  • 1.3写一个方法将数据从数据库读取出来:


1.java代码:

1.1自定义的类并implments Serializable

public class Account {
    private Integer id;
    private String username;
    private String password;
    private byte[] excelfield;//从数据库读取二进制数据并保存到这里
    public Account() {
    }

    public Account(String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }}
public class NamesList implements Serializable {
	private static final long serialVersionUID = 828776519500192025L;

	private ArrayList<ArrayList<Namex>> allNames = null;//自定义数据!
	public NamesList() {
    allNames = new ArrayList<>();
	}
}

1.2写一个方法将一个实体类写入数据库:

public static void saveToDb(NamesList test) throws IOException {
    byte[] std;
    /*关键步骤:将对象变成二进制数组。使用对象输出流将对象
   				 写入ByteArrayOutputStream里再使用toByteArry()变成byte数组
   				 然后存到数据库*/
    ByteArrayOutputStream byt=new ByteArrayOutputStream();
    ObjectOutputStream obj=new ObjectOutputStream(byt);
    obj.writeObject(test);
    std=byt.toByteArray();
    //这里使用的是JdbcTemplate 存入数据库
    JdbcTemplate jdbcTemplate = new JdbctempUtils().jdbcTemplate;
    /*下面excelfield 的数据类型是:Bolb
    	TinyBlob:最大 255
		Blob:最大 65KB
		MediumBlob:最大 16MB
		LongBlob:最大 4GB*/
    String sql = "update user set excelfield=?  where username='1044204723'";
    int count = jdbcTemplate.update(sql, std);
    System.out.println(count);
}

1.3写一个方法将数据从数据库读取出来:

public static void readDb() throws IOException, ClassNotFoundException {
        JdbcTemplate jdbcTemplate = new JdbctempUtils().jdbcTemplate;
        String sql = "select * from user where username=1044204723 ";
        //查询并封装成自定义对象,注意:自定义对象一定包含保存在数据库中的二进制的列的名字
        List<Account> query =jdbcTemplate.query(sql, new BeanPropertyRowMapper<Account>(Account.class));
        System.out.println("查询到的数据是:" +query.size()+query.get(0)+ query.get(0).getExcelfield());
        //输出数据字节数量
        System.out.println(query.get(0).getExcelfield().length);
        //取出二进制数据
        byte[] ob=query.get(0).getExcelfield();
        //将取出的二进制数据反序列化成序列化的对象,依旧使用对象流处理
        ByteArrayInputStream byteInt=new ByteArrayInputStream(ob);
        ObjectInputStream objInt=new ObjectInputStream(byteInt);
        NamesList o=(NamesList)objInt.readObject();

		//遍历数据是否正确
        for (ArrayList<Namex> list : o.allNames) {
            for (Namex name : list
            ) {
                System.out.println(name);
            }
        }
    }

------------开个玩笑哈哈,不会这么干的,灵感来源于Dubbo传输数据-------