springboot 项目实战-03章
1.本章介绍
(1)本章总的任务是要完成后端框架搭建和查询接口开发
(2)首先下载mysql,idea关联 mysql,数据库可视化(本地就可以用navicate之类的,我用Sequel Pro,之后服务部署最好用阿里云)
(3)集成mybaits
(4)集成mybaits Generator
(5)电子书查询接口开发
2.mysql 配置
(1)下载mysql(略)
(2)idea 插件如何使用mysql 执行.sql 文件,执行sql语句:https://blog.csdn.net/fengxueliuke/article/details/106836846
3.mybaits持久层框架
(1)横向上来说,持久层是与数据库打交道、同时还有服务层,也叫业务层,写业务逻辑的、表现层是与界面相关的。
(2)纵向上来说,持久层框架除了mybaits还有hibernate。mybaits是半自动框架,还要写sql,hibernate是全自动框架,不需要写sql。
(3)集成mybatis:
第一步,加依赖
<!-- 集成mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!-- 集成mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency>
第二步,配置文件写入数据源链接等
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wiki
spring.datasource,username=root
spring.datasource.password=xxx
注意,这个配置文件中,spring.datasource.url配置成什么样都可以启动服务,因为不会真的去链接数据库, 只会检查有没有配置数据源链接。
(4)如何配置持久层?
第一步,如果你有一个数据表叫Test,那么,首先生成一个实体类。实体类所在的包名往往叫domain、entity、pojo。实体类与数据库表一一映射,比如数据表中有字段id、name、password,那么生成实体类就是这样的。
package com.sankuai.wiki.domain; public class Test { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
第二步,生成mapper。持久层又叫Mapper层,也就是广为人知的Dao层,如果后续用官方代码生成器,其生成的代码就是XXXMapper
写一个XXXMapper接口,接口中有一个方法,
package com.xxx.wiki.mapper; import com.xxx.wiki.domain.Test; import java.util.List; public interface TestMapper { public List<Test> list(); }
第三步,写sql脚本。在resource 下面新建dir 取名mapper,mapper下面新增同名xml,XXXMapper.xml
内容如下:
<?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" >
<!--开头这2行,复制粘贴即可-->
<mapper namespace="com.xxx.wiki.mapper.TestMapper"> <select id="list" resultType="com.xxx.wiki.domain.Test"> </select> </mapper>
其中,<mapper namespace="com.xxx.wiki.mapper.TestMapper">,namespace:持久层Mapper的类名
<select id="list" resultType="com.xxx.wiki.domain.Test"> ,
id:持久层接口的方法返回类型,由接口中的方法定义的。
resultType:实体类类名。
select 标签中间,是执行的sql
第四步:发问1,整个项目怎么知道mapper层是持久层?
在启动类中,加上@MapperScan("com.xxx.wiki.mapper"),扫描的时候,就会认为这个包下面的就是持久层
第五步:发问2,整个项目怎么知道xxx.xml就是要执行的sql?
在配置文件中,加上 mybatis.mapper-locations=classpath:/mapper/**/*.xml,项目就认识了。
其中,classpath是指,resource路径,mapper就是我们新建的文件夹,/**/*.xml 的意思是,** 表示,不管是几层文件夹,*.xml 表示,以.xml类型的文件。
也就是mapper/a.xml、mapper/aaa/a.xml、mapper/aaa/bbb/a.xml都能被系统识别为要被执行的sql。
(5)怎么使用持久层?
新建service包,包路径 com.xxx.wiki.service。new一个类,如下
package com.xxx.wiki.service; import com.xxx.wiki.domain.Test; import com.xxx.wiki.mapper.TestMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class TestService { @Resource //@Autowired private TestMapper testMapper; public List<Test> list(){ return testMapper.list(); } }
在controller层的TestController 中加一个get请求
@GetMapping("/test/list") public List<Test> list(){ return testService.list(); }
记得在该类中注入
@Resource private TestService testService;
在test.http中请求
GET http://localhost:8088/test/list Accept: application/json ###
得到结果
GET http://localhost:8088/test/list HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Fri, 28 Jan 2022 09:16:50 GMT Keep-Alive: timeout=60 Connection: keep-alive [ { "id": 100, "name": "前端开发", "password": null }, { "id": 101, "name": "Vue", "password": null }, { "id": 102, "name": "HTML & CSS", "password": null }, { "id": 200, "name": "Java", "password": null }, { "id": 201, "name": "基础应用", "password": null }, { "id": 202, "name": "框架应用", "password": null }, { "id": 300, "name": "Python", "password": null }, { "id": 301, "name": "基础应用", "password": null }, { "id": 302, "name": "进阶方向应用", "password": null }, { "id": 400, "name": "数据库", "password": null }, { "id": 401, "name": "MySQL", "password": null }, { "id": 500, "name": "其它", "password": null }, { "id": 501, "name": "服务器", "password": null }, { "id": 502, "name": "开发工具", "password": null }, { "id": 503, "name": "热门服务端语言", "password": null } ] Response code: 200; Time: 175ms; Content length: 625 bytes
4.集成mybatis官方代码生成器
(1)集成mybatis Generator:3中,我们写一个mybatis功能,需要写实体类、xml、接口,比较繁琐。用官方提供的mybatis Generator就可以省下这些不走,一些单表的crud操作,都可以不用自己写代码了。当然,复杂的sql还得自己写。
配置只需要2步。
第一步,配置pom依赖
<!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <configurationFile>src/main/resources/generator/generator-config.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> </dependencies> </plugin>
第二步,配置配置文件
pom.xml依赖中,说明 配置文件需要在这里读 <configurationFile>src/main/resources/generator/generator-config.xml</configurationFile>
我们就按照这个目录来新建generator-config.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat"> <!-- 自动检查关键字,为关键字增加反引号 --> <property name="autoDelimitKeywords" value="true"/> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!--覆盖生成XML文件--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> <!-- 生成的实体类添加toString()方法 --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!-- 不生成注释 --> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/wiki?serverTimezone=Asia/Shanghai" userId="root" password="xxx"> </jdbcConnection> <!-- domain类的位置 --> <javaModelGenerator targetProject="src/main/java" targetPackage="com.xxx.wiki.domain"/> <!-- mapper xml的位置 --> <sqlMapGenerator targetProject="src/main/resources" targetPackage="mapper"/> <!-- mapper类的位置 --> <javaClientGenerator targetProject="src/main/java" targetPackage="com.xxx.wiki.mapper" type="XMLMAPPER"/> <table tableName="demo" domainObjectName="Demo"/> <!--<table tableName="ebook"/>--> <!--<table tableName="category"/>--> <!--<table tableName="doc"/>--> <!--<table tableName="content"/>--> <!--<table tableName="user"/>--> <!--<table tableName="ebook_snapshot"/>--> </context> </generatorConfiguration>
文件内容不用记,知道怎么用就可以了。最主要的是加粗的地方,将mybatis手动配置的文件目录路径,都配置在这里。
然后,配置一起启动命令:
Editor Configuraor -> Maven
name:mybatis-generator
Commad Line: mybatis-generator:generate -e
配置好了之后,运行,编译成功,发现新增了4个文件。mapper层的接口类:DemoMapper.java、实体层的Demo.java DemoExample.java, sql执行语句的xml文件 DemoMapper.xml
这四个文件,不要改,以后都不要改,是mybatis generator 自动生成的,之前只集成mybatis,这些都得靠自己手写。
(2)演示demo表列表查询
新增一个service 类,再新增一个controller类,查询一下demo表,能查询成功,表示集成mybatis Generator成功了,和集成mybtis+手写持久化mapper层+实体层+sql xml执行语句 达到了一样的效果。