[一步是咫尺,一步即天涯]
在日常开发中,我们除了基本的查询之外,经常遇到的情况还有对于大文本的存储.接下来,我们就来演示如何使用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 into userinfo values(#{userid},#{department},#{position},#{mobile},#{gender},#{email},#{cv})
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", "[email protected]", "");
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,如下:
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.最后,看看各个数据库中各个文本类型的长度范围,如下:
-------------------------------------------------------------------------------------------------------------------------------------------------------
至此,Mybatis最入门---大文本存储结束
参考资料:
官方文档:http://www.mybatis.org/mybatis-3