SpringBoot整合mybatis框架
-
Spring框架整合mybatis回顾
-
引入依赖
-
spring mybatis
-
mybatis-spring
-
jar
-
mysql
-
druid
-
lombook
-
log4j
-
建表
-
开发实体类
-
DAO接口
-
Mapper映射文件
-
书写Service接口
-
书写Service实现类 @Service @Transactional 注入DAO相关对象
-
配置spring.xml
-
引入小配置文件
-
开启注解扫描
-
创建数据源对象 DruidDataSource driverClassName url username pwssword
-
创建sqlSessionFactory 注入Datasource 注入Mapper配置文件位置
-
创建DAO MapperScannerconfigurer 注SqlSessionFactory 注入DAO接口所在包,SqlSessionFactory.opensession().getMapper(UserDAO.class)
-
创建事务管理器 DAtaSourceTransactionManager 注入DataSource
-
开启注解事务生效
-
SpringBoot整合mybatis
-
引入依赖
-
mybatis-springboot-starter (自动依赖mybatis核心)
-
mysql
-
druid
-
lombook
<!-- 引入Mysql的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 引入mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.3</version>
</dependency>
<!-- 引入druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!-- 引入lombok,不是必须的,提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
-
-
配置springboot配置文件整合mybatis
-
引入小配置文件和开启注解扫描都SpringBoot自动做完了
-
下面是,创建数据源对象 DruidDataSource driverClassName url username pwssword
-
还有 创建sqlSessionFactory 注入Datasource 注入Mapper配置文件位置
-
-
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/project?useSSL=false&characterEncoding=UTF-8
username: mysql
password: 123456
mybatis:
mapper-locations: classpath:com/asimple/mapper/*.xml
# The name is the same as the class name or the letter of the class name. User|user
type-aliases-package: com.asimple.entity
# SqlSessionFactory as other name
-
- 入口类加入DAO接口的扫描注解 @MapperScan(DAO地址)
// Application.java
@SpringBootApplication
@MapperScan("com.asimple.dao")
public class Application {
//main函数
public static void main(String[] args){
//启动SpringBoot应用
//参数1:入口类的类对象, 参数2:main函数参数
SpringApplication.run(Application.class, args);
}
}
-
-
建表
-
使用Navicat在Mysql数据库中,新建test中的表 user用作实验,表中包含三条user数据
-
-
实体类
-
-
entity包中新建user类
-
-
package com.asimple.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@Data
@Accessors(chain = true)
//用户类
public class User {
private String U_id;
private String U_pwd;
public User(){}
public User(String u_id, String u_pwd) {
this.U_id = u_id;
this.U_pwd = u_pwd;
}
public String getU_id() {
return U_id;
}
public void setU_id(String u_id) {
U_id = u_id;
}
public String getU_pwd() {
return U_pwd;
}
public void setU_pwd(String u_pwd) {
U_pwd = u_pwd;
}
}
-
-
DAO接口
-
新建BaseDAO接口,用于其他DAO实现
-
-
package com.asimple.dao;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BaseDAO<T> {
//增加数据
void save(T t);
//更新数据
void update(T t);
//删除数据
void delete(String id);
//通过id查找
T findById(String id);
//查找所有的信息
List<T> findAll();
//统计信息的总条数
Long findTotalCounts();
//这里得@Param是因为要用mybatis传多个参数,所以用@Param传过来
//@Param是mybatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解
//作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳
//参数1:起始条数 参数2:每页显示记录数据
List<T> findByPage(@Param("start") Integer start, @Param("size") Integer size);
}
-
-
- 新建UserDAO接口,继承上述的BaseDAO接口(接口继承接口,类继承类,类实现接口)
-
package com.asimple.dao;
import com.asimple.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDAO extends BaseDAO<User>{
@Override
void save(User user);
@Override
void delete(String id);
@Override
User findById(String id);
@Override
void update(User user);
@Override
List<User> findAll();
@Override
Integer findTotalCounts();
@Override
List<User> findByPage(Integer start, Integer size);
}
-
-
Mapper配置文件
-
由于上面配置mybatis的时候,写的是type-aliases-package: com.asimple.entity
-
所以在resources的目录下新建com/asimple/mapper,在mapper中新建UserDAOMapper.xml(这里的Mapper是自己手动建立的Templates ,UserDAOMapper.xml的名字不一定要跟DAO一样,重要的是里面的< mapper namespace >写的是指定的 UserDAO 就行)
-
-
<?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.asimple.dao.UserDAO">
<!-- parameterType: 传入参数,没有的话也没关系,resultType: 返回类型,会自动匹配字段属性,可以是类,也可以是基本变量等等
实体类的属性最好跟数据库一样,不容易出错 -->
<insert id="save" parameterType="com.asimple.entity.User">
insert into user values(#{U_id}, #{U_pwd})
</insert>
<select id="findAll" resultType="com.asimple.entity.User">
select * from user
</select>
</mapper>
-
-
Service接口(业务层)
-
新建 service 包
-
新建 UserService 接口(这边只举例两个方法)
- 新建userServiceImpl,Service实现类 @Service @Transactional 注入DAO
-
-
package com.asimple.service;
import com.asimple.entity.User;
import java.util.List;
public interface UserService {
void save(User user);
List<User> findAll();
}
package com.asimple.service;
import com.asimple.dao.UserDAO;
import com.asimple.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public void save(User user) {
userDAO.save(user);
}
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public List<User> findAll() {
List<User> list = userDAO.findAll();
return list;
}
}
-
- 书写Controller类并跳转html页面
package com.asimple.controller;
import com.asimple.entity.User;
import com.asimple.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
//查找所有数据,并转发给前端
@RequestMapping("/findAll")
public String findAll(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users);
return "showAll";
}
//从前端获取数据,保存注册用户信息
@PostMapping("/save")
public String save(
@RequestParam(value = "id", required = false) String id,
@RequestParam(value = "pwd", required = false) String pwd
){
System.out.println("------------- save User ---------------");
userService.save(user);
//注册完跳转登录界面
return "login";
}
}
-
- Thymeleaf 模板的 .html 文件,这里新建名为 thymeleaf.html文件,存放位置 src/main/resources/templates/thymeleaf.html
<!DOCTYPE HTML>
<!-- 导入thymeleaf -->
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<head>
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<!-- th:href = '@{/css/success.css}' 中的css前面的 / 不能省略,会报错 -->
<link type='text/css' rel='styleSheet' th:href='@{/css/success.css}'/>
<script th:src="@{/js/test.js}"></script>
</head>
<body>
<!-- form表单提交 action="控制器的地址,类似网页" method="提交方式,推荐post"-->
<form th:action="@{/user/save}" method="post">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
Id:<input type="text" name="id">
</tr>
<tr>
Pwd:<input type="password" name="pwd">
</tr>
</table>
<!-- 使用submit提交表单 -->
<input type="submit" value="提交">
</form>
<!-- 从链接跳转Controller,在/zq 项目目录下相对定位,我的项目目录是/zq, http://localhost:8989/zq/ -->
<a th:href="@{/user/findAll}">查找所有用户</a>
</body>
</html>