基于SPB的简单CURD项目(回顾)

SpringBoot项目(集合Thymeleaf、MyBatis等)

一、项目构建

新建SpringBoot项目

勾选LomBok、Spring Web、Thymeleaf、MySQL、Druid等

·需要额外引入的包有如下(/pom.xml):

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.19</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <!--
 	<version>可附加版本号 如5.1.38</version>
	-->
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>

→ 完成后,更新maven import

·配置项(/src/main/resources/application.properties)设置 //*.Properties 注释需在段首

server.port=8080
server.servlet.context-path=/ems

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ems_thymeleaf?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations=classpath:/com/example/mapper/*.xml
#对应实体类
mybatis.type-aliases-package=com.example.entity
#Thymeleaf基础配置
spring.resources.static-locations=classpath:/templates/,classpath:/static/

·项目目录结构构建

EmsThymeleaf	(Project-Model)
    ├── src
    │   └── main
    │   	├── java
    │       │	├── com
    │       │	│	├── example
    │       │   │	│	├── controller
    │       │   │	│	├── dao
    │       │   │	│	├── entity
    │       │   │	│	└── service
    │       │	│   └──	MainApplication.java 	#主程序类,入口
    │  		└── resources
    │   		├── com
    │       	│	└── example
    │   	   	│		├── mapper【注1】
    │           │		└── sql					#数据库初始化SQL语句【注2】
    │   		├── static						#静态资源(css、imgs)
    │           │		├── assets
    │           │		└── imgs
    │   		├── templates					#html文件(Thymeleaf模板化)
    │           │       └──	index.html
    │			└── application.properties		#配置项文件
    └── pom.xml          

注1:/src/main/resources 中增加目录结构,需以 "com/example/mapper"形式创建

数据库设计

--	database:ems_thymeleaf
--	table: t_user (id,username,realname,password,gender);
--	table: t_emp  (id,name,salary.ageb,birth);
--	end.
# use ems_thymeleaf;
use ems_thymeleaf;

# 注2:使用此文件进行数据库初始化构建
# Create table:
create table t_user(
	id varchar(40) primary key,
	username varchar(40),
	realname varchar(40),
	password varchar(40),
	gerder varchar(4)
);

create table t_emp(
	id varchar(40) primary key,
	name varchar(40),
	salary double(7,2),
	age int(3),
	birth date
);

Thymeleaf相关

通过下面的 application.properties设置,结合Controller控制器,进行模板渲染访问

#application.properties
#Thymeleaf基础配置
spring.resources.static-locations=classpath:/templates/,classpath:/static/
<!--	login.html	-->
<!DOCTYPE html>
<html xmlns:th="http://www.thyemleaf.org">
<head>
    <title>login</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" th:href="@{css/style.css}"/>
</head>
    ……
</html>
/**
  *	~/controller/WebPageController.java
  * Controller 通过控制器,渲染Thymeleaf模板页面,进行访问
*/  
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebPageController {
    //主页跳转:
    @GetMapping("/")
    public String toIndex(){
        return "login";
    }
}

其中,页面模板文件结构如下:

resources
|--	static
	|--	css
		|--	style.css
	|--	img
|--templates
	|--	login.html

通过以上设置,在访问 “~/”时,控制器自动跳转到经Thymeleaf渲染过的login.html页面。

二、程序设计相关

(〇)一些基本说明

关于注解

https://blog.csdn.net/renanrenan/article/details/84654362/

关于Lombok注解相关

Lombok的基本使用 https://www.jianshu.com/p/2543c71a8e45

开发实用工具类(视频P2、P3:60mins) https://www.bilibili.com/video/BV1gg4y1v7Mi

LomBok全原理简单介绍 https://blog.csdn.net/weixin_38378034/article/details/112480908

SpringMVC/MVC设计模式相关

SpringMVC 讲解:https://www.bilibili.com/video/BV1n4411R7bL

主程序入口,添加MapperScan路径

@SpringBootApplication
@MapperScan("com.example.dao")
public class MainApplication{
    public static void main(String[] args){
        SppringApplication.run(MainApplication.class, args);
    }
}

关于Mabits映射文件中的ParameterType和ResultType

parameterType:指定输入参数类型,mybatis从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据*,则分别进行映射,并把对象放到容器List*中

image

更多示例可参考 https://blog.csdn.net/qq_34598667/article/details/83963934

(一)验证码生成

(二)功能模块

用户注册

以用户注册模块为例

a) com.example.entity.User.java [src]

//User.java	
//Entity::User
//参考数据库表`t_user`结构,建立实体

//使用Lombok做注解
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString

public class User{
    private String id;
    private String username;
    private String realname;
    private String password;
    private String gender;
}

b) com.example.dao.UserDAO [src]

public interface UserDAO{
    void regist(User user);
}

c) com.example.mapper.UserDAOMapper.xml [resources]

