Mybatis或Mybatis-plus配置报错原因
1.添加mybatis或者plus相关的依赖
2.检查xml文件中的配置namespace是否为Mapper全接口名
3.检查Mapper接口中的方法名与xml文件中的id值是否对应
4.检查xml文件的参数parameterType是方法参数类型的全类名,resultType是返回值类型的全类名,并且必须跟mapper接口方法的返回值类型一致
5.在主启动类上加注解@MapperScan(“Mapper层的全路径”),配置文件指定mybatis-plus.mapper-locations:xml文件位置(可忽略)
6.Mapper接口名跟xml文件名必须一致
7.如果xml文件不在Resources目录,会导致xml无法编译,需要pom文件加build配置,在Resources目录下则不用管,但是注意不要将xml放在static和templates目录下了,系统扫描不到!!!
8.检查xml文件是否有中文注释,删除掉
9.检查xml文件所在package名称是否和Mapper接口所在的包名一一对应
10.检查target目录下classes文件夹,是否正确编译了mapper层代码和xml文件
11.如果接口方法返回的是List集合,那么xml文件的返回值类型得是resultMap才行
12.检查mapper.xml配置文件的目录位置是否正确
关于dao层代理对象创建的方式:
第一种场景:当mapper文件和接口同目录下,在接口上使用@Mapper即可,缺点是接口多的时候使用不方便!
第二种场景:当mapper文件和接口同目录下,取消在接口上使用的@Mapper,在主启动类上加注解@MapperScan,属性basePackages指定接口包路径,框架会创建包下所有接口的代理对象
第三种场景:开发最常用,将mapper文件跟dao层接口分开管理,在resource目录下创建目录,比如mappers,用来管理所有的mapper文件,需要在properties配置文件配置mapper文件的位置,然后再pom文件指定将resource目录中的文件编译到目标目录,在主启动类上加注解@MapperScan,属性basePackages指定接口包路径,框架会创建包下所有接口的代理对象
第一种场景:@Mapper的使用
在dao层接口上,告诉mybatis这是dao接口,创建接口的代理对象
@Mapper
public interface UserDao {
User selectUser(@Param("id") Integer id);
}
第二种场景:@MapperScan的使用
在主启动类上,扫描包下所有接口,并创建接口的代理对象
步骤1:去掉接口上的Mapper注解
public interface UserDao {
User selectUser(@Param("id") Integer id);
}
步骤2:在主启动类上加注解@MapperScan,属性basePackages=dao层接口所在的包路径,路径是数组,可以有多个!
@SpringBootApplication
@MapperScan(basePackages = "com.alibaba.springboot.dao")
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
第三种场景:
1.将所有mapper文件放在resource目录下的子目录
2.在properties配置文件,配置mapper文件所在的位置(根据版本的不同,有些会自动扫描resource目录下的文件,无需配置)
#指定mapper文件所在位置,默认以resource目录为根
mybatis.mapper-locations=classpath:mapper/*.xml
#指定mybatis的日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3.在pom文件指定将resource目录中的文件,编译到指定目录中(根据版本的不同,有些会自动扫描resource目录下的文件,无需配置)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
4.在主启动类上加注解MapperScan
@SpringBootApplication
@MapperScan(basePackages = "com.alibaba.springboot.dao")
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
Mybatis
mybatis是持久层框架,封装了JDBC,它的核心功能是动态代理和动态SQL,动态代理就是dao层接口的实现类交给mybatis创建,然后交给spring容器管理,动态SQL就是通过标签去动态的拼接SQL语句,比如where标签,if标签,foreach标签等
#{} 和 ${}的区别:
#{}:使用PrepareStatement作为对象执行SQL语句,效率高,可以防止SQL注入,会自动加单字符串,#{}常作为列值使用,拼接的是?
-------------------------------------------------------------------------
${}:使用Statement作为对象执行SQL语句,效率低,有SQL注入风险,不会自动加单字符串,${}常用作列名或表名,拼接的是单词
resultMap结果映射:
列名和属性名不对应的情况下使用,相同也能使用
用法:
1.在mapper文件定义resultMap标签,指定列名和属性名称的对应关系
2.在select标签使用属性resultMap = “resultMap标签的ID值”
<mapper namespace="com.alibaba.dao.UserDao">
<!--type:写全类名,id:取个别名-->
<resultMap id="user" type="com.alibaba.pojo.User">
<!--id标签指定主键的映射关系-->
<id column="id" property="id"></id>
<!--result标签指定非主键映射关系-->
<result column="loginName" property="loginName"></result>
</resultMap>
<!--查询SQL,resultMap:对应标签取的别名-->
<select id="selectUserById" resultMap="user">
select id, loginName, loginPwd, realName
from t_user
where id = #{id};
</select>
</mapper>
mybatis框架的常用注解
动态SQL常用标签:
多个条件查询数据时可以使用动态SQL,掌握if,where,foreach,sql
foreach:
例子1:循环简单类型list
第二种方式:
sql:
Mybatis-Plus
mybatisl-plus框架的常用注解
简化mybatis,操作流程:
添加mybatis-plus依赖
做mybatis-plus的yml文件配置
创建pojo实体类,创建dao层接口,继承BaseMapper<实体类名>类,创建service层(或者不继承)继承Iservice,创建serviceImp层(或者Repository)继承SerivceImpl
在主启动类上加@MapperScan(“dao层目录所在的绝对路径”)注解,或者在Mapper类上加@Mapper,一个的群,一个的单
配置yml文件
# 配置Mybatis-plus
mybatis-plus:
configuration:
# sql打印
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 开启查询数据为空就返回null给前端,避免空指针异常
call-setters-on-nulls: true
# 指定mapper.xml文件的位置(可省略)
mapper-locations: classpath:mapper/*Mapper.xml
# 逻辑删除,方式一
global-config:
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
logic-delete-field: isDeleted # 全局逻辑删除的实体字段名
配置逻辑删除,实际是更新操作
方式一:直接在yml文件配置
方式二:在实体类字段isDelete上加注解@TableLogic就行了
需要注意的是,如果是MP生成的SQL会自动加条件is_deleted = 0,但是自定义的SQL,比如在mapper.xml文件写的SQL,需要在最后自己加条件is_deleted = 0才行!!!
@TableName:数据库表名
@TableName("sys_user")
public class UserDO {
}
@TableId:自增id
@TableName("sys_user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
}
@TableField:
@TableName("sys_user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
// 默认是开启了驼峰命名的,如果没有开启驼峰命名,实体类的属性是nickName,在数据库中没有该字段,就可以用@TableField映射数据库 的字段nick_name
@TableField("nick_name")
private String nickName;
// 表示数据库中不存在该字段
@TableField(exist=false)
private String remark;
}
方法详解
条件构造器:Wrappers支持lombda表达式,不加s不支持
** Wrapper<\WaitMaterialDO> wrapper = Wrappers.<\WaitMaterialDO>lambdaQuery()
.eq()
.gt()
.lt()
.like()
.last()
.orderByDesc()
.select()
.groupBy();**
getOne(wrapper)
获取一整条数据,传入wapper条件,返回DO对象
getById()
根据id查询整条数据,传入id,返回DO对象
save()
添加一条数据,传入DO对象,返回boolean
saveBatch()
批量添加数据,传入Collection<\DO>,返回boolean
removeById()
根据id删除整条数据,传入id,返回boolean
updateById()
根据id修改整条数据,传入DO对象,返回boolean
updateBatchById()
批量修改数据
list()
根据条件构造器查询全部数据(list列表),不传条件或者传入条件构造器,返回List<DO对象>
page(pageIndex,pageSize,wrapper)
分页查询XXX列表