SpringBoot整合Mybatis之Annotation
首先需要下载前面一篇文章的代码,在前一章代码上进行修改.
SpringBoot整合Mybatis(注解方式)
复制前一个项目,修改配置文件,mybatis的相关配置为:
mybatis:
type-aliases-package: con.mybatis.springboot_mybatis.model
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
使用注解方式修改mapper
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column="user_sex",javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name",javaType = String.class)
})
List<User> getAll();
@SelectProvider(type = UserSql.class,method = "getList")
List<User> getList(UserParam userParam);
@SelectProvider(type = UserSql.class,method = "getCount")
int getCount(UserParam userParam);
/*注意$与#的区别*/
@Select("SELECT * FROM users WHERE user_sex = #{user_sex}")
List<User> getListByUserSex(@Param("user_sex") String userSex);
@Select("SELECT * FROM users WHERE username=#{username} AND user_sex = #{user_sex}")
List<User> getListByNameAndSex(Map<String, Object> map);
@Select("SELECT * FROM users WHERE ID = #{id}")
@Results({
@Result(property = "userSex", column="user_sex",javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name",javaType = String.class)
})
User getOne(Long id);
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName},#{passWord},#{userSex})")
void insert(User user);
@UpdateProvider(type = UserSql.class,method = "update")
int update(User user);
@Update({"<script> ",
"UPDATE users ",
"<set>" ,
" <if test='userName != null'>userName=#{userName},</if>" ,
" <if test='nickName != null'>nick_name=#{nickName},</if>" ,
" </set> ",
"where id=#{id} " ,
"</script>"})
int updateUser(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
int delete(Long id);
}
动态sql类:
public class UserSql {
private static final Logger log = LoggerFactory.getLogger(UserSql.class);
public String getList(UserParam userParam) {
StringBuffer sql = new StringBuffer("select id, userName, passWord, user_sex as userSex, nick_name as nickName");
sql.append(" from users where 1=1 ");
if (userParam != null) {
if (!StringUtils.isEmpty(userParam.getUserName())) {
sql.append(" and userName = #{userName}");
}
if (!StringUtils.isEmpty(userParam.getUserSex())) {
sql.append(" and user_sex = #{userSex}");
}
}
sql.append(" order by id desc");
sql.append(" limit " + userParam.getBeginLine() + "," + userParam.getPageSize());
log.info("getList sql is :" +sql.toString());
return sql.toString();
}
public String getCount(UserParam userParam) {
String sql= new SQL(){{
SELECT("count(1)");
FROM("users");
if (!StringUtils.isEmpty(userParam.getUserName())) {
WHERE("userName = #{userName}");
}
if (!StringUtils.isEmpty(userParam.getUserSex())) {
WHERE("user_sex = #{userSex}");
}
//从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接
}}.toString();
log.info("getCount sql is :" +sql);
return sql;
}
public String update(User user) {
String sql = new SQL() {{
UPDATE("users");
if(!StringUtils.isEmpty(user.getNickName())){
SET("nick_name=#{nickName}");
}
if(!StringUtils.isEmpty(user.getUserName())) {
SET("userName=#{userName}");
}
if(!StringUtils.isEmpty(user.getPassWord())) {
SET("passWord=#{passWord}");
}
if(!StringUtils.isEmpty(user.getUserSex())) {
SET("user_sex=#{userSex}");
}
WHERE("id=#{id}");
}}.toString();
return sql;
}
}
最后测试类(多添加了两个方法,一个传递String,另一个是传递map):
@SpringBootTest
@RunWith(SpringRunner.class)
public class MybatisAnnoTest {
@Resource
private UserMapper userMapper;
@Test
public void testInsert() {
userMapper.insert(new User("dd", "a123456", UserSexEnum.MAN));
// The total number of data in the database
Assert.assertEquals(3, userMapper.getAll().size());
}
@Test
public void testUpdate() {
long id=4l;
User user = userMapper.getOne(id);
if(user!=null){
System.out.println(user.toString());
user.setNickName("wzlove");
userMapper.update(user);
Assert.assertTrue(("wzlove".equals(userMapper.getOne(id).getNickName())));
}else {
System.out.println("not find user id="+id);
}
}
@Test
public void testDelete() {
int count=userMapper.delete(2l);
if(count>0){
System.out.println("delete is sucess");
}else {
System.out.println("delete if failed");
}
}
@Test
public void findAll(){
UserParam userParam = new UserParam();
userParam.setCurrentPage(0);
userParam.setPageSize(1);
List<User> list = userMapper.getList(userParam);
System.out.println(list.get(0));
Assert.assertEquals(1,list.size());
}
@Test
public void testGetListByUserSex(){
String userSex = "MAN";
List<User> userLists = userMapper.getListByUserSex(userSex);
Assert.assertEquals(2,userLists.size());
}
@Test
public void testGetListByNameAndSex(){
Map<String,Object> condition = new HashMap<>(2);
condition.put("username","dd");
condition.put("user_sex","MAN");
List<User> userList = userMapper.getListByNameAndSex(condition);
Assert.assertEquals(1,userList.size());
}
}
SpringBoot整合Mybatis到这里就总结完了,这里都没有考虑到多数据源的问题,所以有需求的看pdf文档就好.
SpringBoot整合Mybatis也就是两种方式,一种是xml的方式,另一种是注解的方式. 注解方式中需要注意的是动态sql的写法. xml中注意的是mapper的路径等的注意. 了解myabtis的一个执行流程. SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession -> Executor -> sql对象 -> 执行返回结果,完毕
源码地址: https://github.com/MissWangLove/SpringBoot
SpringBoot整合Mybatis之Annotation的更多相关文章
- SpringBoot整合Mybatis【非注解版】
接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 选择Spring Initializr,配置JDK版本 输入项目名 选择构建web项目所需的state ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
- springBoot整合mybatis、jsp 或 HTML
springBoot整合mybatis.jsp Spring Boot的主要优点: 1: 为所有Spring开发者更快的入门: 2: 开箱即用,提供各种默认配置来简化项目配置: 3: 内嵌式容器 ...
- SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...
- SpringBoot整合Mybatis完整详细版二:注册、登录、拦截器配置
接着上个章节来,上章节搭建好框架,并且测试也在页面取到数据.接下来实现web端,实现前后端交互,在前台进行注册登录以及后端拦截器配置.实现简单的未登录拦截跳转到登录页面 上一节传送门:SpringBo ...
- SpringBoot整合Mybatis完整详细版
记得刚接触SpringBoot时,大吃一惊,世界上居然还有这么省事的框架,立马感叹:SpringBoot是世界上最好的框架.哈哈! 当初跟着教程练习搭建了一个框架,传送门:spring boot + ...
- SpringBoot 2.SpringBoot整合Mybatis
一.创建Springboot的配置文件:application.properties,并添加MyBatis依赖 SpringApplication 会从 application.properties ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...
- SpringBoot整合Mybatis多数据源 (AOP+注解)
SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...
随机推荐
- Swoole Timer 的应用
目录 你好,Swoole Timer 应用场景 参考文档 你好,Swoole PHP 的协程高性能网络通信引擎,使用 C/C++ 语言编写,提供了多种通信协议的网络服务器和客户端模块. Swoole ...
- 服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka
原文:https://blog.csdn.net/dengyisheng/article/details/71215234 服务发现比较:Consul vs Zookeeper vs Etcd vs ...
- 预定义的类型“System.Object”未定义或未导入
打开一个以前的程序 ,发现报这个错误.检查了程序,发现程序的引用 System 不见了 ,尝试 引用失败.. 查了有人说重新建立 Sln文件有用.. 一头雾水,随后 尝试操作 ,程序有用了 具体步骤: ...
- [Deep-Learning-with-Python]计算机视觉中的深度学习
包括: 理解卷积神经网络 使用数据增强缓解过拟合 使用预训练卷积网络做特征提取 微调预训练网络模型 可视化卷积网络学习结果以及分类决策过程 介绍卷积神经网络,convnets,深度学习在计算机视觉方面 ...
- ILSVRC2016目标检测任务回顾——视频目标检测(VID)
转自知乎<深度学习大讲堂> 雷锋网(公众号:雷锋网)按:本文作者王斌,中科院计算所前瞻研究实验室跨媒体计算组博士生,导师张勇东研究员.2016年在唐胜副研究员的带领下,作为计算所MCG-I ...
- C++学习之从C到C++
头文件的包含 包含头文件可以不加.h结尾,如iostream,一些常用的头文件在引用时可以不加.h后缀,并在开头增加c,如: #include <cstdio> #include < ...
- 牛客网NOIP赛前集训营-提高组(第八场)-B-推箱子[最短路优化建图]
题意 有 \(n\) 个箱子,指定一个箱子开始向右推,如果碰到了别的箱子会令其移动,问 \(k\) 秒之后每个箱子所在的位置. \(n\leq 10^5\). 分析 转化成最短路模型,如果两个箱子 \ ...
- stl源码剖析 详细学习笔记 算法(2)
//---------------------------15/03/29---------------------------- //****************************set相 ...
- jenkis +sonarqube 对后端代码静态扫描,钉钉群通知执行结果(记录)
代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知. 牵涉到配置: 1.配置sonar测试任务 ...
- Java中isAssignableFrom()方法与instanceof()方法用法
一句话总结: isAssignableFrom()方法是从类继承的角度去判断,instanceof()方法是从实例继承的角度去判断. isAssignableFrom()方法是判断是否为某个类的父类, ...