文章目錄
- 1 環境搭建
- 1.1 創建一個maven的project
- 1.2 pom.xml文件導入web開發依賴
- 1.3 創建SpringBoot項目的主程序入口
- 2 代碼生成器
- 3 配置數據庫
- 4 導入前端頁面
- 5 開始前端控制器的編碼
- 5.1 wrapper構造器
??mybatis-plus(簡稱 MP)是一個 MyBatis的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
1 環境搭建
1.1 創建一個maven的project
1.2 pom.xml文件導入web開發依賴
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version>
</parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.3 創建SpringBoot項目的主程序入口
@SpringBootApplication
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class, args);}
}
2 代碼生成器
??顧名思義,代碼生成器就是用來直接生成代碼的一個程序。首先導入相關依賴
<!--Mybatis-Plus生成器依賴-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.1.tmp</version>
</dependency><!--freemarker 模板引擎(沒有用原生的模板引擎)-->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version>
</dependency>
??生成的代碼需要使用lombok簡化實體類開發導入相關依賴
<!--lombok簡化實體類開發,如果之前沒有下載過依賴的同名插件的話需要下載安裝,然后重啟一下idea-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
??創建utils包,拷貝代碼生成器,需要修改的兩個地方:數據庫連接的數據庫名、項目目錄名。運行main方法,報錯java.lang.ClassNotFoundException:com.mysql.jdbc.Driver,沒有驅動,需要導入數據庫連接依賴
<!--數據庫連接驅動-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version>
</dependency>
??生成成功之后,mapper層的接口上加@mapper注解或者在主程序入口出添加,簡單說一下service的方法都從哪里來,也就是Ctrl進源碼看他繼承方法內部又實現的接口里定義了后面需要使用到的所有方法。
3 配置數據庫
導入mybatis-plus的場景啟動器
<!--mybatis-plus的場景啟動器 內置了jdbc的啟動器無需重復引用-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
resources目錄下創建配置文件application.yml,配置數據庫的相關信息
server:# 修改后端項目運行時的端口號信息port: 8888spring:# 配置數據源信息datasource:url: jdbc:mysql://localhost:3306/musicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
??上面使用到了pool(池子),數據庫連接池也就是數據源,所謂的數據庫連接池從字面意思上翻譯就是將數據庫連接放到一個池子里。相比之前的好處就是只需要創建一次連接,后面的都直接用不用一次次創建。數據源使用到了Druid的,需要導入Druid的依賴
<!--整合druid的數據源-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version>
</dependency>
4 導入前端頁面
??resources目錄下創建templates文件夾,將前端頁面導入。由于SpringBoot默認的打包方式是jar包,但是JSP不支持在jar包(一種壓縮包)中編譯,所以SpringBoot默認不支持JSP,于是我們需要引入第三方的模板引擎技術——Thymeleaf實現頁面的渲染。
導入thymeleaf引擎的場景啟動器
<!--thymeleaf引擎的場景啟動器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
5 開始前端控制器的編碼
復制controller層的框架整體,和前端進行交互的頁面
@RequestMapping("/queryAll")
public List<Singer> queryAll() {// 先演示普通的查詢,再逆序查詢return null;
}@RequestMapping("/queryByName")
public List<Singer> queryByName(String name) {// 使用lambdaQueryWrapper 的like方法模糊查詢// list方法查詢到所有的符合條件值并返回return null;
}@PostMapping("/save")
public String save(HttpServletRequest request) {Singer singer = new Singer();singer.setName(request.getParameter("name")).setSex(Integer.parseInt(request.getParameter("sex"))).setPic(request.getParameter("pic")).setBirth(new Date()).setLocation(request.getParameter("location")).setIntroduction(request.getParameter("introduction"));// 調用save方法,并判斷返回值的正誤,返回前端對應的字符串return null;
}@RequestMapping("/update")
public String update(int id, String introduction) {// 使用eq和set去設置條件構造器// 調用update傳入條件構造器,并判斷返回值的正誤,返回前端對應的字符串return null;
}@RequestMapping("/delete")
public String delete(Integer id) {// 調用removeById方法直接刪return null;
}
??SQL語句是數據持久化技術的核心,jdbc使用String字符串拼接SQL語句;mybatis使用xml映射文件在標簽里編寫SQL語句;但是,MP無需使用SQL語句(一些復雜的業務可以使用SQL語句來完成),直接調用方法即可在框架的底層實現SQL語句的拼接和執行。
??在這里來查看一下mp的官方開發文檔,大概講一下幾個方法的大概用處,然后摁住Ctrl查看源碼,知道為什么可以使用這些方法完成相應的功能。
首先是注入SingerService對象
@Autowired
private SingerService service;
??這里的用法是spring框架的控制反轉,即將設計好的類對象注冊進spring的IOC容器中將對象的控制權交給容器,當需要使用的時候就使用@Autowired注解讓容器創建一個對象出來使用。完成的作用相當于使用new的方式調用類的構造器創建一個對象
查詢所有的記錄
@RequestMapping("/queryAll")
public List<Singer> queryAll() {List<Singer> singers = service.list();return singers;
}
??逆序查詢的話就需要在SQL語句拼接order by id desc,這個拼接條件的功能就需要使用wrapper構造器來完成了
5.1 wrapper構造器
??總而言之,wrapper構造器的作用就是用來拼裝where,order by等條件語句的作用,如果你的增刪改查無需條件的話,可以不用wrapper,但凡需要使用SQL語句需要拼接條件的話就需要使用wrapper。更加具體的wrapper案例分析參考博客wrapper構造器的簡要案例分析
逆序查詢所有記錄的方法
逆序查詢所有
http://localhost:8888/singer/queryAll
@RequestMapping("/queryAll")
public List<Singer> queryAll() {LambdaQueryWrapper<Singer> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.orderByDesc(Singer::getId);List<Singer> singers = service.list(lambdaQueryWrapper);return singers;
}
按照id查詢
按照id查詢
http://localhost:8888/singer/queryByName?name=王
@RequestMapping("/queryByName")
public List<Singer> queryByName(String name) {LambdaQueryWrapper<Singer> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.like(Singer::getName,name);List<Singer> singers = service.list(lambdaQueryWrapper);return singers;
}
編寫添加記錄的方法
@PostMapping("/save")
public String save(HttpServletRequest request) {Singer singer = new Singer();singer.setName(request.getParameter("name")).setSex(Integer.parseInt(request.getParameter("sex"))).setPic(request.getParameter("pic")).setBirth(new Date()).setLocation(request.getParameter("location")).setIntroduction(request.getParameter("introduction"));boolean save = service.save(singer);String result = save == true ? "添加成功" : "添加失敗";return result;}
修改方法
修改
http://localhost:8888/singer/update?id=64&introduction=歌聲甜美
@RequestMapping("/update")
public String update(int id, String introduction, HttpServletRequest request) {LambdaUpdateWrapper<Singer> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.eq(Singer::getId,id).set(Singer::getIntroduction,introduction);boolean update = service.update(lambdaUpdateWrapper);String result = update == true ? "修改成功" : "修改失敗";return result;
}
刪除方法
刪除
http://localhost:8888/singer/delete?id=64
@RequestMapping("/delete")
public String delete(Integer id) {boolean remove = service.removeById(id);String result = remove == true ? "刪除成功" : "刪除失敗";return result;}