SpringBoot 中怎么集成使用MyBatis,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
mybatis.type-aliases-package=com.neo.model spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
傳參方式
@Delete("DELETE FROM users WHERE id =#{id}") void delete(Long id);
如果你的映射方法的形參有多個,這個注解使用在映射方法的參數上就能為它們取自定義名字。若不給出自定義名字,多參數則先以 "param" 作前綴,再加上它們的參數位置作為參數別名。例如,#{param1}、#{param2},這個是默認值。如果注解是 @Param("person"),那么參數就會被命名為 #{person}。
@Select("SELECT * FROM users WHERE user_sex = #{user_sex}") List<User> getListByUserSex(@Param("user_sex") String userSex);
需要傳送多個參數時,可以考慮使用 Map
@Select("SELECT * FROM users WHERE username=#{username} AND user_sex = # {user_sex}") List<User> getListByNameAndSex(Map<String, Object> map);
最常用的使用方式是直接使用對象:
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(# {userName}, #{passWord}, #{userSex})") void insert(User user);
使用對象
使用Map
使用 @Param
先來介紹一下使用注解版的 MyBatis 如何將參數傳遞到 SQL 中。
直接使用
注解介紹
注解版最大的特點是具體的 SQL 文件需要寫在 Mapper 類中,取消了 Mapper 的 XML 配置。 上面介紹參數的時候,已經使用了 @Select、@Delete 等標簽,這就是 MyBatis 提供的注解來取代其 XML 文件配置,下面我們一一介紹。
@Select 注解
//@Select 主要在查詢的時候使用,查詢類的注解,所有的查詢均使用這個,具體如下: @Select("SELECT * FROM users WHERE user_sex = #{user_sex}") List<User> getListByUserSex(@Param("user_sex") String userSex);
@Insert 注解
//@Insert,插入數據庫時使用,直接傳入實體類會自動解析屬性到對應的值,示例如下: @Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})") void insert(User user);
@Update 注解
//@Update,所有的更新操作 SQL 都可以使用 @Update。 @Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}") void update(UserEntity user);
@Delete 注解
//@Delete 處理數據刪除。 @Delete("DELETE FROM users WHERE id =#{id}") void delete(Long id);
以上就是項目中常用的增、刪、改、查,但有時候我們有一些特殊的場景需要處理,比如查詢的對象返回值屬性名和字段名不一致,或者對象的屬性中使用了枚舉。我們期望查詢的返回結果可以將此字段自動轉化為對應的類型,MyBatis 提供了另外兩個注解來支持:@Results 和 @Result。
@Results 和 @Result 注解; - 這兩個注解配合來使用,主要作用是將數據庫中查詢到的數值轉化為具體的字段,修飾返回的結果集,關聯實體類屬性和數據庫字段一一對應,如果實體類屬性和數據庫屬性名保持一致,就不需要這個屬性來修飾。示例如下:
@Select("SELECT * FROM users") @Results({ @Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class), @Result(property = "nickName", column = "nick_name") }) List<UserEntity> getAll();
注意,使用 # 符號和 $ 符號的不同:,下面兩個例子可以發現,使用 # 會對 SQL 進行預處理,使用 $ 時拼接 SQL,建議使用 #,使用 $ 有 SQL 注入的可能性。
// This example creates a prepared statement, something like select * from teacher where name = ?; @Select("Select * from teacher where name = #{name}") Teacher selectTeachForGivenName(@Param("name") String name); // This example creates n inlined statement, something like select * from teacher where name = 'someName'; @Select("Select * from teacher where name = '${name}'") Teacher selectTeachForGivenName(@Param("name") String name);
動態SQL
MyBatis 最大的特點是可以靈活的支持動態 SQL,在注解版中提供了兩種方式來支持,第一種是使用注解來實現,另一種是提供 SQL 類來支持。
使用注解來實現,用 script 標簽包圍,然后像 XML 語法一樣書寫:
@Update("<script> update users <set> <if test="userName != null">userName=#{userName},</if> <if test="nickName != null">nick_name=#{nickName},</if> </set> where id=#{id} </script>") void update(User user);
這種方式就是注解 + XML 的混合使用方式,既有 XML 靈活又有注解的方便,但也有一個缺點需要在 Java 代碼中拼接 XML 語法很不方便,因此 MyBatis 又提供了一種更優雅的使用方式來支持動態構建 SQL。
使用 SQL 構建類來支持,以分頁為例進行演示,首先定義一個 UserSql 類,提供方法拼接需要執行的 SQL:
public class UserSql { public String getList(UserParam userParam) { StringBuffer sql = new StringBuffer("select id, userName, passWord, user_sex as userSex, nick_name as nickName"); sql.append(" from users where 1=1 "); if (userParam != null) { if (StringUtils.isNotBlank(userParam.getUserName())) { sql.append(" and userName = #{userName}"); } if (StringUtils.isNotBlank(userParam.getUserSex())) { sql.append(" and user_sex = #{userSex}"); } } sql.append(" order by id desc"); sql.append(" limit " + userParam.getBeginLine() + "," + userParam.getPageSize()); log.info("getList sql is :" +sql.toString()); return sql.toString(); } }
可以看出 UserSql 中有一個方法 getList,使用 StringBuffer 對 SQL 進行拼接,通過 if 判斷來動態構建 SQL,最后方法返回需要執行的 SQL 語句。
接下來只需要在 Mapper 中引入這個類和方法即可,相對于 @SelectProvider 提供查詢 SQL 方法導入,還有 @InsertProvider、@UpdateProvider、@DeleteProvider 提供給插入、更新、刪除的時候使用。
type:動態生成 SQL 的類
method:類中具體的方法名
@SelectProvider(type = UserSql.class, method = "getList") List<UserEntity> getList(UserParam userParam);
結構化SQL
可能你會覺得這樣拼接 SQL 很麻煩,SQL 語句太復雜也比較亂,別著急!MyBatis 給我們提供了一種升級的方案:結構化 SQL。
public String getCount(UserParam userParam) { String sql= new SQL(){{ SELECT("count(1)"); FROM("users"); if (StringUtils.isNotBlank(userParam.getUserName())) { WHERE("userName = #{userName}"); } if (StringUtils.isNotBlank(userParam.getUserSex())) { WHERE("user_sex = #{userSex}"); } //從這個 toString 可以看出,其內部使用高效的 StringBuilder 實現 SQL 拼接 }}.toString(); log.info("getCount sql is :" +sql); return sql; }
SELECT 表示要查詢的字段,可以寫多行,多行的 SELECT 會智能地進行合并而不會重復。 FROM 和 WHERE 跟 SELECT 一樣,可以寫多個參數,也可以在多行重復使用,最終會智能合并而不會報錯。這樣語句適用于寫很長的 SQL,且能夠保證 SQL 結構清楚,便于維護、可讀性高。
多數據源使用
注解版的多數據源使用和 XML 版本的多數據源基本一致。
首先配置多數據源:
mybatis.type-aliases-package=com.neo.model spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.test1.username=root spring.datasource.test1.password=root spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.test2.username=root spring.datasource.test2.password=root spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver
分別構建兩個不同的數據源。
@Configuration @MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate") public class DataSource1Config { @Bean(name = "test1DataSource") @ConfigurationProperties(prefix = "spring.datasource.test1") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test1SqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "test1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
DataSource2 配置和 DataSource1 配置基本相同,只是去掉了 @Primary。
測試
分別注入兩個不同的 Mapper,想操作哪個數據源就使用哪個數據源的 Mapper 進行操作處理。
@RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private User1Mapper user1Mapper; @Autowired private User2Mapper user2Mapper; @Test public void testInsert() throws Exception { user1Mapper.insert(new User("aa111", "a123456", UserSexEnum.MAN)); user1Mapper.insert(new User("bb111", "b123456", UserSexEnum.WOMAN)); user2Mapper.insert(new User("cc222", "b123456", UserSexEnum.MAN)); } }
關于SpringBoot 中怎么集成使用MyBatis問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。