IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 后端开发需要解决的问题(数据建模上和业务上)(三) -> 正文阅读

[Java知识库]后端开发需要解决的问题(数据建模上和业务上)(三)

一、数据建模(提供表来存储数据)

目前我们绝大多数的业务都可以认为是对数据的各种处理,而数据建模即是将业务转换为数据库表的过程,即需要提供表来存储数据

1、创建数据库表并插入记录

* 在这里插入图片描述

2、数据库映射到Java

  • 有了数据库之后我们应该具有ORM(Object Relation Mappring对象关系映射)的思想(mybatis和hibernate会学):数据库和Java的成分的转换(映射),映射关系如下表
数据库Java
字段属性
记录对象

这种思想是我们写代码必须具备的条件,有了这种思想我们才知道从哪里下手

二、业务(提供代码来处理业务逻辑)

Java的三层架构:数据访问层(dao包,存放我们对象关系映射出来那个类)、业务逻辑层(service包)和视图层(web.controller)
bean:存放数据模型model,通过表转换过来,如User.java
dao:最底层数据访问层,直接面对数据库编程,即CRUD,如UserMapper(用于定义标准)
service:业务逻辑处理层,面对业务编程(如新增用户信息,为用户分配角色,禁用、启用用户,登录,注册),一个业务可以细分为具体的模块,是接口(接口是抽象到极致的类,接口中没有具体的方法),如IUservice.java,里面含有impl包(提供具体实现,如UserServiceImpl.java)
web:视图层,为前端提供数据接口,如Usercontroller.java

1、bean

  • 在bean中新建一个User类,定义数据库中所含有的属性,并生成getter和setter方法
public class User {
    private Integer id;//包装数据类型不可以接收空值,如Integer、Long
    private String name;
    private String password;
    private String address;
    private String phone;

2、dao

  • 在dao中新建一个UserMapper的接口Interface
    为什么是Interface?如果我们不使用mybatis框架,就要去使用jdbc无脑硬编码(包括获取链接、注册驱动、预处理SQL),目前这种硬编码在实际开发中已经用不着了,我们使用mybatis框架封装起来帮我们去做。而mybatis怎么去做呢,要连哪个数据库,要使用哪张表怎么告诉它呢?这就是使用接口的原因(接口可以定义标准)。比如当我们想通过name进行查询记录时,我们就可以调用UserMapper接口的query方法。总而言之,mybatis就是一个让我们只需要定义方法和编写SQL语句,就可以查找到记录的框架。
    在我们查找的时候当然要有SQL语句,SQL语句怎么写呢,这就关系到mybatis,mybatis有提供两种方式,一种是注解(官方推荐),一种是xml,下面暂时使用注解
public interface UserMapper {
    @Select("select * from user")
    List<User> query(String name);
}

3、service

  • 在service中新建一个IUserService的接口
    dao层和service层的query方法看起来一样,但其实两者的职责不一样,一个是数据库上的查询,一个是业务上的查询(比如我们需要通过各种判断之后,才能真正去数据库进行查询)。
public interface IUserService {
    
    List<User> query(String name);
    
}

接口的实现:在service下新建包impl,在impl包内新建UserServiceImpl类(使用到了implements关键字,在里面我们实现UserService接口当中所有没有实现的方法。注意在类的上面要使用@Service注解,用于标注业务层组件)

@Service
public class UserServiceImpl implements IUserService{
    @Override
    public List<User> query(String name) {
        return null;
    }
}

那么这个方法我们怎么实现呢?我们首先要认识到UserServiceImpl是位于三层架构的中间层,这个query方法是不会自己去连数据库的,是需要我们调用底层接口的,也就是要调用dao层。这就关系到spring技术,spring中有一个非常著名的思路,叫依赖注入,service层的类要调用dao层的类(接口),我们以前都是通过new的方式,而通过spring的依赖注入,我们只需要将我们的想法告诉spring,spring就将我们想要创建的实体注入(传递)给我们(spring内部有帮助管理我们所有实体的容器)。new的方式与spring注入的方式对于我们而言很明显一个是主动,一个是被动。
那我们怎么实现spring的依赖注入呢?
这就要通过注解@Autowired。

@Service
public class UserServiceImpl implements IUserService{
    
    @Autowired
    private UserMapper userMapper;
    
