目录
原因2:找到了配置文件 mapper定义了接口方法,但是配置文件没实现对应的方法
没有通过注解方式 定义方法 @Select @Insert ...
Mybatis 和 Mybatis-Plus区别(Al生成)
Mybatis
简介
MyBatis是一款流行的、轻量级的Java持久层框架,它简化了与数据库交互的过程,特别适用于执行存储过程和编写动态SQL语句。MyBatis起源于Apache的开源项目iBatis,后于2010年由Apache Software Foundation迁移至Google Code并更名为MyBatis。到了2013年11月,该项目再次迁移至GitHub上进行维护和发展。"iBATIS"这个名字来源于“internet”和“abatis”的组合,意在强调其作为数据访问层技术的网络特性和防御性(如同abatis在军事上的用途)。
MyBatis的核心优势和特点包括:
SQL映射: 允许开发者直接编写SQL语句,这为高度定制化的查询提供了极大的灵活性,相比全自动化ORM工具(如Hibernate),MyBatis提供了更直接的SQL控制能力。
简化JDBC: 虽然开发者仍然需要编写SQL,但MyBatis处理了大部分JDBC繁杂的细节,比如连接管理、事务处理、结果集的自动映射到Java对象等,极大地减轻了开发工作量。
XML或注解配置: MyBatis支持使用XML文件或Java注解来配置SQL语句和映射关系,使得代码更加清晰和模块化。
高级映射: 支持一对一、一对多、集合映射等多种复杂的对象关系映射,以及延迟加载等特性,有助于提升应用的性能。
动态SQL: 提供了强大的动态SQL生成能力,可以根据条件动态拼接SQL语句,使得同一个SQL映射可以应对多种查询需求。
事务管理: 支持传统的事务管理和Spring的事务管理集成,方便进行事务控制。
数据验证: 可以在映射文件中定义输入参数的验证规则,增强系统的健壮性。
截至2023年3月11日,MyBatis的最新稳定版本是3.5.13。此框架被广泛应用于需要对数据库操作有精细控制的Java应用开发中,尤其适合那些需要执行大量复杂SQL查询的项目。
引入依赖
注意版本 版本需要与 springboot 版本对应
<properties>
<mybatis-version>2.3.1</mybatis-version>
</properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-version}</version>
</dependency>
创建mapper类
import org.apache.ibatis.annotations.Mapper;
@Mapper
public class OrderMapper {
}
创建xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lhd.charging.order.mapper.OrderMapper">
</mapper>
在yaml中增加配置
spring:
# 数据库配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/order?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
name: root
password: 123456
## 告诉 mybaits 去哪找mapper.xml
## mappers/*.xml 只能找当前目录下的*.xml
## mappers/**/*.xml 能找当前目录下的*.xml 找子目录下所有
mabatis:
mapper-locations: classpath:mapper/**/*.xml
Mybatis-Plus
简介
Mybatis-Plus(简称MP)是一个基于Mybatis的增强工具库,它在保持Mybatis所有特性完整性的基础上,扩展了一系列有用的功能来简化开发工作并提升开发效率。Mybatis-Plus的主要目标是减少重复的 CRUD(创建、读取、更新、删除)操作的样板代码,让开发者能够更加专注于业务逻辑的实现。
Mybatis-Plus的关键特性包括:
无侵入性:Mybatis-Plus对Mybatis的使用方式几乎没有改动,这意味着引入Mybatis-Plus不会对现有的Mybatis项目造成影响,可以平滑升级。
自动CRUD操作:通过定义一个基础的Mapper接口并继承
BaseMapper
,即可获得包括增删改查在内的常用数据库操作方法,无需编写具体的实现类或SQL映射文件。强大的条件构造器:提供了一个强大的条件构造器,可以帮助开发者灵活构建各种复杂查询条件,支持动态SQL生成。
代码生成器:内置的代码生成器可以根据数据库表结构自动生成实体类、Mapper接口、Mapper XML文件等,进一步加快开发速度。
分页插件:内置的分页插件使得分页查询变得简单易用,仅需传入页码和每页记录数即可。
性能分析插件:提供性能监控插件,帮助开发者分析SQL执行性能,优化数据库访问效率。
全局拦截器:支持全局拦截器机制,可以在SQL执行前后进行逻辑处理,如日志记录、权限校验等。
主键策略:支持多种主键生成策略,如UUID、自增等,简化主键管理。
** activerecord 模式**:虽然不是Mybatis-Plus直接宣传的特性,但Mybatis结合其他设计模式可以实现类似activerecord的编程风格。
通过这些特性,Mybatis-Plus降低了Mybatis在实际应用中的开发复杂度,特别是在处理大量基础数据库操作的场景下,能够显著提升开发效率和项目的可维护性。
引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
创建mybatis-plus 类
根据表创建相应的对象
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 订单数据表持久化对象
* 里面的字段和数据库的字段是一一对应的
* 表名获取 OrderPO 类名 ==> order_p_o
*/
@Data
@TableName("charging_bill_success")
public class ChargingBillSuccessPO {
@TableId(type= IdType.AUTO) // 自增用的
private Integer id;
private String billId;
}
创建接口
继承BaseMapper 定义泛型类
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lhd.charging.order.pojo.po.ChargingBillSuccessPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface OrderMapper extends BaseMapper<ChargingBillSuccessPO> {
@Select("select count(1) from config_info")
Integer getConfigInfo();
}
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 订单数据表持久化对象
* 里面的字段和数据库的字段是一一对应的
* 表名获取 OrderPO 类名 ==> order_p_o
*/
@Data
@TableName("charging_bill_success")
public class ChargingBillSuccessPO {
@TableId(type= IdType.AUTO)
private Integer id;
private String billId;
private double serviceMoney;
}
测试代码
QueryWrapper是啥?
QueryWrapper在Mybatis-Plus中扮演着核心组件的角色,它是一个强大的查询条件构造器,旨在简化数据查询的编写过程,让开发者能够以更加面向对象的方式构建SQL查询条件,而无需编写原生SQL语句。其主要作用和特点包括:
- 条件构造:提供了丰富的API方法,如eq(等于)、ne(不等于)、gt(大于)、lt(小于)、like(模糊匹配)等,用于构建WHERE子句中的各种条件。这些方法支持链式调用,使得代码更加简洁和易读。
- 动态查询:允许根据需要动态添加或修改查询条件,这对于处理用户输入不确定或需要灵活构造查询逻辑的场景非常有用。
- 分页查询:可以与Mybatis-Plus的分页插件结合,轻松实现数据的分页查询功能。
- 排序:支持ORDER BY语句的构造,通过orderByAsc和orderByDesc方法对查询结果进行排序。
- 选择字段:可以指定查询时返回哪些字段,类似于SQL中的SELECT语句中的字段选择。
- 布尔逻辑:能够处理AND、OR等逻辑运算,以便组合复杂查询条件。
- 清空与重置:提供了clear方法来清空所有已设置的条件,便于重新构建查询条件。
- Lambda表达式支持:除了常规方法外,还提供了LambdaQueryWrapper,利用Java 8的Lambda表达式进一步简化代码编写,提高类型安全。
通过QueryWrapper,开发者能够以更加类型安全和高效的方式构建SQL查询,同时减少直接编写SQL语句带来的错误和维护成本,提高了开发效率。
@Test
public void testPlusMapper() {
//CRUD Create Read Update Delete
ChargingBillSuccessPO orderPO = new ChargingBillSuccessPO();
orderPO.setBillId("10000_42_1719543423259");
//影响行数
int insert = orderMapper.insert(orderPO);
System.out.println("插入数据 " + insert + " 条");
//R read
ChargingBillSuccessPO chargingBillSuccessPO = orderMapper.selectById("2");
System.out.println("根据id查询出来的数据为:" + chargingBillSuccessPO);
//U update
QueryWrapper queryWrapper1 = new QueryWrapper();
chargingBillSuccessPO.setServiceMoney(1000.22);
queryWrapper1.eq("bill_id", "10000_42_1719543423259");
orderMapper.update(chargingBillSuccessPO, queryWrapper1);
QueryWrapper queryWrapper2 = new QueryWrapper();
List list = orderMapper.selectList(queryWrapper2);
System.out.println("查询表中所有的数据 " + list);
//D delete
int delete = orderMapper.deleteById(2);
System.out.println("删除了 " + delete + " 条数据");
}
测试结果
Invalid bound statement 异常
原因1 : 配置文件中路径设置错误
## 告诉 mybaits 去哪找mapper.xml
## mappers/*.xml 只能找当前目录下的*.xml
## mappers/**/*.xml 能找当前目录下的*.xml 找子目录下所有
## mybatis 和 mybatis-plus 共存 1 简单的CRUD 用plus 2 复杂的sql *.xml
mybatis-plus:
mapper-locations: classpath:mappers/**/*.xml
原因2:找到了配置文件 mapper定义了接口方法,但是配置文件没实现对应的方法
没有通过注解方式 定义方法 @Select @Insert ...
解决方案:
增加注解
@Select("select * from charging_bill_success")
Integer getConfigInfo();
没有在xml里定义方法 xml 里写具体的sql
解决方案:
添加具体的sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lhd.charging.order.dao.mapper.OrderFailMapper">
<!-- 共存 复杂的sql 继续同写sql的方式实现,简单的CRUD 用plus-->
<!-- 共存 复杂的sql 继续用mybaits在xml写 sql的方式实现,
简单的CRUD 用plus-->
<!--实现方法 getConfigInfo-->
<select id="getConfigInfo" resultType="Integer">
<!--getConfigInfo的具体实现-->
select count(1) from charging_admin
</select>
</mapper>
补充知识:
Mybatis 和 Mybatis-Plus区别
MyBatis和MyBatis-Plus都是Java语言中非常常用的ORM框架,MyBatis封装了JDBC的相关方法,Mybatis-Plus对Mybaits进行了进一步的封装,并做了一些性能上的优化。
1.实现方式
Mybatis:
- 简单的Sql使用注解的方式
@Mapper
public interface OrderSuccessMapper{
@Select("select * from user")
Integer getUser();
}
- 复杂Sql使用xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lhd.charging.order.dao.mapper.OrderFailMapper">
<!-- 共存 复杂的sql 继续同写sql的方式实现,简单的CRUD 用plus-->
<!-- 共存 复杂的sql 继续用mybaits在xml写 sql的方式实现,
简单的CRUD 用plus-->
<!--实现方法 getConfigInfo-->
<select id="getConfigInfo" resultType="Integer">
<!--getConfigInfo的具体实现-->
select count(1) from charging_admin
</select>
</mapper>
Mybatis-Plus:
继承BaseMapper<>类
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lhd.charging.order.pojo.po.ChargingBillSuccessPO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OrderMapper extends BaseMapper<ChargingBillSuccessPO> {
}
封装了很多基础的增删改查
//影响行数
int insert = orderSuccessMapper.insert(orderPO);
System.out.println("插入数据 " + insert + " 条");
2.功能特性
Mybatis-Plus提供自动生成代码功能,提供分页功能。
找到一个数据库表右键
生成代码的目录结构:
Mybatis 和 Mybatis-Plus区别(Al生成)
Mybatis和Mybatis Plus之间存在一些核心差异,主要体现在功能扩展、开发效率和易用性上。下面是两者之间的主要区别:
Mybatis:是一个轻量级的持久层框架,允许开发者编写原生SQL语句和存储过程,提供了灵活的SQL映射机制。开发者需要手动编写SQL映射文件(XML)或使用注解来定义SQL语句和结果映射,这给予了开发者对SQL的高度控制能力,适合处理复杂查询和高度定制化的SQL需求。
Mybatis Plus:在Mybatis的基础上进行了功能增强,提供了更多的开箱即用功能,如自动CRUD方法、代码生成器、条件构造器、Lambda表达式查询、分页插件、乐观锁、悲观锁等。这些功能减少了编写重复的SQL和Java代码的工作量,提高了开发效率。
开发效率:
Mybatis:由于需要手动编写SQL和映射配置,对于简单的CURD操作,可能会增加开发时间。
Mybatis Plus:通过自动注入基本的CURD操作,启动时即可使用,减少了模板代码的编写,使开发者能更快速地进行开发。同时,代码生成器能根据数据库表结构自动生成实体类、Mapper接口、Service层接口和实现类等,大大提升了初始开发速度。
1. 依赖与集成:
Mybatis Plus相比Mybatis,依赖更少,仅依赖Mybatis以及Mybatis-Spring,且损耗小,启动时自动注入基本CURD,对性能影响极小。
2. 易用性和学习成本:
Mybatis的学习曲线相对陡峭,需要深入理解SQL映射和配置细节。
Mybatis Plus则因为其提供的高级抽象和丰富的内置功能,使得上手更快,特别适合快速开发和迭代的项目。
3.控制权与灵活性:
Mybatis给予开发者更多的SQL控制权,适合需要对SQL进行精细调整和优化的场景。
Mybatis Plus虽然牺牲了一部分SQL的直接控制权,但通过提供通用解决方案,提升了开发效率和标准化程度。
总的来说,Mybatis Plus在保持Mybatis灵活性的同时,通过提供一系列开箱即用的工具和功能,降低了开发复杂度,提升了开发效率,更适合追求快速开发和维护性的项目。而Mybatis则更适合那些需要高度定制SQL或对性能有严格要求的场景。
数据库中 truncate的使用
重置表 删除表数据,表重置为新创建状态 。
drop会删除表 truncate只清空表中的数据
1. idea工具使用truncate的方式
找到一个表
2. 使用命令
truncate table charging_bill_success;