springboot+mybatis(自顶向下)
最简单的架构
controller:是为前端提供的访问入口,不用关心具体的业务逻辑。具体的业务逻辑放在了serviceImpl里,controller只需调用它封装好的方法即可。
service提供业务逻辑要用到的方法,service.Impl提供方法的具体实现,
dao为serviceImpl提供操作数据的方法,但方法的具体实现(也就是SQL语句)放在了mapper下的xml文件里
mapper相当于dao的实现类,它下面是xml格式文件,xml里是SQL语句
Controller–>service接口–>serviceImpl–>dao接口–>mapper–>db
表的结构
配置项
pom.xml 依赖的导入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.test.skip>true</maven.test.skip>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 数据库连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- SpringBoot mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<!-- 测试接口 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
全局配置
server:
port: 8080
# Mybatis
mybatis:
mapper-locations: classpath:mapping/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印sql
spring:
# 数据库连接
datasource:
#type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/lexiedatabase?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
username: root
password:*****
mybatis 逆向工程配置
<?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:起个名字 -->
<!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
<context id="default" targetRuntime="MyBatis3">
<!--jdbc的数据库连接-->
<!--这里是以变量的形式定义,具体的值在 application.properties 文件中-->
<!--jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/lexiedatabase?serverTimezone=UTC"
userId="root"
password="admin">
</jdbcConnection>
<!-- targetPackage:生成的实体类所在的包 -->
<!-- targetProject:生成的实体类所在的硬盘位置 -->
<!-- DataObject 类存放位置 -->
<javaModelGenerator targetPackage="com.example.demo.entity"
targetProject=".\src\main\java">
<!-- 是否允许子包 -->
<property name="enableSubPackages" value="false" />
<!-- 是否对modal添加构造函数 -->
<property name="constructorBased" value="true" />
<!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
<property name="trimStrings" value="true" />
<!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
<property name="immutable" value="false" />
</javaModelGenerator>
<!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 -->
<sqlMapGenerator targetPackage="mapping"
targetProject=".\src\main\resources">
<!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.demo.dao" targetProject=".\src\main\java">
<!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--生成对应表及类名-->
<table tableName="news_user" domainObjectName="news_user">
</table>
</context>
</generatorConfiguration>
启动项
有且只有一个,程序的入口
第一个注解 扫描程序的主包
第二个注解扫描dao,链接到mapper
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.example.demo"})
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
System.out.println("springboot 成功启动");
}
}
entity
实体类,对应数据库中表
package com.example.demo.entity;
public class news_user {
private String userAccount;
private String password;
public news_user(String userAccount, String password) {
this.userAccount = userAccount;
this.password = password;
}
public news_user() {
super();
}
/**set/get函数**/
public String getUserAccount() {
return userAccount;
}
public void setUserAccount(String userAccount) {
this.userAccount = userAccount == null ? null : userAccount.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
}
controller
controller 调用service接口实现功能
package com.example.demo.controller;
import com.example.demo.dao.news_userMapper;
import com.example.demo.entity.news_user;
import com.example.demo.service.IUserService;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping(value = "/test")
public class text_database {
private IUserService userService;
@Autowired
public text_database(IUserService userService) {
this.userService = userService;
}
@RequestMapping("/findall")
public String find(){
news_user a = userService.findAll("admin");
return a.getPassword();
}
@RequestMapping(value = "/hello")
public String Hello(){
return "hello";
}
}
service
可以分为service接口和service实现
service接口
(主要是定义方法)
package com.example.demo.service;
import com.example.demo.entity.news_user;
public interface IUserService {
news_user findAll(String userAccount);
}
service实现
impl 对方法进行具体的编写(调用dao的接口)
@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了。
@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。在此处是对dao接口的实例化
package com.example.demo.service.impl;
import com.example.demo.dao.news_userMapper;
import com.example.demo.entity.news_user;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService implements IUserService {
private final news_userMapper userMapper;
@Autowired
public UserService(news_userMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public news_user findAll(String userAccount) {
news_user model = userMapper.findUser(userAccount);
if (model == null) {
System.out.println("null");
}
return model;
}
}
dao层
data access object 是一个数据访问接口
package com.example.demo.dao;
import com.example.demo.entity.news_user;
import org.apache.ibatis.annotations.Param;
public interface news_userMapper {
/**
* 获取用户
*/
news_user findUser(@Param("userAccount") String userAccount);
}
mapping
用于写数据库查询语句,和dao中函数对应
指定dao中的一个类
对类中的函数通过id链接
中间写select语句