<!--以用户注册为例-->
<insert id="regist" parameterType="User">
	insert into t_user values(#{id},#{username},#{realname},#{password},#{gender})
</insert>
<!--	#values内字段须与数据库内完全一致!
-->

c#) 关于插入非空字段

INSERT INTO t_user
  SELECT 'admin', 'password' FROM DUAL
   WHERE NOT EXISTS (SELECT username FROM t_user WHERE username = 'admin');
   #也可以用count(*)方法判断
   
   ## insert into t_user  select #{username},#{password} from dual WHERE NOT EXISTS (SELECT username FROM t_user WHERE username = #{username})

d-1) com.example.service.UserService.java [src]

//用户相关功能(如登录、注册等)均做在UserService下,表示为不同方法
public interface UserService{
    void regist(User user);
}

d-2) com.example.service.UserServiceImpl.java [src]

@Service		//工厂管理
@Transactional	//控制事务
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDAO userDAO;	//注入DAO
    
    @Override
    public void regist(User user){
        //处理业务,设置id主键
        user.setId(UUID.ramdomUUID().toString());	//User.java中Lombok了getter和setter方法?
        
        userDAO.regist(user);
    }
}

UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的 形式。由以下几部分的组合:

1、当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不 同,其余相同);
2、时钟序列;
3、全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。

e) com.example.controller.UserController.java [src]

@Controller
@RequestMapping("/user")	//设置命名空间
public class UserController{
    @Autowired
    private UserService userService;
    
    //用户注册功能方法实现
    @PostMapping("/regist")
    public String regist(User user){
        userService.regist(user);
        return "redirect:/";	//当注册成功,跳转到主页面(自定义)
    }
    
}

注:为避免乱码,数据库链接需指定 characterEncoding=utf-8

用户登录

a) UserDAO.java [src]

public interface UserDAO{
    void login(@param("username") String username, @Param("password") String password);	//对登录的username和password进行绑定
}

b) UserDAOMapper.xml [resources]

<mapper namespace="com.example.dao.UserDAO">
	<!--登录-->
    <select id="login" resultType="User">
    	select id,username,realname,password,gender from t_user
        	where username = #{username} and password = #{password}
    </select>
</mapper>

c-1) UserService.java [src]

public interface UserService(User user){
    User login(String username, String password);
}

c-2) UserServiceImpl.java [src]

@Service
@Transactional
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDAO userDAO;
    
    @Override
    public User login(String username, String password){
        return userDAO.login(username,password);	//返回User对象
    }
}

d) UserController.java [src]

@Controller
@RequestMapping("/User")
public class UserController{
    @Autowired
    private UserService userService;
    
    //登录方法
    @PostMapping("/login")
    public String login(String username, String password){
        User login = userService.login(username,password);
        if(login != null){
            //跳转到 登录成功页面
            return "redirect:/success";
        }else{
            //跳转到 登录页面
            return "redirect:/";
        }
    }
}
用户查询

User类已定义;

a) UserDAO.java

public interface UserDAO{
    List<User> find(@Param("username") String username);
    //用于绑定对象属性值
}

b) UserDAOMapper.xml

<mapper namespace="com.example.dao.User">
	<select id="find"resultType="User">
    	select username,…… from ……
    </select>
</mapper>

c) UserService接口写List类型的find()方法;

d) UserServiceImpl.java

@Service
@Transactional
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDAO userDAO;
    
    @Override
    @Transactional(propagation = propagation.SUPPORTS)
    public List<User> find(String username){
        return userDAO.find(username);
    }
}

e) UserController.java

//在原controller基础上,增加find方法
@GetMapping("/find")
public String find(String username){
    //注:获取到的 List<User> users = userService.find(username);
    //添加 model.addAttribute("users",users);	//前者"users"为attributeName。
	return Stringvalue;
}

f) webpage .html文件

<tr class="row" th:each="user:${users}">
	<td>
    	<span th:text="${user.username}" />
        ……
        <span th:text="${dates.format(user.birthday,'yyyy-MM-dd')}" />
    </td>
</tr>

RestController、批量对象数组插入

@RestController
@RequestMapping("/User")
public class UserRstController {
    @Autowired
    private UserService userService;

    //查询所有
    @GetMapping("/findAll")
    public List<User> findAll(){
        System.out.println("findall start");
        List<User> users = userService.findall();
        System.out.println("执行成功!  ");

        return users;
    }


    //批量注册
    @PostMapping("/imp")
    public String regist2(@RequestBody List<User> users){
        System.out.println("imp:::::::");
        for(User usr : users) {
            userService.regist(usr);
            System.out.println(usr.getUsername() + "\t");
        }
        System.out.println("执行成功!  ");

        return "BatchImp ok";
    }

}

注:@RequestBody 传递对象数组

项目: 基于SPB的Web 数据查询

引用参考

https://cnblogs.com/lin02/p/11648899.html springboot实现数据库数据导出生成Excel报表
https://cnblogs.com/jc1997/p/10946555.html springBoot 整合 mybatis+Oracle
https://www.hangge.com/blog/cache/detail_2825.html SpringBoot - 整合并操作Oracle数据库教程

posted @ 2021-10-11 02:29  ZaMonopaper  阅读(142)  评论(0)    收藏  举报