欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

SpringBoot中怎么集成使用MyBatis

SpringBoot 中怎么集成使用MyBatis,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了甘肅免費(fèi)建站歡迎大家使用!

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);

     

    如果你的映射方法的形參有多個(gè),這個(gè)注解使用在映射方法的參數(shù)上就能為它們?nèi)∽远x名字。若不給出自定義名字,多參數(shù)則先以 "param" 作前綴,再加上它們的參數(shù)位置作為參數(shù)別名。例如,#{param1}、#{param2},這個(gè)是默認(rèn)值。如果注解是 @Param("person"),那么參數(shù)就會(huì)被命名為 #{person}。

    	@Select("SELECT * FROM users WHERE user_sex = #{user_sex}")
    	List<User> getListByUserSex(@Param("user_sex") String userSex);

     

    需要傳送多個(gè)參數(shù)時(shí),可以考慮使用 Map

    	@Select("SELECT * FROM users WHERE username=#{username} AND user_sex = #	{user_sex}")
    	List<User> getListByNameAndSex(Map<String, Object> map);

     

    最常用的使用方式是直接使用對(duì)象:

    	@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#	{userName}, #{passWord}, #{userSex})")
    	void insert(User user);

    • 使用對(duì)象

    • 使用Map

    • 使用 @Param

    • 先來(lái)介紹一下使用注解版的 MyBatis 如何將參數(shù)傳遞到 SQL 中。

    • 直接使用

  • 注解介紹

注解版最大的特點(diǎn)是具體的 SQL 文件需要寫(xiě)在 Mapper 類(lèi)中,取消了 Mapper 的 XML 配置。上面介紹參數(shù)的時(shí)候,已經(jīng)使用了 @Select、@Delete 等標(biāo)簽,這就是 MyBatis 提供的注解來(lái)取代其 XML 文件配置,下面我們一一介紹。

@Select 注解

//@Select 主要在查詢的時(shí)候使用,查詢類(lèi)的注解,所有的查詢均使用這個(gè),具體如下:
@Select("SELECT * FROM users WHERE user_sex = #{user_sex}")
List<User> getListByUserSex(@Param("user_sex") String userSex);

@Insert 注解

//@Insert,插入數(shù)據(jù)庫(kù)時(shí)使用,直接傳入實(shí)體類(lèi)會(huì)自動(dòng)解析屬性到對(duì)應(yīng)的值,示例如下:
@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 處理數(shù)據(jù)刪除。
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(Long id);

以上就是項(xiàng)目中常用的增、刪、改、查,但有時(shí)候我們有一些特殊的場(chǎng)景需要處理,比如查詢的對(duì)象返回值屬性名和字段名不一致,或者對(duì)象的屬性中使用了枚舉。我們期望查詢的返回結(jié)果可以將此字段自動(dòng)轉(zhuǎn)化為對(duì)應(yīng)的類(lèi)型,MyBatis 提供了另外兩個(gè)注解來(lái)支持:@Results 和 @Result。

@Results 和 @Result 注解; - 這兩個(gè)注解配合來(lái)使用,主要作用是將數(shù)據(jù)庫(kù)中查詢到的數(shù)值轉(zhuǎn)化為具體的字段,修飾返回的結(jié)果集,關(guān)聯(lián)實(shí)體類(lèi)屬性和數(shù)據(jù)庫(kù)字段一一對(duì)應(yīng),如果實(shí)體類(lèi)屬性和數(shù)據(jù)庫(kù)屬性名保持一致,就不需要這個(gè)屬性來(lái)修飾。示例如下:

@Select("SELECT * FROM users")
@Results({
    @Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),
    @Result(property = "nickName", column = "nick_name")
})
List<UserEntity> getAll();

注意,使用 # 符號(hào)和 $ 符號(hào)的不同:,下面兩個(gè)例子可以發(fā)現(xiàn),使用 # 會(huì)對(duì) SQL 進(jìn)行預(yù)處理,使用 $ 時(shí)拼接 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);
  • 動(dòng)態(tài)SQL

