您的位置:首页 > 其它

Mybatis最入门---大文本存储

2016-04-24 17:41 288 查看
[一步是咫尺,一步即天涯]

在日常开发中,我们除了基本的查询之外,经常遇到的情况还有对于大文本的存储.接下来,我们就来演示如何使用mybatis实现文本的存储。

准备工作:

a.操作系统 :win7 x64

b.基本软件:MySQL,Mybatis,SQLyog
-------------------------------------------------------------------------------------------------------------------------------------
1.在我们的userinfo数据表中增加一个简历字段,类型为longtext,如下:



2.复制我们前文的工程,重命名为Mybatis10,工程结构保持不变。

3.修改UserInfo.java文件,具体内容如下:

@SuppressWarnings("serial")
public class UserInfo implements Serializable {

private	String userid;
private String department;
private String position;
private String mobile;
private String gender;
private String email;
private String vc;
//set,get,构造函数,toString,请读者自行完成
}
4.修改UserInfoMapper.xml文件,具体内容如下:

<insert id="insertUserInfoByClob" parameterType="userInfo">
insert into userinfo values(#{userid},#{department},#{position},#{mobile},#{gender},#{email},#{cv})
</insert>


5.在UserInfoDao.java中增加对应接口定义,如下:【注意,为节省篇幅,我们将下面的查询语句一起给出。】

public interface UserInfoDao {
int insertUserInfoByClob(UserInfo ui);
UserInfo selectUserInfoClobById(String id);
}


6.单元测试方法如下:

@Test
public void testInsert() {
try {

UserInfo ui = new UserInfo("clob", "3", "clob", "77778888", "0", "clob@email.com", "");
File file = new File("C://Temp/my.txt");
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
while ((fis.read(buf)) != -1) {
sb.append(new String(buf));
buf = new byte[1024];// 重新生成,避免和上次读取的数据重复
}
String cv = new String(sb.toString().getBytes(),"utf-8");
System.out.println(cv.length());
ui.setCv(cv);
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
int re = userInfo.insertUserInfoByClob(ui);
if (re == 1) {
System.out.println("success");
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
6.运行单元测试方法,观察数据库变化即可。

-------------------------------------------------------------------------------------------------------------------------------------------------------

【注意】

a.本例使用范围为文本类型的文件。

b.文件的格式务必与数据库保持一致,如果不同,请一定在insert之前进行转码操作。如果在控制台输出乱码,那么即使所有配置正确,仍然可能导致插入失败,请各位看官特别注意。

c.如果控制台提示有packet长度不够,请在my.ini文件中修改对应配置,之后请重新启动即可。

--------------------------------------------------------------------------------------------------------------------------------------------------------

刚才我们演示了,insert操作,现在,我们来看看select操作步骤:

1.在Mapper文件中增加查询SQL,如下:

<select id="selectUserInfoClobById" parameterType="String" resultType="userInfo">
select * from userinfo where userid=#{id}
</select>
2.新增单元测试方法,如下:

@Test
public void testSelect() {
try {
String id = "clob";
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
UserInfo re = userInfo.selectUserInfoClobById(id);
byte[] buff=new byte[]{};
buff=re.getCv().getBytes();
FileOutputStream out=new FileOutputStream("C://Temp/out.txt");
out.write(buff,0,buff.length);
out.close();
System.out.println(re);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
3.运行单元测试方法,观察目标目录是否有对应输出。

-------------------------------------------------------------------------------------------------------------------------------------------------------

【注释】

1.从上面的示例中,我们发现对于大文本文件的存储,实际上跟String的存储过程十分相似。在一般场景下,我们可以使用char,varchar达到我们的目的。

2.上面示例的方法内有关于文件读写的方法, 请各位看官在实际应用中严格按照文件的读写规范来编写。

3.在实际应用中,大量的文件最好不要存储在数据库中,推荐的做法是:将文件单独的存储在文件系统,数据库中保存路径即可。这样能够使得数据库的单表体积迅速降低,提高CRUD的效率。但是,如果确实存在需要将大文本存储在数据库中,也建议采取分表措施,即主体的其他信息是一张表,文本信息是一张表,再通过主外键等方法确定关联关系即可。上面的例子只是为了说明读写的操作步骤,从设计上,是非常不推荐的。请特别留意。

4.最后,看看各个数据库中各个文本类型的长度范围,如下:

TINYTEXT 最大长度是 255 (2^8 - 1) 个字符。
TEXT 最大长度是 65535 (2^16 - 1) 个字符。
MEDIUMTEXT 最大长度是 16777215 (2^24 - 1) 个字符。
LONGTEXT 最大长度是 4294967295 (2^32 - 1) 个字符

-------------------------------------------------------------------------------------------------------------------------------------------------------

至此,Mybatis最入门---大文本存储结束

参考资料:

官方文档:http://www.mybatis.org/mybatis-3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: