如何将对象持久化到数据库中BLOB

如何将对象持久化到数据库中BLOB,第1张

对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。

在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。

首先建立一个测试表:

create table TESTBLOB

(

NAMEVARCHAR2(50) not null,

CONTENT BLOB not null,

ID NUMBER(8) not null

)alter table TESTBLOB

add constraint IDFORTEST primary key (ID)

只用三个字段,其中id是属性,content是我们要存储对象的字段。

先来看看我们要存入的对象:

import java.io.Serializable

import java.util.Date

import java.util.List

public class TestObject implements Serializable {

private static final long serialVersionUID = 4558876142427402513L

/**

* @param args

*/

private String name

private String password

private Date date

private List<City>cityList

public List<City>getCityList() {

return cityList

}

public void setCityList(List<City>cityList) {

this.cityList = cityList

}

public Date getDate() {

return date

}

public void setDate(Date date) {

this.date = date

}

public String getName() {

return name

}

public void setName(String name) {

this.name = name

}

public String getPassword() {

return password

}

public void setPassword(String password) {

this.password = password

}

}

记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:

import java.io.Serializable

public class City implements Serializable{

private static final long serialVersionUID = 4558876127402513L

private String name

private String code

public String getCode() {

return code

}

public void setCode(String code) {

this.code = code

}

public String getName() {

return name

}

public void setName(String name) {

this.name = name

}

}

City对象包括了城市名称和区号。下面是主要的应用了。

import java.io.BufferedInputStream

import java.io.ByteArrayInputStream

import java.io.ByteArrayOutputStream

import java.io.InputStream

import java.io.ObjectInputStream

import java.io.ObjectOutputStream

import java.io.OutputStream

import java.sql.Connection

import java.sql.DriverManager

import java.sql.ResultSet

import java.sql.Statement

import java.util.ArrayList

import java.util.Date

import java.util.List

import oracle.sql.BLOB

public class Test {

public static void main(String[] args) {

//创建测试用对象

City beijing = new City()

beijing.setName("北京")

beijing.setCode("010")

City shanghai = new City()

shanghai.setName("上海")

shanghai.setCode("020")

City tianjin = new City()

tianjin.setName("天津")

tianjin.setCode("021")

List<City>cityList = new ArrayList<City>()

cityList.add(beijing)

cityList.add(shanghai)

cityList.add(tianjin)

TestObject obj = new TestObject()

obj.setName("yangsq")

obj.setPassword("111")

obj.setDate(new Date())

obj.setCityList(cityList)

try{

//将对象存入blob字段

ByteArrayOutputStream byteOut=new ByteArrayOutputStream()

ObjectOutputStream outObj=new ObjectOutputStream(byteOut)

outObj.writeObject(obj)

final byte[] objbytes=byteOut.toByteArray()

Class.forName("oracle.jdbc.driver.OracleDriver")

Connection con = DriverManager.getConnection(

"jdbc:oracle:thin:@***.***.***.***:1521:****", "yangsq", "yangsq")

con.setAutoCommit(false)

Statement st = con.createStatement()

st.executeUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())")

ResultSet rs = st.executeQuery("select CONTENT from TESTBLOB where ID=1 for update")

if (rs.next()) {

BLOB blob = (BLOB) rs.getBlob("CONTENT")

OutputStream outStream = blob.getBinaryOutputStream()

outStream.write(objbytes, 0, objbytes.length)

outStream.flush()

outStream.close()

}

byteOut.close()

outObj.close()

con.commit()

//取出blob字段中的对象,并恢复

rs = st.executeQuery("select CONTENT from TESTBLOB where ID=1")

BLOB inblob = null

if (rs.next()) {

inblob = (BLOB) rs.getBlob("CONTENT")

}

InputStream is = inblob.getBinaryStream()

BufferedInputStream input = new BufferedInputStream(is)

byte[] buff = new byte[inblob.getBufferSize()]

while(-1 != (input.read(buff, 0, buff.length)))

ObjectInputStream in =

new ObjectInputStream(

new ByteArrayInputStream(

buff))

TestObject w3 = (TestObject)in.readObject()

System.out.println(w3.getName())

System.out.println(w3.getPassword())

System.out.println(w3.getDate())

List<City>list = w3.getCityList()

for(City city : list){

System.out.println(city.getName() + "" + city.getCode())

}

st.close()

con.close()

} catch (Exception ex) {

ex.printStackTrace()

System.exit(1)

}

}

}

