日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring boot(六):如何优雅的使用mybatis

發布時間:2023/12/3 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring boot(六):如何优雅的使用mybatis 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結


hibernate 和 mybatis 的區別

hibernate的特點是所有的sql都用java代碼生成,不用跳出程序去(看)sql,發展到最頂端就是Spring data jpa了。
mybatis初期使用比較麻煩,需要各種配置文件、實體類、dao層映射關聯、還有一大堆其他配置,初期開發了generator可以根據表結果自動生成實體類、配置文件和dao層代碼;后期進行了大量優化可以使用注解,自動管理dao層和配置文件。發展到最頂端就是 mybatis-Spring-boot-starter 可以完全注解不用配置文件。

使用 mybatis-Spring-boot-starter有兩種方法

  • 無配置文件注解版
    1 添加pom文件;
    2 添加application.propertis相關配置;在啟動類中添加mapper包掃描
    3 開發mapper;
    4 使用;
  • xml版
    1 配置,添加pom文件、application.properties(指定配置文件和映射文件的位置),mybatis-config.xml(配置一些mybatis的基礎參數)
    2 添加類的映射文件(UserMapper)
    3 編寫dao層代碼(這里只需要寫dao層接口,不用寫實現)
    4 使用

如何選擇兩種方法

注解適合快速開發,比如微服務器;
xml適合大型項目

mybatis-Spring-boot-starter


首先,引入mybatis-Spring-boot-starter 的pom文件

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version> </dependency>

接下來,介紹兩種開發模式:

無配置文件注解版

就是一切使用注解搞定

1 添加相關maven文件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency> </dependencies>

2 application.properties 添加相關配置

mybatis.type-aliases-package=com.neo.entityspring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 spring.datasource.username = root spring.datasource.password = root

springboot會自動加載Spring.datasource.XX相關配置,數據源就會自動注入到sqlSessionFactory中,sqlSessionFactory 會自動注入到Mapper中。不用管,直接拿來用。

在啟動類中添加mapper包掃描(“com.neo.mapper”)

@SpringBootApplication @MapperScan("com.neo.mapper") //添加mapper包掃描 public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }

也可以直接在Mapper類上添加主角@Mapper,建議使用上面那種,不然每個Mapper都要加注解。

3 開發Mapper
這是最關鍵的一步, sql生產都在這里

public interface UserMapper {@Select("SELECT * FROM users")@Results({@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),@Result(property = "nickName", column = "nick_name") }) //為更接近生產,user_sex、nick_name 兩個屬性在數據庫加了下劃線和實體類屬性名不一致,另外user_sex使用了枚舉。List<UserEntity> getAll();@Select("SELECT * FROM users WHERE id = #{id}")@Results({@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),@Result(property = "nickName", column = "nick_name")})UserEntity getOne(Long id);@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")void insert(UserEntity user);@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")void update(UserEntity user);@Delete("DELETE FROM users WHERE id =#{id}")void delete(Long id);}

為更接近生產,user_sex、nick_name 兩個屬性在數據庫加了下劃線和實體類屬性名不一致,另外user_sex使用了枚舉。

@Select 是查詢類的注解,所有的查詢均使用這個。
@Result 修飾返回的結果集,關聯實體類屬性和數據庫字段——一一對應,如果實體類屬性和數據庫屬性名保持一致,就不需要這個屬性來修飾。
@Insert 插入數據庫使用,直接傳入實體類會自動解析屬性到對應的值
@Update 負責修改,也可以傳入對象。
@Delete 負責刪除

了解更多屬性參考這里
以上是簡單的查詢,下面的博客介紹復雜查詢
連表查詢:SpringBoot使用Mybatis注解進行一對多和多對多查詢
分頁查詢:SpringBoot集成MyBatis的分頁插件PageHelper(PageHelper使用了攔截器的原理實現分頁);Mybatis使用pageHelper分頁插件原理

注意,使用#符號和$符號的不同:

#{}:占位符號,好處防止sql注入
${}:sql拼接符號

動態sql是mybatis的強大特性之一,也是它優于其他ORM框架的一個重要原因。mybatis在對sql語句進行預編譯之前,會對sql進行動態解析,解析為一個BoundSql 對象,也是在此處對sql 進行處理的。在動態SQL解析階段,#{}和 ${}會有不同的表現。
用法:

  • 能用#{}的地方就用#{}
    首先是性能考慮,相同編譯的sql可以重復利用。,其次,使用 ${} 在編譯之前被變量替換,會存在sql注入問題;
    sql注入問題:
    select * from ${tablename} where name = #{name};
    //若tablename 為 user; delete user; – ,在動態解析階段,預編譯之前 sql將變為
    select * from user;delect user; – where name = ?;
  • 表名作為變量時,必須使用${}
    這是因為,表名是字符串,使用sql占位符替換字符串會帶上單引號‘’,這會導致sql語法錯誤,例如:

