环境准备,在之前的Spring Boot 教程(一)基础上,我们还需要做如下准备:
- mysql数据库安装及配置(详见之前的博客:骑鹤下江南 mysql 安装及配置)
- 一款测试后端的工具:PostMan,可自行在网上百度
- (可选)配置本地maven库
- 有了mysql数据库,我们就可以在Spring Boot 上进行相应的配置了,首相配置pom 文件的maven依赖:
<!-- 添加jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 添加mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- 添加mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置yml文件,对于yml在这里简单介绍一下,还想了解更过可以百度,毕竟也是学习的过程。
首先声明,所谓的yml文件 全名就是 application.yml,和 resources 目录下的application.properties功能相同,存放的位置也相同。
其次application.yml 是需要新建的 ,项目生成的时候没有,新建了application.yml后需要删除原application.properties,因为会互斥。
其中yml的可以是树型结构,也可以是目录形式层级之间用“.” 分割。
最后给大家贴一张图,这是删除application.properties,并新建application.yml 后的效果:
- 在yml文件中添加如下配置:
spring.datasource.url: jdbc:mysql://localhost:3306/bootshop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username: root
spring.datasource.password: 111111
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
其中bootshop 是数据库名, 111111 是设置的mysql数据库密码。如图所示:
- 在数据库新建表 下面是我建的表(小说信息表),为了验证增删改查 结构比较简单,有3个字段,分别是id(编号,非自增),name(小说名),author(作者):
-
进行项目内的java代买书写及目录结构建立。本着所有的代码都需要被Demo2Application扫描到的原则(原因已经在教程(一)中阐述了),建立如下目录:
pojo 存放实体类;
service 存放逻辑代码;
mapper 存放数据访问接口,相当于dao层,用于调用xml(mybatis的xml及对应的Spring Boot配置下文中会讲到)作为数据访问层 ;
-
书写各层代码 ,以根据id查询一条数据为例。
首先于pojo下新建实体类Book,添加成员变量id,name,author,及get set 方法,及引用如下:
其中 @Component 作用:把普通pojo实例化到spring容器中
- 在mapper 下新建 BookMapper 添加代码如下:
@Repository
public interface BookMapper {
public List<Book> queryBookById(@Param(value = "id") String id);
}
@Repository:repository原意指的是仓库,即数据仓库的意思,Repository蕴含着真正的面向对象概念,即一个数据仓库角色,负责所有对象的持久化管理。
@Param(value = “id”) :用于写有sql的xml中,标识传入的参数
- 在service下新建 BookService添加代码如下:
@Service
public class BookService {
@Autowired
BookMapper bookMapper;
//查询
public List<Book> queryBookById(String id){
return bookMapper.queryBookById(id);
}
}
@Service: 用于标注业务层组件
@Autowired:自动导入,将创建的 Bean 注册到 IOC 容器中
- 于Controller下,新建BookInfoController,添加代码,并添加引用:
@RestController
public class BookInfoController {
@Autowired
private BookService bookService;
//查询所有 或 根据id查询
@RequestMapping("/getBook")
public List<Book> getBook(@RequestParam(required = false) String id) {
List<Book> book1 = bookService.queryBookById(id);
return book1;
}
}
@RequestMapping("/getBook"): @RequestMapping 是一个用来处理请求地址映射的注解, /getBook为浏览器访问的地址
@RequestParam(required = false) String id: 其中 @RequestParam(required = false) 是对于id的修饰 ,表示不必须,即可以为空
此时返回的数据结果集,应该是不带有id条件的,即返回的是所有记录。
- 接下来需要进行mybatis在yml中的配置 及 xml文件的书写:
首先 在resources,文件夹下 新建mapping 文件夹,在其中新建BookMapper.xml, 新建的目录结构,及文件内容为:
此处说明一下图中箭头的意义,仅给不常用mybatis的同学说道说道:
1.映射到mapper:指namespace命名空间的地址应为对应的mapper的地址(图片中的demo1写错了,后来回来P成demo2的,见谅,下面贴的代买已经改过来了)
2.映射的实体:指将resultMap的类型定义为对应的实体,在resultMap内部的字段和实体的成员变量对应
3.于mapper中的方法名对应:指id应和mapper中的方法名相同
4.相同:指查询sql的返回结果类型
5.判断:此处是mybatis的一种判空的应用,如果不为空则sql会拼接下面的条件,否则没有=id这个条件,即查询所有。此处有两点需要说明,第一点在mapper中写了@Param(value = “id”) ,就是用在标识判断条件中的id,否则直接在sql中写<if test “id!=null” …>会报错;第二点,此处判断是配合controller中@RequestParam(required = false) String id 而写的,实现了不带有id条件,返回的所有记录。
<?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.demo2.mapper.BookMapper">
<resultMap id="BaseResultMap" type="com.example.demo2.pojo.Book">
<result column="id" jdbcType="VARCHAR" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="author" jdbcType="VARCHAR" property="author" />
</resultMap>
<!--查询-->
<select id="queryBookById" resultMap="BaseResultMap" parameterType="String">
select id,name,author from book_info where 1=1
<if test="id!=null and id!=''">
AND id = #{id}
</if>
</select>
</mapper>
新建完xml文件后,yml 文件中添加:mybatis.mapper-locations: classpath:mapping/*.xml
-
最后一步 打开Demo2Application文件,添加注解@MapperScan(value = “com.example.demo2.mapper”):
@MapperScan:可以指定要扫描的Mapper类的包的路径。如果不添加这个注解,那就要在每个mapper上添加@Mapper注解;注解多个mapper包 @MapperScan({“com.example.demo2.mapper”,“com.example.demo1.mapper”}) -
在数据库中插入几条数据,用作测试
-
启动项目,打开postman 访问地址localhost:8080/getBook,按图所示,添加查询条件key=id,value=111,点击send:
可以看到已经可以查询到数据库数据了,返回的实体是json格式的数据。试着把id前的对号点掉,也就是没有查询条调用getBook,则返回的值是所有的数据,效果如下 (太长不截了):
到目前为止的目录机构为(我是在教程(一)基础上做的,所以会有HelloController类):
-
查询已经实现了,增删改 无非是在各个层级增加对应的方法,下面把方法的截图附上,并附上gitHub 链接:
**其中需要注意:**在进行新增修改测试时,需要向后台传入实体,而postman传入实体对象参数的方法如下图所示,对象需要写成json形式
Controller:
service:
mapper:
xml:
git:https://github.com/HappyHappyWen/demo2.git
写在最后:提供方法、提供思路,但无法提供过程,过程很重要,诸君共勉之。
大雪坪剑来:
老剑神李淳罡望向这一幕,瞪大眼睛。
随即眼中黯然落寞缅怀追忆皆有。
那一年背负那女子上斩魔台,一样是大雨天气,一样是撑伞。
世人不知这位剑神当年被齐玄帧所误,木马牛被折并不算什么,只剩独臂也不算什么,这都不是李淳罡境界大跌的根由,哪怕在听潮亭下被困二十年,李淳罡也不曾走出那个自己的画地为牢。
原本与世已是无敌,与己又当如何?
李淳罡想起她临终时的容颜,当时她已说不出一个字,可今日想来,不就是那不悔两字吗?!
李淳罡走到大雪坪崖畔,身后是一如他与绿袍女子场景的撑伞男女。
她被一剑洞穿心胸时,曾惨白笑言:“天不生你李淳罡,很无趣呢。”
李淳罡大声道:“剑来!”
徽山所有剑士的数百佩剑一齐出鞘,向大雪坪飞来。
龙虎山道士各式千柄桃木剑一概出鞘,浩浩荡荡飞向牯牛大岗。
两拨飞剑。
遮天蔽日。
这一日,剑神李淳罡再入陆地剑仙境界。