SpringBoot 2.x (9):整合Mybatis注解实战
SSM框架再熟悉不过了,不过以前通常是使用XML写SQL语句
这里用SpringBoot整合Mybatis并且使用注解进行开发
依赖:
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
配置:不需要指定驱动类,SpringBoot会自动扫描:com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=xuyiqing
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
user表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
`phone` varchar(16) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`age` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对应实体类:
package org.dreamtech.springboot.domain;
import java.util.Date;
public class User {
private int id;
private String name;
private String phone;
private int age;
private Date createTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", phone=" + phone + ", age=" + age + ", createTime=" + createTime
+ "]";
}
}
添加用户的Demo做整合
Mapper:
package org.dreamtech.springboot.mapper; import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.dreamtech.springboot.domain.User; public interface UserMapper {
@Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name},#{phone},#{createTime},#{age})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insert(User user);
}
Service:
package org.dreamtech.springboot.service;
import org.dreamtech.springboot.domain.User;
public interface UserService {
int add(User user);
}
package org.dreamtech.springboot.service.impl; import org.dreamtech.springboot.domain.User;
import org.dreamtech.springboot.mapper.UserMapper;
import org.dreamtech.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper; @Override
public int add(User user) {
userMapper.insert(user);
int id = user.getId();
return id;
} }
Controller:
package org.dreamtech.springboot.controller; import java.util.Date; import org.dreamtech.springboot.domain.User;
import org.dreamtech.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; @GetMapping("/add")
private Object add() {
User user = new User();
user.setAge(18);
user.setCreateTime(new Date());
user.setName("admin");
user.setPhone("100000");
userService.add(user);
return user;
}
}
最后别忘了一个细节:在启动类加上Mapper扫描注解
package org.dreamtech.springboot; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan("org.dreamtech.springboot.mapper")
public class SpringbootApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
} }
启动后访问localhost:8080/user/add
测试成功!
继续完成增删改查
有时候,开发者希望能够在控制台打印SQL语句,需要加一行配置文件
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
CRUD完整实现:
package org.dreamtech.springboot.mapper; import java.util.List; import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.dreamtech.springboot.domain.User; public interface UserMapper {
/**
* 插入对象
*
* @param user 对象
* @return int
*/
@Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name},#{phone},#{createTime},#{age})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insert(User user); /**
* 查找全部
*
* @return
*/
@Select("SELECT * FROM user")
@Results({ @Result(column = "create_time", property = "createTime", javaType = java.util.Date.class) })
List<User> getAll(); /**
* 根据ID找对象
*
* @param id ID
* @return
*/
@Select("SELECT * FROM user WHERE id=#{id}")
@Results({ @Result(column = "create_time", property = "createTime", javaType = java.util.Date.class) })
User findById(Long id); /**
* 更新对象
*
* @param user 对象
* @return
*/
@Update("UPDATE user SET name=#{name} WHERE id=#{id}")
int update(User user); /**
* 根据ID删除对象
*
* @param id ID
* @return
*/
@Delete("DELETE FROM user WHERE id=#{id}")
int delete(Long id);
}
package org.dreamtech.springboot.service;
import java.util.List;
import org.dreamtech.springboot.domain.User;
public interface UserService {
int add(User user);
List<User> getAll();
User findById(Long id);
int update(User user);
int delete(Long id);
}
package org.dreamtech.springboot.service.impl; import java.util.List; import org.dreamtech.springboot.domain.User;
import org.dreamtech.springboot.mapper.UserMapper;
import org.dreamtech.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper; @Override
public int add(User user) {
userMapper.insert(user);
int id = user.getId();
return id;
} @Override
public List<User> getAll() {
return userMapper.getAll();
} @Override
public User findById(Long id) {
return userMapper.findById(id);
} @Override
public int update(User user) {
return userMapper.update(user);
} @Override
public int delete(Long id) {
return userMapper.delete(id);
} }
package org.dreamtech.springboot.controller; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.dreamtech.springboot.domain.User;
import org.dreamtech.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; private Map<String, Object> modelMap = new HashMap<String, Object>(); @GetMapping("/add")
private Object add() {
User user = new User();
user.setAge(18);
user.setCreateTime(new Date());
user.setName("admin");
user.setPhone("100000");
userService.add(user);
return user;
} @GetMapping("/getall")
private Object getAll() {
modelMap.clear();
List<User> list = userService.getAll();
if (list.size() > 0) {
modelMap.put("users", list);
modelMap.put("success", true);
} else {
modelMap.put("success", false);
}
return modelMap;
} @GetMapping("/findbyid")
private Object findById(Long id) {
if (id == null || id < 0) {
modelMap.put("success", false);
}
modelMap.clear();
User user = userService.findById(id);
if (user != null) {
modelMap.put("success", true);
modelMap.put("user", user);
} else {
modelMap.put("success", false);
}
return modelMap;
} @GetMapping("/update")
private Object update() {
modelMap.clear();
User user = new User();
user.setId(1);
user.setName("newAmdin");
int effectedNum = userService.update(user);
if (effectedNum > 0) {
modelMap.put("success", true);
} else {
modelMap.put("success", false);
}
return modelMap;
} @GetMapping("/delete")
private Object delete(Long id) {
if (id == null || id < 0) {
modelMap.put("success", false);
}
modelMap.clear();
int effectedNum = userService.delete(id);
if (effectedNum > 0) {
modelMap.put("success", true);
} else {
modelMap.put("success", false);
}
return modelMap;
}
}
事务:
如果用到事务相关的内容,需要在Service层加入一个注解@Transactional
@Transactional(propagation = Propagation.REQUIRED)
SpringBoot 2.x (9):整合Mybatis注解实战的更多相关文章
- SpringBoot数据访问之整合mybatis注解版
SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...
- springBoot 整合 mybatis 项目实战
二.springBoot 整合 mybatis 项目实战 前言 上一篇文章开始了我们的springboot序篇,我们配置了mysql数据库,但是我们sql语句直接写在controller中并且使用 ...
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...
- springboot整合mybatis(注解)
springboot整合mybatis(注解) 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> ...
- Springboot 2.0.4 整合Mybatis出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
在使用Springboot 2.0.4 整合Mybatis的时候出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are require ...
- 二、springBoot 整合 mybatis 项目实战
前言 上一篇文章开始了我们的springboot序篇,我们配置了mysql数据库,但是我们sql语句直接写在controller中并且使用的是jdbcTemplate.项目中肯定不会这样使用,上篇文章 ...
- Spring Boot整合Mybatis(注解方式和XML方式)
其实对我个人而言还是不够熟悉JPA.hibernate,所以觉得这两种框架使用起来好麻烦啊. 一直用的Mybatis作为持久层框架, JPA(Hibernate)主张所有的SQL都用Java代码生成, ...
- SpringBoot数据访问之整合Mybatis配置文件
环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...
- (入门SpringBoot)SpringBoot项目数据源以及整合mybatis(二)
1.配置tomcat数据源: # 数据源基本配置spring.datasource.url=jdbc:mysql://localhost:3306/shoptest?useUnicode=true ...
随机推荐
- Spring 事务管理高级应用难点剖析: 第 2 部分
本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 2 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括混合使用多种数据访问技术(如 Spring JD ...
- codevs 1143 纪念品分组
1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description ...
- C结构体、C++结构体、C++类的区别
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...
- IOS造成卡顿的主要原因
1. cellForRowAtIndexPath, 单元格视图重用, 注意尽量让所有视图重用, 只根据单元格row和section的不容更换不同的数据, 而不是每次都生成新的单元格, 这是程序奔溃的前 ...
- 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归
标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...
- Code:NFine目录
ylbtech-Code:NFine目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylb ...
- web数据存储
数据的存储必然是任何网站必须经历的事,我们可以将数据存放在不同地方,数据库.文件.内存.程序本身.cookie,session中都可以,但是只要需要持久化保留的数据,那么最终肯定还是落在磁盘之上的,我 ...
- 使用基于Caffe的MobileNet分类踩坑备忘录
首先要帮Caffe甩个锅:Caffe对图像处理进行了很高明的封装,以protobuffer形式组织的搭积木式的网络构建也很灵活方便,这里的坑都是自己腿不好,走路不稳崴进去的. 1. Caffe的一个i ...
- 一、使用 BeautifulSoup抓取网页信息信息
一.解析网页信息 from bs4 import BeautifulSoup with open('C:/Users/michael/Desktop/Plan-for-combating-master ...
- UVaLive 6847 Zeroes (找规律,水题)
题意 :给定一个范围,然后让你求在这个范围内所有的数的阶乘末尾0的个数有多少种. 析:找规律,写几个就会发现每隔5个会增加一个0,因为要么乘10了,要么乘5了. 代码如下: #pragma comme ...