위 그림과 같이 아이디어에 중요한 7개의 모듈을 구축해보겠습니다
(1) 컨트롤러 패키지: SpringMVC에 대해 공부했거나 알고 있다면 컨트롤러가 컨트롤 레이어라는 것을 알아야 합니다. 이는 브라우저 정보를 수신하고 관련 정보를 전송하기 위해 응답하는 장소와 동일합니다. 특히, 브라우저에서 정보를 수신하는 방법과 정보에 응답하는 방법을 이해하기 위해 컴퓨터 네트워크 관련 지식도 결합합니다. 관련 데이터 조작 구현 (오랫동안 웹 프로그래밍을 가르쳐 주신 대학원 선배님에게 특별한 감사의 말씀을 전하고 싶습니다. 덕분에 많은 도움이 되었습니다. 관련 시간을 활용하여 더 많은 정보를 확인하시기 바랍니다.
(2) 엔터티 패키지: 여기에 저장됩니다. 단순히 Java에서 클래스를 만드는 방법을 배우는 것과 똑같습니다.
(3) 매퍼 패키지라고 합니다. SpringMVC의 지속성 레이어(DAO 레이어(데이터 액세스 객체))는 여기에서 찾을 수 있습니다. 데이터베이스를 직접 운영하며 일반적으로 다섯 번째 패키지인 매핑 패키지와 함께 사용됩니다.
(4) 서비스 패키지: 비즈니스 로직이라고 합니다. Spring MVC의 레이어이므로 여기에 저장된 클래스는 모두 관련 비즈니스 로직 처리와 관련되어 있습니다.
(5) 매핑 패키지: 리소스 아래에 클래스 경로로 넣고 mybatis 파일을 저장합니다. 이제 SpringBoot는 매우 통합되어 있으므로 많은 구성 파일을 넣을 수 있습니다. 마이바티스 파운데이션이 많지 않은 친구들도 함께 배울 수 있습니다. 매퍼 패키지와 매핑 패키지를 함께 사용하는 이유는 매핑 관계를 형성하고, 데이터베이스 파일에 액세스하기 위해 함께 사용되기 때문입니다.
(6) application.yml: 전역 기본 구성 파일로 적용됩니다. 많은 구성 정보를 전체 프로젝트에 통합하려면 이 구성 파일이 반드시 필요합니다. 작성이 비교적 간단하고 명확하기 때문에 여기에서 구성 파일을 작성하려면 yaml 언어를 사용하는 것이 가장 좋습니다. application-dev.yml: 특정 환경의 구성 파일을 실제 프로젝트와 결합해야 하는 것으로 간주됩니다. 프로젝트 자체가 개발 환경일 뿐만 아니라 테스트, 프로덕션 등 일련의 환경이기 때문입니다. 개발을 할 때는 개발 환경을 사용하여 application-dev.yml을 구성하고, 테스트를 할 때는 테스트 환경을 사용하여 application-test.yml을 구성합니다. pro.yml. 현재는 개발 환경에 대해서만 이야기하고 있으므로 하나의 구성 파일인 application-dev.yml만 사용합니다. 특정 환경 구성 정보는 사용 시 application.yml의 기본 구성을 재정의하므로 기본 구성 문과 환경 구성 문 간의 충돌을 걱정할 필요가 없습니다.
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 구성 클래스에서 상속됩니다. 이해하려면
●@MapperScan("com.example.demo.mapper")은 매퍼 파일을 스캔하고 관련 데이터베이스 파일 URL 매핑에 효과적으로 액세스하는 것입니다(이 주석은 매우 유용합니다! )
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;(3) User 엔터티 클래스 생성
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를 기반으로 작성될 수 있습니다. 클래스는 세 개의 전용 속성, null 매개변수 생성자, 해당 get 및 set 메서드를 생성하고 toString() 메서드도 재정의합니다. 여기서 주목할 만한 점은 속성을 선언할 때 래퍼 클래스를 사용하여 선언하는 것이 가장 좋다는 것입니다.
●Java에서 mybatis 관련 읽기 및 입력 시 기본 데이터 유형 대신 패키징 클래스를 사용하려는 이유는 무엇입니까?
① MySQL에서 필드에 값이 할당되지 않은 경우 기본값은 null입니다. 데이터베이스에서 확인하면 해당 Java 코드에서 필드가 int 유형인 경우 null이 int에 해당할 수 없습니다. type은 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=小 Maruko&salary=12000
④삽입 작업: http://localhost:8081/seven/insert?id=15&name =Haozi&salary=13000
⑤ 모든 사용자 정보 조회: http://localhost:8081/seven/selectAll
위 내용은 Java에서 SpringBoot의 기본 추가, 삭제, 수정 및 쿼리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!