-
一、项目结构与代码实现
学过javaweb的同学对dao层,service层,action层,bean层很熟悉吧,ssm框架的项目结构是类似的。
entity层
entity层即数据库实体层,也被称为bean层,pojo层,model层。
一般数据库一张表对应一个实体类,类属性同表字段一一对应。
mapper层
mapper层即数据持久层,也被称为dao层。
mapper层的作用为访问数据库,向数据库发送sql语句,完成数据的增删改查任务。
service层
service层即业务逻辑层。
service层的作用为完成功能设计。
service层调用mapper层接口,接收mapper层返回的数据,完成项目的基本功能设计。
controller层
controller层即控制层,也被成为action层。
controller层的功能为请求和响应控制。
controller层负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返具体的页面和数据到客户端。
自己要建好这几个包:
此为创建完的所有文件:
正常的业务逻辑是:前端告诉我们需要写一个登录功能,这个时候我们来到controller层(也就是javaweb的action层)写一个登录的方法:
创建controller包,在其下面创建一个实现类:
代码:
package com.waisang.mybatisflex.controller;
import com.waisang.mybatisflex.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// controller层就相当于javaweb的action层
@RestController
public class indexController {
@Autowired
private UserService userService;
@RequestMapping("/login")
public long login(String username,String password){
return userService.login(username,password);
}
}
@RequestMapping("/login")是定义前端访问的接口
我们定义的是login也就是一会我们要通过login来访问后端接口,访问了login之后会调用这个login的方法,这个方法需要传入两个参数,一个username一个是password,方法返回了userService层的login方法。
下一步就是到server层实现这个login方法
首先创建Userservice接口,和创建实现此接口的实现类UserServiceImpl,为了方便管理实现类我们会给他放在一个统一的包里面(impl包)
UserService代码:
package com.waisang.mybatisflex.service;
import com.mybatisflex.core.service.IService;
import com.waisang.mybatisflex.entity.User;
// 当然service层还是service层
public interface UserService extends IService<User> {
// 登录业务,service服务层用来定义需要用到的业务方法,然后再impl层写实现代码
long login(String userName,String password);
}
⚠️⚠️⚠️注意⚠️⚠️⚠️继承IService接口的泛型应该写你自己所需要的类,也就是entity包里面的类
UserServiceImpl代码:
package com.waisang.mybatisflex.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.waisang.mybatisflex.entity.User;
import com.waisang.mybatisflex.mapper.UserMapper;
import com.waisang.mybatisflex.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// @Autowired的作用:之前java声明一个变量是需要在构造函数实例化的,spring框架的好处就是,你使用自动装配@Autowired就省去了构造函数实例化的过程
@Autowired
private UserMapper userMapper;
//以下演示构造函数,如果没有自动装配就需要使用以下的构造函数实例化userMapper
// public UserServiceImpl(UserMapper userMapper) {
// this.userMapper = userMapper;
// }
@Override
public long login(String userName, String password) {
// 以下代码为QueryWrapper的实现方法,不建议现在学,因为可能看不懂,所有直接跳过
// User u = new User();
// QueryWrapper qw = new QueryWrapper();
// qw.eq("user_name",userName);
// qw.eq("password",password);
// userMapper.selectCountByQuery(qw);
// return (userMapper.selectCountByQuery(qw));
// 学习以下代码即可
Long n = userMapper.login(userName,password);
return n;
}
}
因为我们是UserService接口的实现类所以继承UserService接口,并且实现login方法。 我们通过server层来调用mapper来做到数据库的数据访问。接下来就要实现mapper层的代码。
UserMapper代码:
package com.waisang.mybatisflex.mapper;
import com.mybatisflex.core.BaseMapper;
import com.waisang.mybatisflex.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
// mapper 层就相当于javaweb的dao层
public interface UserMapper extends BaseMapper<User> {
// 登录
@Select("select * from user where user_name=#{user_name} and password = #{password}")
long login(@Param("user_name")String user_name,@Param("password") String password);
}
sql语句就不用我多说了吧,这里需要穿两个参数也不用我多说了吧
写到这里其实就大功告成了,接写来就到主类里面实现方法就可以了。
主类必须加上@MapperScan(com.xxx.xxx.mapper)不然扫描不到你的包
package com.waisang.mybatisflex;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.waisang.mybatisflex.mapper")
public class MybatisFlexApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisFlexApplication.class, args);
}
}
⚠️⚠️⚠️值得你注意的是⚠️⚠️⚠️ 你的application.yml必须有端口号
# DataSource Config
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password:
mybatis-flex:
mapper-locations:
- classpath*:/mapper/*.xml
server:
port:8080 #端口号,可改
-
二、测试
运行主类
控制台没有报错
如果你跟着我的一步一步来那就访问以下的地址,如果不是请自己适配自己的变量名跟端口
访问 localhost:8080/login?username=admin&password=admin
出现1就成功
出现以下情况可能是你参数错了
三、扩展
我们正常登录是现实登录成功或者登录失败对吧,很显然前端现实的1是有点不对的,所有我们做以下的改进。
在业务逻辑成更改返回的内容,如果数据库查找到信息我就返回“登录成功”否则返回“用户名密码错误”:
但是报错了,让我们来看看报错的原因是什么:
这个时候看login方法 发现我们定义的返回值是long但是我们现在要返回“登录成功”是String
那就吧这个long改成String,发现还是报错,再看,他说UserService跟UserServiceImpl方法返回值不一致。
也就是改了UserServiceImpl没有改UserServe,那就改成String ,并且吧controller的返回值也改成String
发现都不报错了,那就运行测试