SpringBoot 整合Mybatis
步骤一:
在pom.xml文件中添加mybatis的依赖
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
步骤二:
创建数据库:
CREATE TABLE `User` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`userName` varchar(255) DEFAULT NULL COMMENT '真实姓名',
`userAccount` varchar(255) DEFAULT NULL COMMENT '登录帐号',
`userPassword` varchar(255) NULL COMMENT '登录密码',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`modifyTime` datetime DEFAULT NULL COMMENT '修改时间',
`telNum` varchar(255) DEFAULT NULL COMMENT '手机号码',
`gender` varchar(255) DEFAULT NULL COMMENT '性别;0:女;1:男',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
为数据库表初始化数据:
INSERT INTO `spb`.`user` (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
('悟空', 'wukong', '123123', NOW(), NOW(), '18764472970', 1, 1992-05-21, 'wukong@163.com');
INSERT INTO `spb`.`user` (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
('唐僧', 'tangseng', '123123', NOW(), NOW(), '18764472970', 1, 1992-05-21, 'tangseng@163.com');
INSERT INTO `spb`.`user` (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
('八戒', 'bajie', '123123', NOW(), NOW(), '18764472970', 1, 1992-05-21, 'bajie@163.com');
INSERT INTO `spb`.`user` (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
('沙僧', 'shaseng', '123123', NOW(), NOW(), '18764472970', 1, 1992-05-21, 'shaseng@163.com');
INSERT INTO `spb`.`user` (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
('白龙马', 'bailongma', '123123', NOW(), NOW(), '18764472970', 1, 1992-05-21, 'bailongma@163.com');
步骤三:
创建User实体:
/**
* @Data 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法(很多公司不使用lombok插件,虽然简化了代码,但不够灵活)
* 优点:1、提高了一定的开发效率
* 2、让代码变得简洁,不用过多的去关注相应的方法
* 3、属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
* 缺点:1、不支持多种参数构造器的重载
* 2、虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
*
* Lombok插件它在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变相的说它就是在改变java语法,它改变了你编写源码的方式,
* 它不像 spring 的依赖注入一样是运行时的特性,而是编译时的特性。(我不建议使用,主要还是看在实际开发中,看项目要求吧)
*/
@Data
@NoArgsConstructor //无参构造函数
@AllArgsConstructor//有参构造(全字段)
@Accessors(chain = true)//链式; 存取器。通过该注解可以控制getter和setter方法的形式。
public class User {
private Long id;//主键
private String userName;//真实姓名
private String userAccount;//登录帐号
private String userPassword;//登录密码
private Date createTime;//创建时间
private Date modifyTime;//修改时间
private String telNum;//手机号码
private Integer gender;//性别;0:女;1:男
private Date birthday;//生日
private String email;//邮箱
}
步骤四:
创建mapper包并创建接口UserMapper.java
/**
* 持久层
*/
@Mapper
@Repository
public interface UserMapper {
// 新增用户信息
Long insert(User user);
//更新用户信息
boolean update(User user);
//删除用户信息
boolean delete(Long id);
//通过id查询用户信息
User getUserById(Long id);
//查询用户列表
List<User> getUsers(Map<String, Object> queryMap);
}
步骤五:
在resource下分别创建 mybatis目录、mapper目录并创建mybatis配置文件和用户的映射文件
1)在mybatis目录中创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
2)在mybatis目录中创建mapper目录,并创建用户的映射文件UserMapper.xml
<?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.java.spb.mapper.UserMapper">
<!-- 新增 -->
<insert id="insert" parameterType="user">
INSERT INTO User (`userName`, `userAccount`, `userPassword`, `createTime`, `modifyTime`, `telNum`, `gender`, `birthday`, `email`)
VALUES
(#{userName},#{userAccount},#{userPassword},#{createTime},#{modifyTime},#{telNum},#{gender},#{birthday})
</insert>
<!--修改-->
<update id="update" parameterType="user">
UPDATE User
<set>
<if test="userName !=null and userName !=''">
User.userName=#{userName},
</if>
<if test="userAccount !=null and userAccount !=''">
User.userAccount=#{userAccount},
</if>
<if test="userPassword !=null and userPassword !=''">
User.userPassword=#{userPassword},
</if>
<if test="createTime !=null and createTime !=''">
User.createTime=#{createTime},
</if>
<if test="modifyTime !=null and modifyTime !=''">
User.modifyTime=#{modifyTime},
</if>
<if test="telNum !=null and telNum !=''">
User.telNum=#{telNum},
</if>
<if test="gender !=null and gender !=''">
User.gender=#{gender},
</if>
<if test="birthday !=null and birthday !=''">
User.birthday=#{birthday},
</if>
<if test="email !=null and email !=''">
User.email=#{email},
</if>
</set>
WHERE id=#{id}
</update>
<!--删除-->
<delete id="delete" parameterType="Long">
delete from User where id=#{id}
</delete>
<!--根据id查询-->
<select id="getUserById" parameterType="Long" resultType="user">
select * from User where id=#{id}
</select>
<!--查询用户列表-->
<select id="getUsers" parameterType="Map" resultType="user">
select * from User
<where>
1=1
<if test="userName != null and userName !=''">
AND User.userName=#{userName}
</if>
<if test="userAccount != null and userAccount !=''">
AND User.userAccount=#{userAccount}
</if>
</where>
</select>
</mapper>
步骤六:
application.yml配置mybatis信息
server:
port: 80 #设置端口
#数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource #指定要使用的数据源类型
driver-class-name: com.mysql.cj.jdbc.Driver #数据库驱动
url: jdbc:mysql://localhost:3306/spb?useUnicode=true&characterEncoding=utf-8 #数据库连接url
username: root #数据库用户名
password: root #数据库密码
#mybatis配置
mybatis:
config-location:classpath: mybatis/mybatis-config.xml
type-aliases-package: com.java.spb.bean
mapper-locations: classpath:mybatis/mapper/*.xml
步骤七:
1)创建service包,并创建UserService.java
/**
* 用户服务接口
*/
public interface UserService {
//方法省略,请参考UserMapper.java中的方法
}
2)在service包下创建impl包,并创建UserServiceImpl.java
/**
* 用户服务实现类
*/
@Service
public class UserServiceImpl implements UserService {
//注入持久层
@Autowired
private UserMapper userMapper;
@Override
public Long insert(User user) {
Date date = new Date();//新增时创建时间和修改时间应该是一样的
user.setCreateTime(date);//创建时间
user.setModifyTime(date);//修改时间
return userMapper.insert(user);
}
@Override
public boolean update(User user) {
user.setModifyTime(new Date());//修改时间
return userMapper.update(user);
}
@Override
public boolean delete(Long id) {
return userMapper.delete(id);
}
@Override
public User getUserById(Long id) {
return userMapper.getUserById(id);
}
@Override
public List<User> getUsers(Map<String, Object> queryMap) {
return userMapper.getUsers(queryMap);
}
}
步骤八:创建controller包,并创建UserController.java
/**
* 控制层
*/
@RestController //@RestController = @Controller + @ResponseBody
public class UserController {
/**
* @Autowired和@Resource区别(面试时可能会问到):
* 相同点:@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
* 不同点:
* 1)提供方:
* @Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;
* @Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
* 2)注入方式:
* @Autowired只按照byType 注入;
* @Resource默认按byName自动注入,也提供按照byType 注入;
* 3)属性:
* @Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
* 如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
* @Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,
* 即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
* 需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时,
* @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
*/
//注入用户服务层
@Autowired
private UserService userService;
/**
* Spring4.3中引进了{@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping}
* 来帮助简化常用的HTTP方法的映射 并更好地表达被注解方法的语义
*
* @GetMapping: 处理get请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)
* 新方法可以简写为: @GetMapping("/get/{id}")
* @PostMapping: 处理post请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”,method = RequestMethod.POST)
* 新方法可以简写为: @PostMapping("/get/{id}")
* @PutMapping: 和PostMapping作用等同,都是用来向服务器提交信息。如果是添加信息,倾向于用@PostMapping,
* 如果是更新信息,倾向于用@PutMapping。两者差别不是很明显。
* @DeleteMapping 删除URL映射,具体没有再实践中用过,不知道好在什么地方
*
* get请求特点:
* a. 请求参数会添加到请求资源路径的后面,只能添加少量参数(因为请求行只有一行,大约只能存放2K左右的数据)
* b. 请求参数会显示在浏览器地址栏,路由器会记录请求地址 (极为的不安全)
* c.如果传输中文,必定会乱码(原因:get请求默认编码格式为:IIO-8859-1,后台编码格式一般为:GBK或者UTF-8)
* post请求的特点:
* a. 请求参数添加到实体内容里面,可以添加大量的参数(也解释了为什么浏览器地址栏不能发送post请求,在地址栏里我们只能填写URL,并不能进入到Http包的实体当中)
* b. 相对安全,但是,post请求不会对请求参数进行加密处理(可以使用https协议来保证数据安全)
*/
/**
* 获取用户列表
*/
@GetMapping("/getUsers")
public List<User> getUsers(Map<String, Object> queryMap){
List<User> users = userService.getUsers(queryMap);
return users;
}
/**
* 新增用户信息
*/
@PostMapping("/insert")
public String insertUser(@RequestBody User user){
Long insert = userService.insert(user);
return insert>0?"新增成功"+insert:"新增失败" + insert;
}
/**
* 根据用户id查询信息
* 传参形式使用Restful
*/
@GetMapping("/getUser/{id}")
public User getUserById(@PathVariable("id") Long id){
User userInfo = userService.getUserById(id);
return userInfo;
}
/**
* 根据id删除用户信息
*/
@DeleteMapping("/delete/{id}")
public String deleteById(@PathVariable("id") Long id){
boolean delete = userService.delete(id);
return delete==true?"删除成功":"删除失败";
}
}
步骤九:
下面介绍一个接口测试工具Postman,使用Postman挑一个接口来测试一下:
测试获取用户列表,路径:http://localhost/getUsers
关于SpringBoot 整合Mybatis,以及测试就到这里完事了。
如有疑问或问题,请批评指正。