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

[一步是咫尺,一步即天涯]

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

准备工作:

a.操作系统 :win7 x64

b.基本软件:MySQL,Mybatis,SQLyog

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

1.在我们的userinfo数据表中增加一个简历字段,类型为longtext,如下:

Mybatis最入门---大文本存储_第1张图片

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.最后,看看各个数据库中各个文本类型的长度范围,如下:

  • 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





你可能感兴趣的:(Mybatis)