1. 程式人生 > >Springboot+mybaits中遇到的問題

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

mybatis.configuration.mapUnderscoreToCamelCase=true

解決辦法四:通過使用在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;
}

目前暫時碰到這些值得記錄的問題,以後在遇到有價值的再新增吧