MyBatis provides built-in support for mapping CLOB/BLOB type columns.
Assume we have the following table to store the Students and Tutors photographs and their biodata:
CREATE TABLE USER_PICS ( ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) DEFAULT NULL, PIC BLOB, BIO LONGTEXT, PRIMARY KEY (ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;
Here, the photograph can be an image of type PNG, JPG, and so on, and the biodata can be a lengthy history about the student/tutor.
By default, MyBatis maps CLOB type columns to the java.lang.String type and BLOB type columns to the byte[] type.
public class UserPic { private int id; private String name; private byte[] pic; private String bio; //setters & getters }
Create the UserPicMapper.xml file and configure the mapped statements as follows:
<insert id="insertUserPic" parameterType="UserPic"> INSERT INTO USER_PICS(NAME, PIC, BIO) VALUES(#{name}, #{pic}, #{bio}) </insert> <select id="getUserPic" parameterType="int" resultType="UserPic"> SELECT * FROM USER_PICS WHERE ID = #{id} </select>
The following method insertUserPic() shows how to insert data into CLOB/BLOB type columns:
public void insertUserPic() { byte[] pic = null; try { File file = new File("C:\Images\UserImg.jpg"); InputStream is = new FileInputStream(file); pic = new byte[is.available()]; is.read(pic); is.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String name = "UserName"; String bio = "put some lenghty bio here"; UserPic userPic = new UserPic(0, name, pic, bio); SqlSession sqlSession = MyBatisUtil.openSession(); try { UserPicMapper mapper = sqlSession.getMapper(UserPicMapper.class); mapper.insertUserPic(userPic); sqlSession.commit(); } finally { sqlSession.close(); } }
The following method getUserPic() shows how to read CLOB type data into String and BLOB type data into byte[] properties:
public void getUserPic() { UserPic userPic = null; SqlSession sqlSession = MyBatisUtil.openSession(); try { UserPicMapper mapper = sqlSession.getMapper(UserPicMapper.class); userPic = mapper.getUserPic(1); } finally { sqlSession.close(); } byte[] pic = userPic.getPic(); try { OutputStream os = new FileOutputStream(new File("C:\Images\UserImage_FromDB.jpg")); os.write(pic); os.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }