根據上圖所示,idea中我們有7個比較重要的模組需要建立
(1)controller套件:如果學習過或對SpringMVC有所了解的小伙伴,肯定知道,controller是控制層,相當於我們的接收瀏覽器信息並響應發送相關信息的地方,具體的還結合計算機網絡相關知識,了解在瀏覽器中如何接收訊息,並如何回應訊息,在controller控制層下我們實現相關數據操縱(此處特別鳴謝我研究生生涯階段的師兄給我講解了很久關於Web編程方面的知識,收益良多。希望大家利用相關時間,多去查詢資料和相關視頻進行學習);
(2)entity包:這裡存放我們的實體類,跟單純學java裡面建立類一模一樣,沒有區別;
(3)mapper包:SpringMVC中稱為持久層也就是(DAO層(資料存取物件)),這裡可以直接對資料庫進行操作,一般與第五個套件mapping套件連用;
(4)service:SpringMVC中稱之為業務邏輯層,所以這裡存放的類別都是處理相關的業務邏輯;
(5)mapping包:放在resources下面作為classpath,存放的mybatis文件,因為現在的SpringBoot集成性很強,把很多配置文件都可以放在一塊,就算是沒有太多的mybatis基礎的小夥伴也可以學習。之所以說mapper套件與mapping套件是一起連用,是因為它們形成映射關係,它們兩的結合使用來存取我們的資料庫檔案;
(6)application.yml:作為全域預設設定文件,適用於整個項目,要整合我們這麼多的配置信息,這個配置文件肯定少不了(此處最好是使用yaml語言編寫配置文件,因為編寫相對而言簡單明朗一些);
(7)application-dev.yml :這個算是具體某個環境的配置文件,具體要結合我們的實際項目。因為專案本身不只是開發環境,還有測試、生產等一系列環境。當我們做開發是用開發的環境配置application-dev.yml,當我們做測試的時候用測試的環境配置application-test.yml,當我們做生產的時候用的是生產的環境配置application-pro. yml。目前我們暫時只說開發環境,所以就只用到了一個設定檔application-dev.yml。具體的某個環境配置資訊在使用時會覆寫applicaiton.yml的預設配置,所以,不用擔心預設配置中的語句與環境配置中的語句發生衝突。
每個java程式都有程式入口,DemoApplication本身在我們初始化SpringBoot時就已經存在了,我們在這裡不需要做過多的設定。
package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan("com.example.demo.mapper") @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
●@SpringBootApplication註解:是用來表示這是一個springboot專案的啟動項類,目的是開啟自動配置(其實它是繼承於Configuration配置類,深解需要大家去剖析SpringBoot的原理)
●@MapperScan(「com.example.demo.mapper」)是為了掃描我們的mapper文件,進行有效存取相關資料庫檔案URL映射(這個註解的作用很大!)
●對應的sql建立表格語句如下所示:
CREATE TABLE `water` ( `id` int NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `salary` double(10,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_unicode_ci;
package com.example.demo.entity; /** * @description: 实体类 * @author: Fish_Vast * @Date: 2021/8/25 * @version: 1.0 */ public class User { private String name; private Integer id; private Double salary; public User() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", id=" + id + ", salary=" + salary + '}'; } }
●這裡想必大家不會陌生,這是純Java基礎都能編寫出來的類,建立三個私有屬性,一個空參建構器,對應的get、set方法,也重寫了一個toString()方法。這裡值得注意的點是在聲明屬性時,最好是使用包裝類別進行聲明。
●在Java中跟mybatis相關的讀取與錄入,為何盡量使用包裝類別而不使用基本資料型別呢?
①在MySQL中沒有給字段賦值預設為null,當你從資料庫中查出來也是null,如果該字段在對應的Java代碼中是int類型,null不能對應int類型,因為int代表的是基本資料類型,只能是基本的數字。
②實體類別的屬性可以給它賦值也可以不給它賦值,當你不給它賦值時,它擁有預設值,例如int的預設值就為0。但是主動為它設定值為0與它預設為0是兩個不同的概念。例如,一班的成績:0代表某學生分數為0,而null代表這個學生該門考試沒有成績,這是兩個不同的概念。
package com.example.demo.mapper; import com.example.demo.entity.User; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface UserMapper { //1.通过id查询用户信息 User getUser(int id); //2.通过id删除用户信息 int delete(int id); //3.更改用户信息 int update(User user); //4.插入用户信息 int save(User user); //5.查询所有用户信息 List<User> selectAll(); }
●@Repository,注解它本身的作用便是标注数据访问组件,作为DAO对象,它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。通过这个注解能够报出更多发现不了的错误,更有利于对项目的维护和开发。其实@Repository不在接口上进行注明,我们的程序照样可以运行,因为在我们使用@MapperScan的时候,我们已经将我们的接口交给框架中的代理类,所以即便是我们不写,程序不会报错,只是我们在Service层写明接口的时候,IDEA会给出红色的波浪线。可以这样理解,标注@Repository是为了告诉编译器我将接口注入到了IoC容器了,你不要报错啦~
●相应地,写出增删查改和查询全部信息的五个方法。
<?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="com.example.demo.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.demo.entity.User"> <result column="id" jdbcType="INTEGER" property="id" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="salary" jdbcType="DOUBLE" property="salary" /> </resultMap> <!--查询用户信息--> <select id="getUser" resultType="com.example.demo.entity.User"> select * from water where id = #{id} </select> <!--删除用户信息--> <delete id="delete" parameterType="int"> delete from water where id=#{id} </delete> <!--返回所有用户信息--> <select id="selectAll" resultType="com.example.demo.entity.User"> select * from water </select> <!--增加用户信息--> <insert id="save" parameterType="com.example.demo.entity.User" > insert into water <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > id, </if> <if test="name != null" > name, </if> <if test="salary != null" > salary, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=INTEGER}, </if> <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="salary != null" > #{salary,jdbcType=DOUBLE}, </if> </trim> </insert> <!--根据id更改用户信息--> <update id="update" parameterType="com.example.demo.entity.User"> update water <set > <if test="name != null" > name = #{name,jdbcType=VARCHAR}, </if> <if test="salary != null" > salary = #{salary,jdbcType=DOUBLE}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> </mapper>
●mapper namespace用于绑定mapper接口的,当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句(通过mapper方法名进行绑定);
●resultMap 定义了一个id为BaseResultMap的标识,type代表使用哪种类作为我们所要映射的类;
●
package com.example.demo.service; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @description: 实现类,对进行相关的业务逻辑 * @author: Fish_Vast * @Date: 2021/8/25 * @version: 1.0 */ @Service public class UserService { @Autowired private UserMapper userMapper; public User getUser(int id){ return userMapper.getUser(id); } public int delete(int id){ return userMapper.delete(id); } public int update(User user){ return userMapper.update(user); } public int save(User user){ return userMapper.save(user); } public List<User> selectAll(){ return userMapper.selectAll(); } }
●这里我特别说明一下,private UserMapper userMapper既可以当做是引用数据类型,也可以作为接口对象进行使用,这里我们当接口对象使用(初次接触的时候肯定对这个会有些许疑问,很正常,因为我当时对于这个接口也纠结了很久哦);
●@Service表示我们在业务逻辑层进行操纵,属于自动配置的环节;
●相应的五个方法,通过对象得到相应返回值给UserMapper接口。
package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.xml.ws.Service; import java.util.List; /** * @description: 控制器,接收并响应相关信息 * @author: Fish_Vast * @Date: 2021/8/25 * @version: 1.0 */ @RestController @RequestMapping("/seven") public class UserController { @Autowired private UserService userService; //通过id得到用户信息 @RequestMapping(value = "/getUser/{id}", method = RequestMethod.GET) public String getUser(@PathVariable int id){ return userService.getUser(id).toString(); } //通过id删除用户信息 @RequestMapping(value = "/delete", method = RequestMethod.GET) public String delete(int id){ int result = userService.delete(id); if(result >= 1){ return "删除成功!"; }else{ return "删除失败!"; } } //更改用户信息 @RequestMapping(value = "/update", method = RequestMethod.GET) public String update(User user){ int result = userService.update(user); if(result >= 1){ return "更新成功!"; }else{ return "更新失败!"; } } //插入用户信息 @RequestMapping(value = "/insert", method = RequestMethod.GET) public int insert(User user){ return userService.save(user); } //查询所有用户的信息 @RequestMapping(value = "/selectAll") @ResponseBody //理解为:单独作为响应体,这里不调用实体类的toString方法 public List<User> listUser(){ return userService.selectAll(); } }
●@RestController注解:就表示我们在控制层模块。控制层是作为SpringMVC最重要的一个环节,进行前端请求的处理,转发,重定向,还包括调用Service方法;
●@RequestMapping注解:处理请求和控制器方法之间的映射关系;
●@ResponseBody注解:将返回的数据结构转换为JSON格式响应到浏览器(这里说得比较笼统,只是简单滴给大家说明一下,水平还不够,认识还不深,不到之处还请见谅!);
●更多的注解解释,还需要大家多去学习一下SpringMVC和SpringBoot,这里面会详细地介绍,在这里我只是做了很粗略的说明而已(本人也是正接触不久,正在努力学习当中)。
(8)配置application.yml文件
spring: profiles: active: dev
●语句很简单,指明我们要使用的开发环境配置文件
#服务器端口配置 server: port: 8081 #数据库配置 spring: datasource: username: 数据库名称 password: 账号密码 url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&nullCatalogMeansCurrent=true&useSSL=true&&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver #mybatis配置 mybatis: mapper-locations: classpath:mapping/*.xml type-aliases-package: com.example.demo.entity #showSQL logging: level: com.example.demo.entity: debug
●在开发配置文件当中,我们配置好我们的服务器端口号、数据库的配置、mybatis的配置和如何展示我们的Sql;
●其中要注意的是,数据库的配置中的username和password使用我们安装MySQL数据库时使用的账号名称和密码,url中的3306/紧跟着我们的数据库名称,如果建立的数据库名称不一致,也需要进行修改。
通过以上9个步骤,我们从第(1)个步骤程序入口处点击运行按钮,在浏览器中输入相应指令即可得到不同的展示信息:(到这一步,大概知道为啥要使用@MapperScan注解了吧,可以直接将扫描到的包文件交到代理类中,SpringBoot就是很人性化的框架!)
①查询操作:http://localhost:8081/seven/getUser/1
②删除操作:http://localhost:8081/seven/delete?id=14
③更改操作:http://localhost:8081/seven/update?id=1&name=小丸子&salary=12000
#④插入操作:http://localhost:8081/seven/insert?id=15&name=浩子&salary=13000
#⑤查詢全部使用者資訊:http:/ /localhost:8081/seven/selectAll
以上是Java之SpringBoot怎麼實現基本增刪改查的詳細內容。更多資訊請關注PHP中文網其他相關文章!