代码的蓝色部分创建了要存储的对象。再看红色的对象写入部分,它首先把对象转化成二进制流的形式。对于blob字段,我们不能简单的在insert时插入,实际上,insert时,对于blob字段,只能先插入一个空的blob对象empty_blob(),然后再进行"select CONTENT from TESTBLOB where ID=1 for update"对blob字段进行更新。返回后,我们只要把对象的二进制流写入即可。

OutputStream outStream = blob.getBinaryOutputStream()

outStream.write(objbytes, 0, objbytes.length)

需要注意的是,上述步骤必须设置con.setAutoCommit(false),否则oracle会抛出异常。

接下来,绿色的代码是读取数据库中blob字段的对象,并恢复。我们要知道的是,所有对blob字段的 *** 作都是二进制的,即插入时是二进制流,读出时也是二进制流。然后用io修饰器(ObjectInputStream)去修饰。以前学习java时,感觉它的io好繁琐啊,现在感觉还真是各有其用。下面是测试的输出结果。

yangsq

111

Tue Mar 27 12:11:28 CST 2007

北京010

上海020

天津021

需要说明一下,buff的size一定要足够大,否则将抛出异常。在这里,我使用的是inblob.getBufferSize()来设置buff的size,这并不是一种好的方法,因为一般inblob.getBufferSize()都是32768,很可能出现异常,所以这个size最好自己设置,或系统运行时刻设置(幸好java提供数组长度的运行时刻设置)。

1、点击添加,实例化一个DataGridView的行对象DataRow 然后把这个对象添加到DataGridView中,你的DataGridView要是可编辑状态,然后编辑数据,点保存循环读取DataGridView的行数据,存到实体类中,在通过后台SQL保存到数据库。

2、将datagridview于数据库中对应的表进行绑定,绑定完成之后直接在datagridview中进行添加就可以,自动在数据库中添加并保存。

3、创建一个表结构,每次新增的时候往表里面加一条记录,然后DataGridView再绑定表就可以了。保存的时候连接数据库+sql就完成了。

4、就是正常的添加就可以了啊。首先连接数据库 而后插入数据库的表。

5、gridview没有自带这种功能,只自带了,编辑删除(也可能是我不知道,我没用过直接可以添加一行新的)你可以模仿一个这样的功能,用js动态添加一行textbox,每个字段对应一个,你把数据添加后,点击保存,就ok了,当然你的动态添加的textbox要在gridview下面,样式要对齐,感觉上是gridview添加了一行。

将DataSet数据集写入数据库:string strConnect = Provider=SQLOLEDB.1Password=1234Persist Security Info=True+User ID=usernameInitial Catalog=MyTempDbData Source=localhostOleDbConnection dbConn = new OleDbConnectiondbConn.ConnectionString = strConnecttry{StringBuilder strXml = new StringBuilder()StringWriter strWriter = new StringWriter( strXml )XmlTextWriter writer = new XmlTextWriter(strWriter)writer.WriteStartDocument()m_dsDataSet.WriteXml(writer)string strSQL = INSERT INTO temp(Temp_date,Temp_data) VALUES(GETDATE(),?)OleDbCommand aCommand = new OleDbCommand( strSQL , dbConn )aCommand.Parameters.Add(Temp_data, OleDbType.VarChar).Value = strXml.ToString()aCommand.Connection.Open()aCommand.ExecuteNonQuery()}catch ( OleDbException e ){Debug.WriteLine(发生异常: + e.ToString())}从数据库中读出DataSet数据集:// 这里省略千篇一律的数据库的Query *** 作OleDbDataReader aReader = aCommand.ExecuteReader( )if (aReader.Read() ){StringBuilder strXml = new StringBuilder( aReader[temp_data].ToString() )StringReader strReader = new StringReader( strXml.ToString() )XmlTextReader reader = new XmlTextReader(strReader)try{m_dsDataSet.ReadXml(reader)aReader.Close( )}catch( OleDbException e ){Debug.WriteLine(发生异常: + e.ToString())}}注意以上例子所引用的变量m_dsDataSet的原始定义为DataSet m_dsDataSet,在这里是一个作者自定义包含有两个表和记录的DataSet实例,其中的记录来源于搜索引擎分析出的每条记录。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6701363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-27
下一篇2023-03-27

发表评论

登录后才能评论

评论列表(0条)

    保存