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传输数据-------