MyBatis 最大的特點(diǎn)是可以靈活的支持動(dòng)態(tài) SQL,在注解版中提供了兩種方式來(lái)支持,第一種是使用注解來(lái)實(shí)現(xiàn),另一種是提供 SQL 類(lèi)來(lái)支持。

使用注解來(lái)實(shí)現(xiàn),用 script 標(biāo)簽包圍,然后像 XML 語(yǔ)法一樣書(shū)寫(xiě):

@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 靈活又有注解的方便,但也有一個(gè)缺點(diǎn)需要在 Java 代碼中拼接 XML 語(yǔ)法很不方便,因此 MyBatis 又提供了一種更優(yōu)雅的使用方式來(lái)支持動(dòng)態(tài)構(gòu)建 SQL。

使用 SQL 構(gòu)建類(lèi)來(lái)支持,以分頁(yè)為例進(jìn)行演示,首先定義一個(gè) UserSql 類(lèi),提供方法拼接需要執(zhí)行的 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 中有一個(gè)方法 getList,使用 StringBuffer 對(duì) SQL 進(jìn)行拼接,通過(guò) if 判斷來(lái)動(dòng)態(tài)構(gòu)建 SQL,最后方法返回需要執(zhí)行的 SQL 語(yǔ)句。

  • 接下來(lái)只需要在 Mapper 中引入這個(gè)類(lèi)和方法即可,相對(duì)于 @SelectProvider 提供查詢 SQL 方法導(dǎo)入,還有 @InsertProvider、@UpdateProvider、@DeleteProvider 提供給插入、更新、刪除的時(shí)候使用。

    • type:動(dòng)態(tài)生成 SQL 的類(lèi)

    • method:類(lèi)中具體的方法名

@SelectProvider(type = UserSql.class, method = "getList")
List<UserEntity> getList(UserParam userParam);
  • 結(jié)構(gòu)化SQL

可能你會(huì)覺(jué)得這樣拼接 SQL 很麻煩,SQL 語(yǔ)句太復(fù)雜也比較亂,別著急!MyBatis 給我們提供了一種升級(jí)的方案:結(jié)構(gòu)化 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}");
        }
        //從這個(gè) toString 可以看出,其內(nèi)部使用高效的 StringBuilder 實(shí)現(xiàn) SQL 拼接
    }}.toString();

    log.info("getCount sql is :" +sql);
    return sql;
}

SELECT 表示要查詢的字段,可以寫(xiě)多行,多行的 SELECT 會(huì)智能地進(jìn)行合并而不會(huì)重復(fù)。 FROM 和 WHERE 跟 SELECT 一樣,可以寫(xiě)多個(gè)參數(shù),也可以在多行重復(fù)使用,最終會(huì)智能合并而不會(huì)報(bào)錯(cuò)。這樣語(yǔ)句適用于寫(xiě)很長(zhǎng)的 SQL,且能夠保證 SQL 結(jié)構(gòu)清楚,便于維護(hù)、可讀性高。

  1. 多數(shù)據(jù)源使用

注解版的多數(shù)據(jù)源使用和 XML 版本的多數(shù)據(jù)源基本一致。

  • 首先配置多數(shù)據(jù)源:

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
  • 分別構(gòu)建兩個(gè)不同的數(shù)據(jù)源。

@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。

  • 測(cè)試

分別注入兩個(gè)不同的 Mapper,想操作哪個(gè)數(shù)據(jù)源就使用哪個(gè)數(shù)據(jù)源的 Mapper 進(jìn)行操作處理。

@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));
    }
}

關(guān)于SpringBoot 中怎么集成使用MyBatis問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

網(wǎng)站標(biāo)題:SpringBoot中怎么集成使用MyBatis
分享網(wǎng)址:http://www.chinadenli.net/article36/jcoesg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)云服務(wù)器服務(wù)器托管定制網(wǎng)站企業(yè)網(wǎng)站制作軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名