    @Override
    public List<User> query(String name) {
        return null;
    }
}

这样做spring就给我们传递了一个userMapper对象,就相当于我们声明了一个UserMapper对象,但这时候却发现userMapper报红了,为什么呢?
这是因为UserMapper是一个接口,这个接口的实现类实际上是由Mybatis产生出来的,而IDEA检测不到Mybatis。也就是说,我们此前在dao层没有做好Mybatis的配置。
我们新建一个config包,在包内创建MybatisConfig类。

//标识该类为一个配置类
@Configuration
//映射接口的扫描,在dao层中我们只定义了接口,具体的实现是mybatis帮我们去做
//我们通过@MapperScan注解高数我们定义的接口(标准在哪里),这样Mybatis就能帮我们产生出代码
@MapperScan("com.gxust.test.dao")
public class MybatisConfig {
}

这样userMapper报红就解决了,query方法内只要直接调用UserMapper接口内的query方法即可。

@Service
public class UserServiceImpl implements IUserService{

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> query(String name) {
        return userMapper.query(name);
    }
}

4、controller

在web.controller包内创建UserController.java

//标识此为一个Rest接口
@RestController
//定义跟路由
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    //定义子路由,以Get方式来访问
    @GetMapping("query")
    public List<User> query(String name){
        return userService.query(name);
    }
}

4、配置文件

最后记得在配置文件配置好数据库信息等

logging.level.com.jacky.university.dao=debug

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations= classpath:/mapper/**/*.xml

server.port=8888

5、运行项目

运行项目,通过访问http://localhost:8888/user/query?name=xxx即可查询到数据。由于name是包装数据类型,所以我们可以不传name参数

6、增删改基础业务的实现

举一反三即可

public interface UserMapper {
    @Select("select * from user where name like '%${name}%'")
    List<User> query(String name);

    //Mybatis知道我们传过来的是一个user对象,就会自动将SQL语句的字段与user的值匹配
    @Insert("insert into user values(null,#{name},#{age},#{gender})")
    void insert(User user);

    @Update("update user set name=#{name},age=#{age},gender=#{gender} where id=#{id}")
    void update(User user);

    @Delete("delete from user where id=${id}")
    void delete(int id);
}
public interface IUserService {

    List<User> query(String name);

    void insertOrUpdate(User user);

    void delete(int id);
}
@Service
public class UserServiceImpl implements IUserService{

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> query(String name) {
        return userMapper.query(name);
    }

    @Override
    public void insertOrUpdate(User user) {
        if (user.getId() == null){
            userMapper.insert(user);
        }else {
            userMapper.update(user);
        }
    }

    @Override
    public void delete(int id) {
        userMapper.delete(id);
    }
}
//标识此为一个Rest接口
@RestController
//定义跟路由
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    //定义子路由,以Get方式来访问
    @GetMapping("query")
    public List<User> query(String name){
        return userService.query(name);
    }

    //get请求和post请求的区别:如浏览器在地址栏输入发送请求的方式,只能发送get请求而模拟不出post请求
    //解决方案:1、写前端代码,在form表单中指定method=post;2、postman模拟请求;3、swagger
    @PostMapping("insertOrUpdate")
    public String insertOrUpdate(User user){
        userService.insertOrUpdate(user);
        return "更新成功";
    }

    @GetMapping("delete")
    public String delete(int id){
        userService.delete(id);
        return "删除成功";
    }
}

7、swagger的使用

在控制层的insertOrUpdate方法我们发出了post请求,浏览器在地址栏输入发送请求的方式,只能发送get请求而模拟不出post请求,那我们怎么测试我们编写的接口呢?
解决方案:1、写前端代码,在form表单中指定method=post;2、postman模拟请求;3、swagger

7.1、加入依赖

			<!-- swagger api文档 -->
			<dependency>
				<groupId>io.springfox</groupId>
				<artifactId>springfox-swagger2</artifactId>
				<version>2.6.1</version>
			</dependency>
			<dependency>
				<groupId>io.springfox</groupId>
				<artifactId>springfox-swagger-ui</artifactId>
				<version>2.6.1</version>
			</dependency>

7.2、引入配置文件

在config包下创建swagger2.java

@Configuration
@EnableSwagger2
public class Swagger2 {
	@Bean
	public Docket createRestApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("com.gxust.test.web.controller"))
				.paths(PathSelectors.any())
				.build()
				.securitySchemes(Lists.newArrayList(apiKey()));
	}
	
	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("title")
				.description("description")
				.termsOfServiceUrl("termsOfServiceUrl")
				.version("1.0")
				.build();
	}
	private ApiKey apiKey() {
		return new ApiKey("Authorization", "Authorization", "header");
	}
}

如果报错运行项目报错Failed to start bean ‘documentationPluginsBootstrappe,那么在全局配置文件中添加配置:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

或者在pom.xml中将swagger的版本提高(2.9.1)
这个是因为在springboot2.6.0后将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser,导致出错,解决办法是切换回原先的AntPathMatcher

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:26:14  更:2022-05-09 12:29:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:07:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码