这里我们以在数据库教程中建立的 用户 表为例,进行讲解 数据库相关

首先,在这里介绍一下 包的概念,一般我们会以 包名来划分功能区,比如 controller 表示路由的路口,biz 表示业务代码区,service 表示对数据库操作的封装,dao 表示对数据库操作区,entity 表示实体类的存放地址。每个人有每个人不同的习惯,这里不用强求。
下面就是我建立的包
image.png

编写代码

实体类

下面我们开始建立相关的代码,首先,我们需要创建一个实体类,他代表的是我们常见的用户表。
get set 方法是自动生成的,快捷键是 alt + insert 然后选择生成 get set 方法即可,我们这个电脑的insert 需要和 fn 一起按才生效。

  1. public class User {
  2. private Integer id;
  3. private String userName;
  4. private String password;
  5. private String nickName;
  6. private Date birthday;
  7. private Integer age;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public void setUserName(String userName) {
  18. this.userName = userName;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. public String getNickName() {
  27. return nickName;
  28. }
  29. public void setNickName(String nickName) {
  30. this.nickName = nickName;
  31. }
  32. public Date getBirthday() {
  33. return birthday;
  34. }
  35. public void setBirthday(Date birthday) {
  36. this.birthday = birthday;
  37. }
  38. public Integer getAge() {
  39. return age;
  40. }
  41. public void setAge(Integer age) {
  42. this.age = age;
  43. }
  44. }

dao

下面我们来创建 dao 的代码,我们开始创建一个 UserDao 的接口
image.png

  1. public interface UserDao {
  2. void addUser(User user);
  3. void updateUser(User user);
  4. User findUserById(Integer id);
  5. /**
  6. * 按条件查询用户
  7. * @param condition
  8. * @return
  9. */
  10. List<User> listUserByCondition(User condition);
  11. }

然后我们去创建相对应的 xml 文件去写 sql,再 resource 下创建 mapper 文件夹,然后创建 User.xml,内容如下:首先 第三行的 namespace 对应的是我们上面创建的 dao 的接口的类,我们把他的全路径写上就表示相互关联映射了。
再往下看,是我写的一个查询 sql ,这是一个 select 标签,对应的当然还有 其他的 update、delete 其他的标签了,这里先不细说,然后这个 id 就是对应的 dao 里的方法名,后面的 parameterType 表示我们的参数类型,这里先说只有一个参数的,多个参数我们下次再说,也是一样,写全路径,resultType 就表示是返回类型,也是一样的道理哈。
然后我们下面开始写 sql ,这里要注意一点,如果我们数据库的字段名和实体类的字段名不一样,就要写一个别名,比如下面的 username ,因为实体类是驼峰的,所以这里后面跟了一个别名。
在后面就是对条件的判断,我们可以判断是否传了 userName ,传了就进行筛选,同理 其他参数也是一样的道理。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.heting.test20220110.dao.UserDao">
  4. <select id="listUserByCondition" parameterType="com.heting.test20220110.entity.User"
  5. resultType="com.heting.test20220110.entity.User">
  6. select id, username userName, password, nickname nickName, birthday,age
  7. from s_user
  8. <if test="userName != null and userName != ''">
  9. AND s_user.username like concat('%',#{name},'%')
  10. </if>
  11. <if test="age != null">
  12. AND s_user.age = #{age}
  13. </if>
  14. <if test="id != null">
  15. AND s_user.id = #{id}
  16. </if>
  17. </select>
  18. </mapper>

@MapperScan 注解

创建完了之后我们回到 Test20220110Application.java 这个类,可能你下次创建的项目的启动类不叫这个名了,我们在类上加一个注解,如下:就是加一个 @MapperScan 注解,里面的内容是我们 dao 包的路径,这样框架就会扫描我们的 dao 包,并实例化他们了,这样我们才可以在后面 service 里用 @Resource 或 @Autiwire 进行引入。

  1. @MapperScan(basePackages = {"com.heting.test20220110.dao"})
  2. @SpringBootApplication
  3. public class Test20220110Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Test20220110Application.class, args);
  6. }
  7. }

service

我们 service 包下创建 IUserSvice 接口,如下:

  1. public interface IUserService {
  2. /**
  3. * 按条件查询用户
  4. * @param condition
  5. * @return
  6. */
  7. List<User> listUserByCondition(User condition);
  8. }

再在 service 包下创建一个包 impl
再在 impl 包下创建一个 IUserService 的实现类,UserServiceImpl,代码如下:
@Service 表示的是注入 spring 框架的意思。
@Resource 表示的是引入 UserDao 的实例化对象进来

  1. @Service
  2. public class UserServiceImpl implements IUserService {
  3. @Resource
  4. private UserDao userDao;
  5. @Override
  6. public List<User> listUserByCondition(User condition) {
  7. return userDao.listUserByCondition(condition);
  8. }
  9. }

biz

我们在 biz 创建一个UserBiz 类,用来写业务代码,@Component 也是注入的 spring 框架的意思,@Autowired 是帮我们引入IUserService 的实例化对象进行,也就是我们在上一步注入 spring 的 UserServiceImpl 的对象。

  1. @Component
  2. public class UserBiz {
  3. @Autowired
  4. private IUserService userService;
  5. public List<User> findUserByCondition(User user) {
  6. return userService.listUserByCondition(user);
  7. }
  8. }

controller

我们再创建一个 controller 类,如下,@RestController 表示这是一个 controller,并且接口返回 json 数据,
@RequestMapping(“user”) 表示当前路由的前缀是 user,@GetMapping(“findUserByCondition”) 表示这个方法的路由是 findUserByCondition,那么我们当前的完成请求路径就是:http://localhost:5556/ht/user/findUserByCondition

  1. @RestController
  2. @RequestMapping("user")
  3. public class UserController {
  4. @Autowired
  5. private UserBiz userBiz;
  6. @GetMapping("findUserByCondition")
  7. public List<User> findUserByCondition(User user) {
  8. return userBiz.findUserByCondition(user);
  9. }
  10. }

可以看到,展示结果如下。
image.png