這里有一篇很好的文章解釋了這個問題:【#和$】MyBatis中 #和 $的區別

4 使用
上面散步就基本完成了dao層開發,使用的時候當作普通的類注入就可以了

@RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest {@Autowiredprivate UserMapper UserMapper;@Testpublic void testInsert() throws Exception {UserMapper.insert(new UserEntity("aa", "a123456", UserSexEnum.MAN));UserMapper.insert(new UserEntity("bb", "b123456", UserSexEnum.WOMAN));UserMapper.insert(new UserEntity("cc", "b123456", UserSexEnum.WOMAN));Assert.assertEquals(3, UserMapper.getAll().size());}@Testpublic void testQuery() throws Exception {List<UserEntity> users = UserMapper.getAll();System.out.println(users.toString());}@Testpublic void testUpdate() throws Exception {UserEntity user = UserMapper.getOne(3l);System.out.println(user.toString());user.setNickName("neo");UserMapper.update(user);Assert.assertTrue(("neo".equals(UserMapper.getOne(3l).getNickName())));} }

源碼中controler層有完整的增刪改查,這里就不貼了
源碼在這里spring-boot-mybatis-annotation

極簡xml版本

極簡xml 版本保持映射文件的老傳統,優化主要體現在不需要實現dao的實現層,系統會自動根據方法名在映射文件中找對應的sql。
1 配置
pom文件和上個版本一樣,只是application.properties新增以下配置

mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

指定了mybatis 基礎配置文件和實體類映射文件的地址。

mybatis-config.xml配置

<configuration><typeAliases><typeAlias alias="Integer" type="java.lang.Integer" /><typeAlias alias="Long" type="java.lang.Long" /><typeAlias alias="HashMap" type="java.util.HashMap" /><typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" /><typeAlias alias="ArrayList" type="java.util.ArrayList" /><typeAlias alias="LinkedList" type="java.util.LinkedList" /></typeAliases> </configuration>

這里也可以添加一些mybatis基礎的配置

2 添加User的配置文件

<mapper namespace="com.neo.mapper.UserMapper" ><resultMap id="BaseResultMap" type="com.neo.entity.UserEntity" ><id column="id" property="id" jdbcType="BIGINT" /><result column="userName" property="userName" jdbcType="VARCHAR" /><result column="passWord" property="passWord" jdbcType="VARCHAR" /><result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum"/><result column="nick_name" property="nickName" jdbcType="VARCHAR" /></resultMap><sql id="Base_Column_List" >id, userName, passWord, user_sex, nick_name</sql><select id="getAll" resultMap="BaseResultMap" >SELECT <include refid="Base_Column_List" />FROM users</select><select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap" >SELECT <include refid="Base_Column_List" />FROM usersWHERE id = #{id}</select><insert id="insert" parameterType="com.neo.entity.UserEntity" >INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})</insert><update id="update" parameterType="com.neo.entity.UserEntity" >UPDATE users SET <if test="userName != null">userName = #{userName},</if> <!-- 條件 --><if test="passWord != null">passWord = #{passWord},</if>nick_name = #{nickName}WHERE id = #{id}</update><delete id="delete" parameterType="java.lang.Long" >DELETE FROMusers WHERE id =#{id}</delete> </mapper>

其實就是把上個版本中mapper的sql搬到了這里

3 編寫dao層代碼

public interface UserMapper {List<UserEntity> getAll();UserEntity getOne(Long id);void insert(UserEntity user);void update(UserEntity user);void delete(Long id);}

對比上一步這里全部只剩下接口方法。

4 使用
使用和上個版本沒有區別。
代碼:xml配置版本

如何選擇兩種模式

兩種模式各有特點,注解版適合簡單快速的模式,其實像現在流行的這種微服務器模式,一個微服務就會對應一個自己的數據庫,多表連接查詢的需求會大大的降低,會越來越適合這種模式。

老傳統模式比較適合大型項目,可以靈活的動態生成sql,方便調整sql,也有痛痛快快,洋洋灑灑寫sql的感覺。

完整代碼地址


作者:純潔的微笑
出處:http://www.ityouknow.com/
版權所有,歡迎保留原文鏈接進行轉載:)

總結

以上是生活随笔為你收集整理的Spring boot(六):如何优雅的使用mybatis的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。