Springboot-mybatis
常用注解
@Mapper //使用这个注解表示这是一个mybatis的mapper类。
@Component //泛指组件,当组件不好归类时,使用该注解标注。
@Repository //用于dao层,用于标注数据访问组件
@Service //用于标记业务层组件
@Controller //用于标注控制层组件
//以上都是将相应的类注入到spring容器中
dao—>service—>controller
Servier层注入Dao层
Controller层注入Ser层
一、环境搭建
1、创建工程,添加依赖
必备依赖:
整合mybatis依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
组件:
数据库连接池
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
Tymeleaf组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
lombo组件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2、创建文件夹,连接数据库
文件夹:
实体类:pojo
接口:dao
业务层:service中有接口和实现类
控制层:controller实现
数据库连接数据源:
使用yml文件配置
配置端口:
server:
port: 8080
数据库连接:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis配置
使dao文件与xml文件绑定
mybatis:
type-aliases-package: com.pojo
mapper-locations: classpath:/mybatis/*xml
3、配置日志
logging:
file:
name: log/log.log
level:
root: info//最高级
com: debug//最低级
二、访问数据库查询数据以及分页展示
加入分页组件依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.0</version>
</dependency>
1、创建数据库实体类
在pojo中新建文件User.java
数据库中的的参数:
对应添加实体类:
private Integer id;
private String name;
private Integer age;
private String phone;
在实体类中引用lombo工具方便自动注入,
使用标签
@Data
@AllArgsConstructor
@NoArgsConstructor
2、创建接口以及业务层接口实现类
在pojo下新建query文件夹封装查询分页参数
private Integer pageNum = 1;//当前页码
private Integer pageSize = 2; //每一页的数量
private String name;//根据id查询
使用User一样交由lombok管理
在dao层中添加接口
创建interfa文件
使用标签
@Mapper //这是一个mybatis的mapper类
@Repository //将userdao交给spring管理
显示所有实体类数据
//查询所有用户
public List<User> listUser();
方法名为listUser。
使用用户名查询
public List<User> listUserByName(UserQuery userQuery);
在servic层中加入接口
使用用户名查询时并分页展示,则在service中传PageInfo对象。
public PageInfo<User> listUserByName(UserQuery userQuery);
放在interfa文件中
在UserServImpl中实现方法
用@Service标签来标记文件
添加方法,使用自动注入Dao接口
@Autowired
private UserDao userDao;
重写方法设置返回值
@Override
public List<User> listUser() {
return userDao.listUser();
}
@Override
public PageInfo<User> listUserByName(UserQuery userQuery) {
PageHelper.startPage(userQuery.getPageNum(),userQuery.getPageSize());
return new PageInfo<User>(userDao.listUserByName(userQuery));
}
写mySQL方法
在yml文件中使用mybatis控制数据库
mybatis:
type-aliases-package: com.pojo
mapper-locations: classpath:/mybatis/*xml
在/mybatis/*xml路径下创建UserMapper.xml文件,用于编写SQL语句控制数据库。
复制入头部
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
配置路径绑定接口
<mapper namespace="com.dao.UserDao">
</mapper>
在中间写入SQL语句
<!-- 搜索-->
<select id="listUser" resultType="com.pojo.User">
select * from mybatis.user;
</select>
<!-- 根据用户名搜索 -->
<select id="listUserByName" parameterType="com.pojo.query.UserQuery"
resultType="com.pojo.User">
select * from mybatis.user
<!--使用mybatis动态SQL判断-->
<where>
<if test="name != null and name != '' ">
and `name` like concat('%',{name},'%','%')
</if>
</where>
</select>
在Controller中调用
使用@Controller标签标注,@Autowired注入serviceceng
@GetMapping("/")
public String index(Model model, UserQuery userQuery){
PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
model.addAttribute("page",userPageInfo);
System.out.println(userPageInfo);
return "index";
}
@PostMapping("/")
public String listUserByName(Model model,UserQuery userQuery){
PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
model.addAttribute("page",userPageInfo);
return "index";
}
创建首页
在templates下创建index.html
模板地址:https://semantic-ui.com/
进行修改,跳转用Thymeleaf组件。
添加表单
使用th:来进行传输数据
使用¥{}来进行获取数据
<table class="ui celled table" style="margin-top:40px !important;">
<thead>
<tr><th>id</th>
<th>姓名</th>
<th>年龄</th>
<th>手机号码</th>
<th>操作</th>
</tr></thead>
<tbody>
<tr th:each="user : ${page.list}">
<td th:text="${user.id}"</td>
<td th:text="${user.name}"></td>
<!--<td th:text="${user.sex}"></td>-->
<td th:text="${user.age}"></td>
<td th:text="${user.phone}"></td>
</tr>
</tbody>
</table>
添加设计
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
三、数据库操作
1、在html中配置对应按钮配置接口
新建一个edit.html页面,
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<head>
<meta charset="UTF-8">
<title>修改用户</title>
</head>
<body>
<div class="ui container">
<form class="ui form" th:action="@{/edit}" method="post" th:object="${user}">
<input type="text" th:value="*{id}" name="id">
<div class="field">
<label>用户名</label>
<input type="text" name="name" placeholder="请输入用户名" required th:value="*{name}">
</div>
<div class="field">
<label>年龄</label>
<input type="text" name="age" placeholder="请输入年龄" required th:value="*{age}">
</div>
<div class="field">
<label>手机号码</label>
<input type="text" name="phone" placeholder="请输入手机号" required th:value="*{phone}" maxlength="11">
</div>
<button class="ui button" type="submit">提交</button>
</form>
<div class="ui success message m-bg" th:unless="${#strings.isEmpty(message)}">
<i class="close icon"></i>
<div class="header">提示:</div>
<p th:text="${message}"></p>
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
<script>
$(".message.close").on('click',function (){
$(this).closest(".message")
.transition("fade");
})
</script>
</body>
</html>
2、在dao层中写入接口
//根据id删除用户
public int deleteUserById(Integer id);
//根据id查询用户
public User queryUserId(Integer id);
//修改用户信息
public int updateUser(User user);
//新增用户
public int addUser(User user);
3、xml文件中写入sql语句方法
<!-- 删除-->
<delete id="deleteUserById" parameterType="int">
delete from mybatis.user where id =#{id}
</delete>
<!-- 编辑-->
<!-- 显示旧数据 -->
<select id="queryUserId" parameterType="int" resultType="com.pojo.User">
select * from mybatis.user where id =#{id}
</select>
<!-- 更新数据 -->
<update id="updateUser" parameterType="com.pojo.User">
update mybatis.user
set name = #{name}, age = #{age},phone = #{phone}
where id = #{id}
</update>
<!-- 新增用户 -->
<insert id="addUser" parameterType="com.pojo.User">
insert into mybatis.user(name, age, phone) value (#{name},#{age},#{phone})
</insert>
4、在service层中写入接口和实现类
接口:
//删除用户
public boolean deleteUserById(Integer id);
//根据id查询用户
public User queryUserId(Integer id);
//修改用户信息
public boolean updateUser(User user);
//新增用户
public boolean addUser(User user);
由于删除、新增和修改是通过判断是否执行方法,所以返回类型改为boolean类型。
重写方法
//删除
@Override
public boolean deleteUserById(Integer id) {
int i = userDao.deleteUserById(id);
if (i > 0) {
return true;
} else {
return false;
}
}
//显示旧数据
@Override
public User queryUserId(Integer id) {
return userDao.queryUserId(id);
}
//更新数据
@Override
public boolean updateUser(User user) {
int i =userDao.updateUser(user);
if (i>0){
return true;
}else{
return false;
}
}
//添加
@Override
public boolean addUser(User user) {
return userDao.addUser(user)>0 ? true:false ;
}
5、在controller中调用接口执行
删除:
//删除接口
@GetMapping("/delete/{id}")
public String delete(@PathVariable("id") Integer id, RedirectAttributes attributes ){
boolean b = userService.deleteUserById(id);
if(b){
attributes.addFlashAttribute("message","删除用户成功");
return "redirect:/";
}else
attributes.addFlashAttribute("message","删除用户失败");
return "redirect:/";
修改信息时显示原先数据,通过id进行查询
//显示界面
@GetMapping("/edit/{id}")
public String toEdit(@PathVariable Integer id,Model model){
model.addAttribute("user",userService.queryUserId(id));
return "editUser";
}
修改信息与新增信息为同一界面,则用if语句进行判定进行修改操作还是添加操作。使用if语句进行判定,使用id进行判定,如果有id值则进行修改操作,否则进行添加用户。
@PostMapping("/edit")
public String edit(User user,RedirectAttributes attributes,UserQuery userQuery){
Integer id = user.getId();
user.setName(user.getName());
PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
if(id != null){
if (userPageInfo.getSize() == 0){
boolean b = userService.updateUser(user);
if (b){
attributes.addFlashAttribute("message","更新用户成功");
return "redirect:/";
}else{
attributes.addFlashAttribute("message","更新用户失败");
return "redirect:/";
}
}else {
attributes.addFlashAttribute("message", "该用户名已存在");
return "redirect:/edit"+user.getId();
}
}else {
if (userPageInfo.getSize() == 0) {
boolean b = userService.addUser(user);
if (b) {
attributes.addFlashAttribute("message", "添加用户成功");
return "redirect:/";
} else {
attributes.addFlashAttribute("message", "添加用户失败");
return "redirect:/";
}
} else {
attributes.addFlashAttribute("message", "该用户名已存在");
return "redirect:/";
}
}
}
//添加员工
@GetMapping("/update")
public String toUpdate(Model model){
User user = new User();
model.addAttribute("user",user);
return "editUser";
}
}