- 搭建SpringBoot项目环境
- 用脚手架搭建项目
- 选择依赖(对于Mysql版本为8.0+的,mysql驱动一定要8.0+,本人选择8.0.13,否则肯定会报错的)
- 还要在pom文件中配置Druid数据源依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency>
- 将application.properties的扩展名改为yml,我们使用yml格式的文件进行配置,并配置数据源
- 用脚手架搭建项目
spring:
datasource:
url: jdbc:mysql://localhost:3306/ems_thymeleaf?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
username: root
password: ****
type: com.alibaba.druid.pool.DruidDataSource
server:
port: 8989
servlet:
context-path: /mybatis
mybatis:
# 可以用User 也可以用user ,不用在写全限定类名
type-aliases-package: cn.whu.entity
# 指定mapper配置文件位置
mapper-locations: classpath:mapper/*.xml
mapper.xml文件中resultMap的type、parameterType、resultType会引用一些实体类,我们需要写上全限定类名,如果不写全限定类名,只写一个实体类的名称的话,那就需要在application.yml文件中设置mybatis:type-aliases-package参数;
如何扫描dao接口所在的包嘞?
@SpringBootApplication
//在入口上加MapperScan来标记dao接口包的位置
@MapperScan("cn.whu.dao")
public class BootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(BootmybatisApplication.class, args);
}
}
- 建表
- 写实体类
package cn.whu.entity;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private Date birthday;
private String username;
private String address;
private char sex;
}
Lombok常用的几个注解:
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
- Dao接口
- 先写一个基本数据库操作的接口BaseDao
package cn.whu.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(Integer id);
T findById(Integer id);
List<T> findAll();
Long findTotalCounts();
// 参数1:起始条数 参数2:每页显示记录数据
List<T> findByPage(@Param("start") Integer start, @Param("size") Integer size);
}
- 在写UserDao继承BaseDao
package cn.whu.dao;
import cn.whu.entity.User;
public interface UserDao extends BaseDao<User>{
}
- Mapper配置文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.whu.dao.UserDao">
<insert id="save" parameterType="user">
insert into user values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<select id="findAll" resultType="User">
select id,username,birthday,sex,address from user
</select>
</mapper>
注意:Mapper文件夹在resources文件夹下,所有mapper配置文件都放在这里面,classpath就是resources文件夹
- Services接口
在service包中定义UserService接口
package cn.whu.service;
import cn.whu.entity.User;
import java.util.List;
public interface UserService {
void save(User user);
List<User> findAll();
}
- Services实现类
在service包下写UserService接口的实现类
package cn.whu.service;
import cn.whu.dao.UserDao;
import cn.whu.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;
import java.util.UUID;
//@Service用于标注业务层组件
@Service
//如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来
//我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userdao;
@Override
public void save(User user) {
// UUID.randomUUID()该方法返回一个包含字符的Id,只能toString不能变成Integer
// user.setId(UUID.randomUUID().toString())
user.setId(14);
userdao.save(user);
}
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public List<User> findAll() {
return userdao.findAll();
}
}
- controller层传Json数据
- 添加fastJson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2.写UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
//查询所有
@GetMapping("/findAll")
public String findAll(){
List<User> users = userService.findAll();
String json= JSON.toJSONString(users);
return json;
}
}
RestController与Controller的区别:
- @RestController注解相当于@ResponseBody + @Controller合在一起的作用
- 使用@Controller 注解在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面,如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
- 用@Controller,返回的是页面;@Controller加上@ResponseBody,返回的是JSON、XML或其他文本。
- 用@RestController,意味着这个Controller的所有方法上面都加了@ResponseBody,不论你在每个方法前加、或不加@ResponseBody,都一样。所以它不会返回页面。
- @RestController是一种restful风格的Controller
- 结果展示