MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄
maven框架,存在問題:
對用不同業務來說,他的CRUD操作類型基本上都是以上的步驟,只有如下部分是不一樣的:
可以看出少量的代碼真正用于業務功能,大部分的代碼都是樣板代碼。不過,這些樣板代碼非常重要,清理資源和處理錯誤確保了數據訪問的健壯性,避免了資源的泄露。
解決方案
框架會采用第三種解決方案,自動的生成樣板代碼,我們只需要提供 sql ,要替換占位符的數據,返回結果集要轉換的 java 類型
ORM(Object Relational Mapping),即對象關系映射。在面向對象編程語言中,將關系型數據庫中的數據與對象建立起映射關系,進而自動的完成數據與對象的互相轉換:
ORM 把數據庫映射為對象:
數據庫表(table)–> 類(class)
記錄(record,行數據)–> 對象(object)
字段(field) --> 對象的屬性(attribute)
常見的ORM框架有Mybatis和Hibernate
Mybatis
Mybatis是一種典型的半自動的 ORM 框架,所謂的半自動,是因為還需要手動的寫 SQL 語句,再由框
架根據 SQL 及 傳入數據來組裝為要執行的 SQL。其優點為:
Hibernate
Hibernate是一種典型的全自動 ORM 框架,所謂的全自動,是 SQL 語句都不用在編寫,基于框架的
API,可以將對象自動的組裝為要執行的 SQL 語句。其優點為:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 默認使用的Spring Framework版本為5.2.10.RELEASE --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>mybatis-study</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.8</java.version></properties><dependencies><!-- spring-boot-starter-web: 基于SpringBoot開發的依賴包,會再次依賴spring-framework中基本依賴包,aop相關依賴包,web相關依賴包,還會引入其他如json,tomcat,validation等依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除tomcat依賴 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- 添加 Undertow 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><!--引入AOP依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mybatis-spring-boot-starter: Mybatis框架在SpringBoot中集成的依賴包,Mybatis是一種數據庫對象關系映射Object-Relationl Mapping(ORM)框架,其他還有如Hibernate等 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!-- Mybatis代碼生成工具 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency><!-- druid-spring-boot-starter: 阿里Druid數據庫連接池,同樣的運行時需要 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.3</version></dependency><!-- JDBC:mysql驅動包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version><scope>runtime</scope></dependency><!-- spring-boot-devtools: SpringBoot的熱部署依賴包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!-- 不能被其它模塊繼承,如果多個子模塊可以去掉 --><optional>true</optional></dependency><!-- lombok: 簡化bean代碼的框架 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- spring-boot-starter-test: SpringBoot測試框架 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><!-- SpringBoot的maven打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 明確指定一些插件的版本,以免受到 maven 版本的影響 --><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version></plugin><plugin><artifactId>maven-resources-plugin</artifactId><version>3.1.0</version></plugin><plugin><artifactId>maven-site-plugin</artifactId><version>3.3</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build></project>
drop database if exists mybatis_study;
create database mybatis_study character set utf8mb4;use mybatis_study;drop table if exists user;
create table user(id int primary key auto_increment,username varchar(20) not null unique comment '賬號',password varchar(20) not null comment '密碼',nickname varchar(20) comment '用戶昵稱',sex bit default 0 comment '性別,0/false為女,1/true為男',birthday date comment '生日',head varchar(50) comment '頭像地址',create_time timestamp default now() comment '創建日期,默認為插入時的日期'
) comment '用戶表';insert into user(username, password) values ('a1', '11');
insert into user(username, password) values ('a2', '12');
insert into user(username, password) values ('b', '2');
insert into user(username, password) values ('c', '3');
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
debug=true
# 設置打印日志的級別,及打印sql語句
#日志級別:trace,debug,info,warn,error
#基本日志
logging.level.root=INFO
#掃描的包并按debug日志級別打印:druid.sql.Statement類和org.example包
logging.level.druid.sql.Statement=DEBUG
logging.level.org.example=DEBUG#數據庫連接池配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=******#指定Mybatis表和實體映射關系xml配置文件,包含表與實體的映射,字段和屬性的映射,及各個sql語句
mybatis.mapper-locations=classpath:mapper/**Mapper.xml
6. 最后運行Spring啟動類,不報即可
需要根據數據庫表建立 Java類,表中的每個字段需要對應類中的屬性。之后會在 Mybatis 的映射文件中配置字段與屬性的映射關系。
這部分實體類對象,對應以前面圖中綠色的兩個部分,一般會以如下方式呈現:
這部分對應以上圖中淡黃色的部分:由開發人員提供執行SQL的接口,框架會自動為接口生成代理類,
代理類中會包含模版方法的代碼邏輯
在 org.example.mapper 包下創建的用戶類的 Mybatis 映射 Mapper 接口:
注意接口需要使用注解 @Mapper 及 @Component 。在SpringBoot啟動后,SpringBoot會自動掃描到啟
動類包下的注解類,且Mybatis框架會進一步完成生成代理類的工作。
@Mapper
@Component
public interface UserMapper {User selectById(Integer id);
}
所以可以在 src/main/resources 下新建 mapper 文件夾,并創建文章類的映射文件UserMapper(這個名字最好和Mapper接口類中的UserMapper一致)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.UserMapper"><resultMap id="Basespace" type="org.example.model.User"><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/></resultMap></mapper>
之后還需要在 Mybatis 映射文件中配置 SQL,需要配置在mapper>標簽下,與<resultMap標簽同級
對 CRUD 操作來說,每個不同類型的操作都有對應的標簽
<select id="selectById" parameterType="java.lang.Integer"resultMap="BaseResultMap">select * from User where id=#{id}</select>
注意:
//指定為Spring環境中的單元測試
@RunWith(SpringRunner.class)
//指定為SpringBoot環境的單元測試,Application為啟動類
@SpringBootTest(classes = Application.class)
//使用事務,在SpringBoot的單元測試中會自動回滾
@Transactional
public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void selectByIdTest(){User user = userMapper.selectById(1);System.out.println(user);}
}
執行結果:
當接收多個方法參數時,xml 映射文件中的 sql 配置不能再使用 parameterType 屬性,需要在方法參
數上使用 @Param(“參數的名稱”) ,之后在 sql 中使用 #{參數的名稱} 的方式來替換占位符。
@Mapper//啟動時會掃描該注解的接口,動態生成代理類
@Component
public interface UserMapper {User selectById(Integer id);int insert(User user);List<User> selectLike(@Param("username") String username,@Param("password") String password);
}
User.xml映射文件的配置
<select id="selectLike" resultMap="BaseResultMap">select * from user whereusername like #{username} and password like #{password}</select>
單元測試類1
例如這里模糊匹配username為“a”開頭的,password為“1”開頭的
@Testpublic void selectLikeTest(){String username = "a%";String password = "1%";List<User> users = userMapper.selectLike(username,password);System.out.println(users);}
運行結果
例如上述示例,假如我們模糊查詢出來的數據想讓它進行降序排序,那么我們要怎么做呢?
對于 #{參數} 的使用來說,如果參數是字符串,在替換占位符時,會在 sql 語句中加上單引號。如果是不能使用單引號的字符串,例如 sql 語句是 order by 字段 {傳入參數} ,此時 {傳入參數} 就需要使用 ${傳入參數} 這樣的占位符,替換時不會帶上單引號。
示例:在以上模糊查詢語句中,加上根據文章標題排序的功能,要求是根據方法參數傳入的字符串 asc 或 desc 來排序
@Mapper//啟動時會掃描該注解的接口,動態生成代理類
@Component
public interface UserMapper {User selectById(Integer id);int insert(User user);List<User> selectLike(@Param("username") String username,@Param("password") String password,@Param("orderBy") String orderBy);
}
<select id="selectLike" resultMap="BaseResultMap">select * from user whereusername like #{username} and password like #{password}order by password ${orderBy}</select>
@Testpublic void selectLikeTest(){String username = "a%";String password = "1%";List<User> users = userMapper.selectLike(username,password,"desc");System.out.println(users);}
}
在之前插入數據時,如果是自增主鍵,插入后無法獲取到。此時需要在 Mybatis 映射文件中,insert標簽配置如下屬性
<insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user(username,password,nickname,sex,birthday,head)values (#{username},#{password},#{nickname},#{sex},#{birthday},#{head})</insert>
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态