mybatis最主要的知识已经讲完。这篇博客将一些mybatis的细节知识。
一、处理CLOB、BLOB 类型数据
CLOB是大文本类型的数据,比如小说这种很多字符的数据。BLOB是二进制数据,用来存放图片、视频等数据。
1.打开mysql数据库,把t_student表进行修改如下:删除与t_grade和t_address表的关联关系,并添加新的字段为:
这里添加了字段pic,这个字段存储学生的相片,类型为longblob,mysql中blob类型比较小,这里使用longblob。字段remark存储学生的简历,使用longtext类型(clob类型在mysql中为longtext)
2.修改类Student为:
这里相应的添加了两个属性代表学生的相片和建立了。生成这两个属性的get和set方法。
3.StudentMapper中添加接口:
public int insertStudent(Student student);
public Student getStudentById(Integer id);
添加了两个方法分别为添加学生和获取学生
4.sql映射器中实现这两个方法:
<insert id="insertStudent" parameterType="Student">
insert into t_student values(null,#{name},#{age},#{pic},#{remark})
</insert>
这里先实现插入方法。
5.写测试方法:
@Test
public void testInsertStudent(){
logger.info("添加学生");
Student student = new Student();
student.setName("张三4");
student.setAge(14);
student.setRemark("很长的文本");
byte[] pic = null;
try{
File file = new File("C://boy.jpg");
InputStream inputStream = new FileInputStream(file);
pic = new byte[inputStream.available()];
inputStream.read(pic);
inputStream.close();
}catch(Exception e){
e.printStackTrace();
}
student.setPic(pic);
studentMapper.insertStudent(student);
sqlSession.commit();
}
这里特别注意对照片的处理。使用的是二进制流的方式把照片存入到数据库中。
运行测试方法:
可以发现图片和文本已经存入到了数据库中。双击图片,能够显示出图片。
5.获取学生方法实现:
<select id="getStudentById" parameterType="Integer" resultType="Student">
select * from t_student where id=#{id}
</select>
6.添加测试方法:
@Test
public void testGetStudentById(){
logger.info("通过id查找学生");
Student student = studentMapper.getStudentById(6);
System.out.println(student);
byte[] pic = student.getPic();
try{
File file = new File("D://boy2.jpg");
OutputStream outputStream = new FileOutputStream(file);
outputStream.write(pic);
outputStream.close();
}catch(Exception e){
e.printStackTrace();
}
}
这里把数据库中的图片取出后放在了d盘下。
运行测试方法,可以发现D盘出现了需要的图片。
二、传入多个输入参数
前面的例子中讲到的传入多个输入参数时使用的是map类型,这个是最常用的方式,以后的开发中都要使用这种方式。这里要讲的传入多个参数知识只是作为了解,使用不到。
1.添加接口方法
public List<Student> searchStudents6(String name,int age);
这个查询中传入了两个参数(实际开发中使用map形式),通过这两个参数来查询学生。
2.实现这个方法:
<select id="searchStudents6" resultMap="StudentResult">
select * from t_student where name like #{param1} and age=#{param2}
</select>
这里注意了,使用param1代表第一个输出的参数,使用param2代表第二个输入的参数。
3.写测试方法:
@Test
public void testSearchStudents6() {
logger.info("查询学生(带条件)");
List<Student> studentList = studentMapper.searchStudents6("%李%",11);
for(Student s:studentList){
System.out.println(s);
}
}
运行这个测试方法,得到相应的数据。