最近想嘗試一種比較簡單的開發(fā)方法。
只在xml文件中寫sql語句,傳入和傳出參數(shù)都是map。在controller和service中再做其他操作。
然后寫了份測試代碼。
這是通用Dao,service層傳入sqlId和map類型的param,根據(jù)sqlId調(diào)用對應(yīng)sql語句,返回結(jié)果也是map
public class BaseDao {
private static SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
public static List<Map> select(String sqlId, Map param) {
try {
factoryBean.setDataSource(new DruidDataSource());
SqlSessionFactory sessionFactory = factoryBean.getObject();
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession.selectList(sqlId, param);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
自定義的mapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.JinBoot">
<select id="test" parameterType="hashMap" resultType="hashMap">
select * from user
</select>
</mapper>
在application中也做了配置
mybatis.mapperLocations=classpath:mapper/*.xml
執(zhí)行的時候,經(jīng)過controller接口和service層,傳到Dao層的sqlId是mapper.JinBoot.test
, param是空。
執(zhí)行報錯。
報錯信息如下:
Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mapper.JinBoot.test
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at cn.tianyustudio.jinboot.dao.BaseDao.select(BaseDao.java:20)
at cn.tianyustudio.jinboot.service.BaseService.select(BaseService.java:10)
at cn.tianyustudio.jinboot.controller.BaseController.test(BaseController.java:21)
上網(wǎng)查了下,大概意思是沒有掃描到mapper.JinBoot.test這個id對應(yīng)的sql語句,但mybatis中不是根據(jù)namespace+id來尋找的嗎?我這里沒有用mybatis的mapper映射方式(有對應(yīng)的Dao.java),但通過這種手工指定id的方式理論上來說應(yīng)該是可行的,是哪里的配置問題還是?
mapper.JinBoot應(yīng)該是一個接口,里面聲明一個test方法,mapper.JinBoot貼出來看看
報錯源碼
public V get(Object key) {
/* 670 */ V value = super.get(key);
/* 671 */ if (value == null) {
/* 672 */ throw new IllegalArgumentException(this.name + " does not contain value for " + key);
/* */ }
/* 674 */ if ((value instanceof Ambiguity)) {
/* 675 */ throw new IllegalArgumentException(((Ambiguity)value).getSubject() + " is ambiguous in " + this.name + " (try using the full name including the namespace, or rename one of the entries)");
/* */ }
/* */
/* 678 */ return value;
/* */ }
protected final Map<String, MappedStatement> mappedStatements = new StrictMap("Mapped Statements collection");
Mybatis會解析xml文件,使用StrictMap把namespace+id作為key,MappedStatement作為value存儲起來,執(zhí)行selectList方法時會根據(jù)sqlId查找對應(yīng)的MappedStatement,如果value為null,則報出這個異常 Mapped Statements collection does not contain value for mapper.JinBoot.test。
是不是被加進了IncompleteStatement這個集合? XML文件讀取轉(zhuǎn)換失敗的話會直接加進這個集合,不會報異常的。
建議打斷點看看,mapper文件的掃描都會經(jīng)過這個方法
// 出處
// mybatis-3.4.4.jar
// org.apache.ibatis.builder.xml.XMLMapperBuilder line:132
private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
for (XNode context : list) {
final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);
try {
statementParser.parseStatementNode();
} catch (IncompleteElementException e) {
configuration.addIncompleteStatement(statementParser);
}
}
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。