这里我们以在数据库教程中建立的 用户 表为例,进行讲解 数据库相关
包
首先,在这里介绍一下 包的概念,一般我们会以 包名来划分功能区,比如 controller 表示路由的路口,biz 表示业务代码区,service 表示对数据库操作的封装,dao 表示对数据库操作区,entity 表示实体类的存放地址。每个人有每个人不同的习惯,这里不用强求。
下面就是我建立的包
编写代码
实体类
下面我们开始建立相关的代码,首先,我们需要创建一个实体类,他代表的是我们常见的用户表。
get set 方法是自动生成的,快捷键是 alt + insert 然后选择生成 get set 方法即可,我们这个电脑的insert 需要和 fn 一起按才生效。
public class User {private Integer id;private String userName;private String password;private String nickName;private Date birthday;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
dao
下面我们来创建 dao 的代码,我们开始创建一个 UserDao 的接口。
public interface UserDao {void addUser(User user);void updateUser(User user);User findUserById(Integer id);/*** 按条件查询用户* @param condition* @return*/List<User> listUserByCondition(User condition);}
然后我们去创建相对应的 xml 文件去写 sql,再 resource 下创建 mapper 文件夹,然后创建 User.xml,内容如下:首先 第三行的 namespace 对应的是我们上面创建的 dao 的接口的类,我们把他的全路径写上就表示相互关联映射了。
再往下看,是我写的一个查询 sql ,这是一个 select 标签,对应的当然还有 其他的 update、delete 其他的标签了,这里先不细说,然后这个 id 就是对应的 dao 里的方法名,后面的 parameterType 表示我们的参数类型,这里先说只有一个参数的,多个参数我们下次再说,也是一样,写全路径,resultType 就表示是返回类型,也是一样的道理哈。
然后我们下面开始写 sql ,这里要注意一点,如果我们数据库的字段名和实体类的字段名不一样,就要写一个别名,比如下面的 username ,因为实体类是驼峰的,所以这里后面跟了一个别名。
在后面就是对条件的判断,我们可以判断是否传了 userName ,传了就进行筛选,同理 其他参数也是一样的道理。
<?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"><mapper namespace="com.heting.test20220110.dao.UserDao"><select id="listUserByCondition" parameterType="com.heting.test20220110.entity.User"resultType="com.heting.test20220110.entity.User">select id, username userName, password, nickname nickName, birthday,agefrom s_user<if test="userName != null and userName != ''">AND s_user.username like concat('%',#{name},'%')</if><if test="age != null">AND s_user.age = #{age}</if><if test="id != null">AND s_user.id = #{id}</if></select></mapper>
@MapperScan 注解
创建完了之后我们回到 Test20220110Application.java 这个类,可能你下次创建的项目的启动类不叫这个名了,我们在类上加一个注解,如下:就是加一个 @MapperScan 注解,里面的内容是我们 dao 包的路径,这样框架就会扫描我们的 dao 包,并实例化他们了,这样我们才可以在后面 service 里用 @Resource 或 @Autiwire 进行引入。
@MapperScan(basePackages = {"com.heting.test20220110.dao"})@SpringBootApplicationpublic class Test20220110Application {public static void main(String[] args) {SpringApplication.run(Test20220110Application.class, args);}}
service
我们 service 包下创建 IUserSvice 接口,如下:
public interface IUserService {/*** 按条件查询用户* @param condition* @return*/List<User> listUserByCondition(User condition);}
再在 service 包下创建一个包 impl
再在 impl 包下创建一个 IUserService 的实现类,UserServiceImpl,代码如下:
@Service 表示的是注入 spring 框架的意思。
@Resource 表示的是引入 UserDao 的实例化对象进来
@Servicepublic class UserServiceImpl implements IUserService {@Resourceprivate UserDao userDao;@Overridepublic List<User> listUserByCondition(User condition) {return userDao.listUserByCondition(condition);}}
biz
我们在 biz 创建一个UserBiz 类,用来写业务代码,@Component 也是注入的 spring 框架的意思,@Autowired 是帮我们引入IUserService 的实例化对象进行,也就是我们在上一步注入 spring 的 UserServiceImpl 的对象。
@Componentpublic class UserBiz {@Autowiredprivate IUserService userService;public List<User> findUserByCondition(User user) {return userService.listUserByCondition(user);}}
controller
我们再创建一个 controller 类,如下,@RestController 表示这是一个 controller,并且接口返回 json 数据,
@RequestMapping(“user”) 表示当前路由的前缀是 user,@GetMapping(“findUserByCondition”) 表示这个方法的路由是 findUserByCondition,那么我们当前的完成请求路径就是:http://localhost:5556/ht/user/findUserByCondition
@RestController@RequestMapping("user")public class UserController {@Autowiredprivate UserBiz userBiz;@GetMapping("findUserByCondition")public List<User> findUserByCondition(User user) {return userBiz.findUserByCondition(user);}}
可以看到,展示结果如下。
