引言: 最近的一個項目,由於資料庫表巨多,導致需要創建N多個java實體、dao、mapper.xml映射文件,如果均使用純手工編寫,無疑需要耗費大量時間和精力。於是上網學習了mybatis generator的使用。 現在項目寫完了,閑暇之餘把乾貨奉上,供大家直接使用。 需求場景: 當你的java ...
引言:
最近的一個項目,由於資料庫表巨多,導致需要創建N多個java實體、dao、mapper.xml映射文件,如果均使用純手工編寫,無疑需要耗費大量時間和精力。於是上網學習了mybatis generator的使用。
現在項目寫完了,閑暇之餘把乾貨奉上,供大家直接使用。
需求場景:
當你的java 項目資料庫有N張表需要使用mybatis進行資料庫操作時,建議使用mybatis generator 自動生成工具。可以自動幫助你生成java實體類、dao、mapper.xml等。
首先給大家分享我自己封裝好的mybatis generator代碼自動生成項目,裡面集成了中文註釋、mysql的limit分頁功能。
git地址:[email protected]:zhaojiatao/com.zjt.mybatisGenerator.git
代碼克隆到自己的機器上,import到myeclipse中,需要重新編譯一下,就不會報錯了。
此外需要註意需要重新引入一下jar文件夾中的mybatis-generator-plugin-1.0.0.jar,如圖:
最終目錄結構如下:
接下來,請打開配置文件,如圖:
(關於generatorConfig.xml的具體教程可參見:http://blog.csdn.net/isea533/article/details/42102297)
接下來,打開generatorConfig.xml,根據你自己的需求,改變如下配置:
首先,修改資料庫連接地址。
期次,聲明本次需要操作的表及為即將生成的實體類命名。
再次,設置實體文件、dao、mapper.xml生成的路徑。
最後,運行StartUp.java
的main方法執行生成操作。
mysql中本地資料庫表為
CREATE TABLE `student` (
`id` varchar(50) NOT NULL COMMENT '主鍵',
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`gender` int(2) DEFAULT NULL COMMENT '性別1男2女',
`disc` longtext COMMENT '大文本描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
對照表,我們看一下生成的包和文件:
其中Student.java文件當然就是資料庫表實體類,對應表的相關欄位。
下麵,在我們的項目中導入生成的相關文件,如下:
打開Student.java 我們可以發現欄位已經生成了中文註釋;
打開StudentMapper.xml可以發現已經可以使用mysql的limit分頁;
在配置好mybatis的資料庫連接後(mybatis相關配置請自行baidu,本文終點介紹mybatis generator的使用),我們開始資料庫的相關操作:
打開: testMybatis.java
在此,我主要講幾個容易出錯的方法和區別:
1.selectByExample和selectByExampleWithBLOBs的區別(包含Example的使用)
@Test
public void testQueryStudentExample() {
SqlSession sqlSession = sqlSessionFactory.openSession(false);
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
try {
//分頁查詢性別為男、並且名稱中包含z的記錄,第一頁,每頁3條記錄,按性別排序
StudentExample studentExample=new StudentExample();
studentExample.or().andGenderEqualTo(1).andNameLike("%z%");
studentExample.setOffset(0);
studentExample.setLimit(3);
studentExample.setOrderByClause("GENDER DESC");
List<Student> list1 = studentMapper.selectByExample(studentExample);
List<Student> list2 = studentMapper.selectByExampleWithBLOBs(studentExample);
System.out.println(list1.get(0).getDisc());
System.out.println(list2.get(0).getDisc());
} catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
sqlSession.close();
}
}
結果:
原因:
由於student表中,disc欄位類型為longtext,故如果想要搜索結果包含大欄位類型,則必須使用selectByExampleWithBLOBs。無需檢索大欄位,則使用selectByExample;
2.insertSelective和insert的區別
當有部分欄位未設值時,使用insertSelective:
@Test
public void testInsertStudent() {
SqlSession sqlSession = sqlSessionFactory.openSession(false);
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
try {
Student s=new Student();
s.setId(java.util.UUID.randomUUID().toString().replaceAll("\\-", ""));
s.setName("zjt");
s.setGender(1);
//s.setDisc("MyBatis Generator 真心好用");
studentMapper.insertSelective(s);
sqlSession.commit();
} catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
sqlSession.close();
}
}
結果:
當有所有欄位均已設值時,使用insert;
@Test
public void testInsertStudent() {
SqlSession sqlSession = sqlSessionFactory.openSession(false);
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
try {
Student s=new Student();
s.setId(java.util.UUID.randomUUID().toString().replaceAll("\\-", ""));
s.setName("zjt");
s.setGender(1);
s.setDisc("MyBatis Generator 真心好用");
studentMapper.insertSelective(s);
sqlSession.commit();
} catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
sqlSession.close();
}
}
結果:
3.修改操作
updateByExample 如果example定義了兩個欄位,資料庫共4個欄位,則修改資料庫的兩個欄位,其餘兩個欄位改為null;
updateByExampleSelective 如果example定義了兩個欄位,資料庫共4個欄位,則修改資料庫的兩個欄位,其餘兩個欄位不動;
updateByExampleWithBLOBs 和updateByExample相比此方法可以修改大欄位類型,其餘性質和updateByExample相同
updateByPrimaryKey 如果record定義了兩個欄位,其中有一個欄位是主鍵,資料庫共4個欄位,則根據主鍵修改資料庫的兩個欄位,其餘兩個欄位改為null;
updateByPrimaryKeySelective 如果record定義了兩個欄位,其中有一個欄位是主鍵,資料庫共4個欄位,則根據主鍵修改資料庫的兩個欄位,其餘兩個欄位不動;
updateByPrimaryKeyWithBLOBs 和updateByPrimaryKey相比此方法可以修改大欄位類型,其餘性質和updateByPrimaryKey相同
綜上稍加練習,基本可以使用了。多說無益,不如敲起來。
我自己的demo:
[email protected]:zhaojiatao/testgenerator.git