这里我们以在数据库教程中建立的 用户 表为例,进行讲解 数据库相关
包
首先,在这里介绍一下 包的概念,一般我们会以 包名来划分功能区,比如 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,age
from 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"})
@SpringBootApplication
public 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 的实例化对象进来
@Service
public class UserServiceImpl implements IUserService {
@Resource
private UserDao userDao;
@Override
public List<User> listUserByCondition(User condition) {
return userDao.listUserByCondition(condition);
}
}
biz
我们在 biz 创建一个UserBiz 类,用来写业务代码,@Component 也是注入的 spring 框架的意思,@Autowired 是帮我们引入IUserService 的实例化对象进行,也就是我们在上一步注入 spring 的 UserServiceImpl 的对象。
@Component
public class UserBiz {
@Autowired
private 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 {
@Autowired
private UserBiz userBiz;
@GetMapping("findUserByCondition")
public List<User> findUserByCondition(User user) {
return userBiz.findUserByCondition(user);
}
}
可以看到,展示结果如下。