目录
创建第一个mybatisPlus项目-mapper层继承BaseMapper实现
官网
个人感觉,mybatisplus是所有的技术中,通过官网学习起来无障碍的技术,纯中文的教程对我这种对技术英文懵的人简直就是福星,所以大家时间条件充足的话,还是推荐大家通过官网进行学习,官网地址:简介 | MyBatis-Plus。
mybatisplus的优势在于:
1. 将常用的CURD方法封装进mapper,使我们可以快速完成功能。
2. 将常用的CURD方法封装进service,使我们无需编写一些固定场景的service代码。
3. 可以不通过mapper.xml运行CURD功能。
4. 通过可视化工具mybatisX,连接数据库的同时,实现代码的生成。
说这么多概念,可能大家还是很懵,下面我们通过案例对比一下吧:
传统SSM项目的开发步骤(以springboot为例)
1. 创建controller。
2. 创建service,impl,编写代码调用mapper层。
3. 创建mapper类和xml文件,编写代码。
4. 当然在传统项目中也可以自动生成代码,这里你需要导入依赖,并修改generator.xml文件的内容用以生成代码。
SpringBoot+Mybatis:
1. 创建controller
2. 创建service、impl,如果mybatisplus提供的方法足够实现你的功能的话,那么恭喜你,可以不用编写service调用mapper的代码。
3. 创建mapper接口,如果mybatisplus提供的方法足够用的话,那么恭喜你,可以不用在mapper接口中定义方法了,也可以不用定义mapper.xml。
4. 此外,我们还可以通过mybatisX插件,完成service、mapper、entity层代码的自动生成,如果你的功能只涉及单表,且业务逻辑不复杂,那么恭喜你,你完全可以在很短的时间内完成一套CURD功能。
5. 那有人会担心了,怕功能被封装太死,像hibernate一样太复杂了怎么办,告诉你,丝毫不用担心,我们还是可以像使用mybatis一样使用mybatisPlus的。
大家如果觉得写的还行,还请给个赞和关注吧….
废话少说了….直接上代码吧………………
源码下载地址:
链接:https://pan.baidu.com/s/1Zrlz97Z37R99uK9e0Ukg1w?pwd=34ts
提取码:34ts
--来自百度网盘超级会员V3的分享
创建第一个mybatisPlus项目-mapper层继承BaseMapper实现
下面我们来创建第一个mybatis项目,感受一下无需定义mybatis.xml,直接调用mapper接口的写法吧:
1. 通过创建springboot项目的形式,创建我们的工程:
2. 创建项目完毕,我们来导入依赖吧:
<!-- 德鲁伊 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<!--mybatisplus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
3. 配置application.yml文件:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4. 在启动类上增加MapperScan注解,扫描mapper类
@SpringBootApplication
public class Mybatis02Application {
public static void main(String[] args) {
LogFactory.useCustomLogging(StdOutImpl.class);
SpringApplication.run(Mybatis02Application.class, args);
}
}
5. 创建controller类、service接口、impl、mapper接口 :
controller代码如下:
@RestController
public class UserController {
@Autowired
UserService userService;
/**
* 查询所有信息
*/
@RequestMapping("getUserList")
public List<User> getUserList(){
return userService.getUserList();
}
/**
*按id查询
*/
@RequestMapping("getUserByid")
public User getUserByid(@RequestParam long id){
return userService.getUserByid(id);
}
/**
*新增
*/
@RequestMapping("insertUser")
public Map<String,String> insertUser(@RequestParam long id, @RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
user.setEmail(email);
int i = userService.insertUser(user);
String msg = i>0 ? "success" : "error" ;
Map<String, String> resultMap = new HashMap<>();
resultMap.put("msg",msg);
return resultMap;
}
/**
*删除用户
*/
@RequestMapping("delUser")
public Map<String,String> delUser(@RequestParam long id){
int i = userService.delUser(id);
String msg = i>0 ? "success" : "error" ;
Map<String, String> resultMap = new HashMap<>();
resultMap.put("msg",msg);
return resultMap;
}
/**
*修改用户
*/
@RequestMapping("updUser")
public Map<String,String> updUser(@RequestParam long id, @RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
user.setEmail(email);
int i = userService.updUser(user);
String msg = i>0 ? "success" : "error" ;
Map<String, String> resultMap = new HashMap<>();
resultMap.put("msg",msg);
return resultMap;
}
/**
* 查询所有信息
*/
@RequestMapping("getUserListByCondition")
public List<User> getUserListByCondition(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
return userService.getUserListByCondition(user);
}
}
Service接口的代码:
public interface UserService {
List<User> getUserList();
int insertUser(User user);
int delUser(long id);
int updUser(User user);
User getUserByid(Long id);
List<User> getUserListByCondition(User user);
}
ServiceImpl的代码:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
/**
* 获取所有的结果
* @return
*/
@Override
public List<User> getUserList() {
return userMapper.selectList(null);
}
/**
* 新增
* @param user
* @return
*/
@Override
public int insertUser(User user) {
return userMapper.insert(user);
}
/**
* 删除
* @param id
* @return
*/
@Override
public int delUser(long id) {
return userMapper.deleteById(id);
}
/**
* 修改
* @param user
* @return
*/
@Override
public int updUser(User user) {
return userMapper.updateById(user);
}
//按id查询
@Override
public User getUserByid(Long id) {
return userMapper.selectById(id);
}
}
Mapper的代码:
@Repository
public interface UserMapper extends BaseMapper<User> {
}
6. 下面可以直接在浏览器中调用接口试试看了。
通过MybatisPlus提供的Service实现增删改查
通过上面的代码我们可以发现,如果功能只是一套简单的CURD,在service代码中没有复杂的计算,那么我们重复的去写service是一件很痛苦的事情,没关系,mybatisplus帮我们解决,你需要这么做:
controller层代码中,直接调用service中的CURD方法即可:
@RestController
public class MyUserController {
@Autowired
MyUserService myUserService;
/**
*查询所有的信息
*/
@RequestMapping("getAllUser")
public List<User> getAllUser(){
return myUserService.list();
}
/**
*按id查询
*/
@RequestMapping("getUserById")
public User getUserById(Long id){
return myUserService.getById(id);
}
/**
*按id删除
*/
@RequestMapping("delById")
public boolean delById(Long id){
User user = new User();
user.setId(id);
return myUserService.removeById(user);
}
/**
*新增
*/
@RequestMapping("saveUser")
public boolean saveUser(@RequestParam long id, @RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
user.setEmail(email);
return myUserService.save(user);
}
/**
*按id修改
*/
@RequestMapping("updateUser")
public boolean updateUser(@RequestParam long id, @RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
user.setEmail(email);
return myUserService.updateById(user);
}
}
Service接口代码,继承IService接口
public interface MyUserService extends IService<User> {
}
service实现类代码,继承ServiceImpl实现类,实现Service接口:
@Service
public class MyUserServiceImpl extends ServiceImpl<UserMapper, User> implements MyUserService {
}
mapper接口在哪?哈哈。。。不用定义,是不是很爽
MybatisPlus的常用注解
@TableName(value=”数据库表名称”):加在实体类上,表示实体类映射的数据库表名称
配置在yml中,代表映射的数据库前缀,是以什么开头的,在yml中配置后,在实体类上可以少配置前缀和后缀
mybatis-plus:
global-config:
db-config:
table-prefix: t_
@TableId(value=”uid” type= IdType.ASSIGN_ID)
配置在实体类,指的是实体类中的字段映射到数据库的哪个id字段,字段类型也可统一配置在yml中,在yml中进行全局配置,配置后表示数据库的字段类型是自增。
mybatis-plus:
global-config:
db-config:
id-type: auto
@TableField(“表中的字段名称”) :
如果表中字段以下划线为命名,实体类中字段已经以驼峰式命名,无需使用此注解 ;如果表中字段以下划线为命名,实体类中字段不按照驼峰式命名规则,需要使用此注解。
@TableLogic(value=”0”,delval=”1”) :
实现逻辑删除(0代表原来的值正常,1代表删除) 在实体类的字段上配置
也可在全局的配置文件中配置逻辑删除属性:
mybatis-plus:
global-config:
db-config:
logic-delete-field: is_deleted
logic-delete-value: 1
logic-not-delete-value: 0
关于Wrapper接口及其实现类的使用
什么是wrapper接口呢?有什么用呢?这个接口的实现类是用来拼接动态sql的,举例说明一下:
比如我们经常使用的动态sql:
<if test="usrloginnm != null">
usrLoginNm = #{usrloginnm,jdbcType=VARCHAR},
</if>
简而言之,wrapper接口的作用就是,以代码的形式,将上面的if判断中的拼接sql和塞值操作传入到mybatisp定义好的方法中,完成条件查询和过滤操作。
通过wrapper接口实现简单条件查询
/**
* 一般条件查询,实现like、小于、等于条件的查询
* SELECT * FROM USER WHERE NAME LIKE '%%' AND AGE< AND EMAIL=
*/
@RequestMapping("selectUserByCond")
public List<User> selectUserByCond(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.like("name",name).
lt("age",age).eq("email",email);
return myUserService.list(userQueryWrapper);
}
通过wrapper接口实现排序
/**
* 一般条件查询,实现排序效果
*/
@RequestMapping("selectByOrder")
public List<User> selectByOrder(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.orderByAsc("age").orderByDesc("id");
return myUserService.list(userQueryWrapper);
}
通过wrapper实现组合查询
/**
* 组合条件查询实现
* select * from user where (name like '%s%' and age >20 ) or email is not null
*/
@RequestMapping("selectByOrders")
public List<User> selectByOrders(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.like("name",name).gt("age",age).or().isNotNull("email");
return myUserService.list(userQueryWrapper);
}
SELECT方法
/**
* 组合条件查询实现
* select * from user where (name like '%s%' and age >20 ) or email is not null
* select 中的字符串 代表要查询哪些字段
* myUserService.getMap(userQueryWrapper) 获取map集合 将列名作为key value作为值
*/
@RequestMapping("selectAsMap")
public Map<String, Object> selectAsMap(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.like("name",name).
gt("age",age).or().
isNotNull("email").select("id","name","age");
return myUserService.getMap(userQueryWrapper);
}
子查询
/**
* 组合条件查询实现
* SELECT * FROM USER WHERE ID IN(SELECT ID FROM USER WHERE ID <4)
* 实现in 的子查询
*/
@RequestMapping("selectByIn")
public Map<String, Object> selectByIn(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.inSql("id","select uid from user where id<4");
return myUserService.getMap(userQueryWrapper);
}
UpdateWrapper
/**
* 条件修改
* update user set name=?,email=? where id=?
*/
@RequestMapping("updateUser")
public boolean updateUser(@RequestParam Long id,@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
UpdateWrapper<User> userQueryWrapper = new UpdateWrapper<>();
userQueryWrapper.set("name",name).set("email",email).eq("id",id);
return myUserService.update(null,userQueryWrapper);
}
动态sql
/**
* 条件查询
* SELECT * FROM USER
* 条件1 字段A不为空
* 拼接字段A,拼接字段A的值
* 条件2 字段B不为空
* 拼接字段B,拼接字段B的值
*/
@RequestMapping("selectByDtSql")
public List<User> selectByDtSql(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq(StringUtils.isBlank(name),"name",name).
gt("age",age).eq(StringUtils.isBlank(email),"email",email);
return myUserService.list(userQueryWrapper);
}
分页查询
1. 需要在项目中新增mybatis的分页配置类,新增confog包,路径和controller同级。
@Configuration
@MapperScan("com.mybatis02.mapper")
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
2. 使用方式
/**
* 分页查询
* Page<User>: 是分页查询的对象信息
* userQueryWrapper:查询条件
* myUserService.page(userPage,userQueryWrapper): 按条件进行分页查询
*/
@RequestMapping("selectByPage")
public Page<User> selectByPage(@RequestParam String name, @RequestParam int age, @RequestParam String email){
User user = new User();
user.setName(name);
user.setAge(age);
user.setEmail(email);
Page<User> userPage = new Page<>();
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq(StringUtils.isBlank(name),"name",name).
gt("age",age).eq(StringUtils.isBlank(email),"email",email);
return myUserService.page(userPage,userQueryWrapper);
}
配置MybatisX插件
1. 在ida中下载插件,file-settings-plugins-marketplace-输入:mybatisX:
2. 配置mybatisX插件:
选择完毕即可生成代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116524.html