javascript
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 = rootspringboot會自動加載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生產都在這里
為更接近生產,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層開發,使用的時候當作普通的類注入就可以了
源碼中controler層有完整的增刪改查,這里就不貼了
源碼在這里spring-boot-mybatis-annotation
極簡xml版本
極簡xml 版本保持映射文件的老傳統,優化主要體現在不需要實現dao的實現層,系統會自動根據方法名在映射文件中找對應的sql。
1 配置
pom文件和上個版本一樣,只是application.properties新增以下配置
指定了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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10时钟不读秒?这么做一目了然
- 下一篇: gradle idea java ssm