Springboot+mybaits中遇到的問題
一、Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
網上的說法統一都是:Mybatis3依賴的jar包"mybatis-spring-1.2.0.jar"這個版本以及以上的版本中,對SqlSessionDaoSupport類中的'sqlSessionFactory'或'sqlSessionTemplate'注入方式進行了調整。
可是我使用了低版本也一樣報錯,然後使用高版本的解決方法:
建立一個Dao的基類CommonDao,讓這個基類繼承SqlSessionDaoSupport,並通過set方法注入SqlSessionFactory屬性即可:
public class CommonDao extends SqlSessionDaoSupport {
@Resource
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
}
然後讓Dao實現類再繼承這個CommonDao基類即可:
@Repository public class PersonDaoImpl extends CommonDao implements PersonDao { //此處省略... }
也毫無作用,我的思路就是寫一個BaseDao繼承SqlSessionDaoSupport ,然後用我的***DaoImpl繼承BaseDao再實現***Dao。可能因為我是用的是註解版的mybatis結合springboot的原因吧。
所有網上的方法都找不到解決不了我的問題,於是重點來了!!!
我從網上copy了一個springboot+mybatis的專案,然後再次基礎上更改,最後居然沒報錯了!!!
二、資料庫欄位與entity欄位對應方法
解決辦法一:使用@Results
@Select("SELECT * FROM membership") @Results({ @Result(property="firstName",column="first_name"), @Result(property="lastName",column="last_name") }) List<Membership> getAllMembership();
要在mapper中一個個宣告,比較麻煩。
解決辦法二:使用基於XML的mapper對映,也麻煩
解決辦法三:
駝峰命名
在properties中新增以下配置,在執行查詢後,可以將資料庫的NN_NN格式欄位,在java結果集物件中自動轉換成駝峰命名引數
- userName對應user_name;
- userId對應user_id;
1 |
|
解決辦法四:通過使用在SQL語句中定義別名完成對映,不過需要一個個欄位對映,和方法一差不多
@Select("SELECT first_name as firstName FROM membership")
解決辦法四(終結解決方法):資料庫欄位和entity欄位一樣(哈哈哈哈,感覺違背初衷了)
三、引入其他元件
類似dozermapper,不僅需要引入dozer還需要引入dozer.xml檔案,使用springboot推薦的全註解方式。
@Configuration
public class DozerConfig {
@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/*.xml") Resource[] resources) throws Exception {
final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(resources);
return dozerBeanMapperFactoryBean;
}
}
三、@One @Many
springboot+mybaits中一對一,多對一關係。
這篇部落格就寫得挺不錯的,再次轉發他的。
注意,@one中只內嵌了select關聯查詢方法,我一開始還想能不能使用這個來在附屬方法裡再insert其他表的- -
可以點進@One中看懂到,只有select方法
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface One {
String select() default "";
FetchType fetchType() default FetchType.DEFAULT;
}
目前暫時碰到這些值得記錄的問題,以後在遇到有價值的再新增吧