Mybatis接口注解说明+MybatisPlus
1. Mybatis 接口注解说明
1.1 需求说明
Mybatis实现数据查询时有2种Sql的写法。
1.将所有的Sql语句都写到xml 映射文件中。(万能操作方式)
2.可以将Sql语句通过注解的方式标识在接口方法中.(只适用于简单操作)
//注意事项:映射文件和注解二选一
@Select("select * from demo_user where id = #{id}")
User fidUserById(int id);
1.2 注解的种类
说明: 该注解一般都是操作简单的数据查询,如果遇到关联查询/复杂Sql则使用Mapper映射文件的方式 更加通用.
@Mapper//spring为该接口创建一个代理对象
public interface UserMapper {
//查询所有user表数据
List<User> findAll();
@Select("select * from demo_user where id = #{id}")
@Insert("")//添加
@Update("")//更新
@Delete("")//删除
}
1.3 Mybatis 案例练习
1.3.1 测试方法
@SpringBootTest
public class TestMybatis {
//明确:注入一定是对象
//SpringBoot为了整合mybatis,简化代码结构 Spring动态的为Mybatis的接口
//创建代理对象
//代理: 根据原有对象的模型,在运行期动态创建了一个一模一样功能的实例化对象
//案例: 孙悟空(接口)/克隆一个一模一样的对象
@Autowired
private UserMapper userMapper;
@Test
public void testFind(){
System.out.println(userMapper.getClass());
List<User> userList = userMapper.findAll();
System.out.println(userList);
}
//根据ID查询数据
@Test
public void findUserById(){
User user = userMapper.findUserById(11);
System.out.println(user);
}
//新增用户
//数据从哪里来 前端动态获取
@Test
public void insert(){
User user = new User();
user.setName("星期五").setSex("男").setAge(18);
userMapper.insert(user);
System.out.println("新增成功");
}
//将星期五的年龄改为20 性别改为女
@Test
public void update(){
User user = new User();
user.setAge(20).setSex("女").setName("星期五");
userMapper.updateByName(user);
}
}
###1.3.2 Mapper接口文件写法
package com.jt.mapper;
import com.jt.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper//spring为该接口创建一个代理对象
public interface UserMapper {
//查询所有user表数据
List<User> findAll();
@Select("select * from demo_user where id = #{id}")
@Insert("")//添加
@Update("")//更新
@Delete("")//删除
//注意事项:映射文件和注解二选一
@Select("select * from demo_user where id = #{id}")
User fidUserById(int id);
@Insert("insert into demo_user (id ,name,age,sex) value (null,#{name},#{age},#{sex})")
void insert (User user);
@Update("update demo_user set age=#{age},sex=#{sex} where name=#{name}")
void updateByName(User user);
}
2. MybatisPlus
2.1 MP介绍
2.2 为什么使用MP
场景说明:小红是一个10年开发,月薪100万.这是需要小红开发一套京淘项目实现最常用的CURD功能.像这类操作即简单又繁琐.如果大量的代码都由程序员自己手写则影响开发效率. 需求:像这类又简单又繁琐的工作最好交给框架自动完成. 说明:使用MP主要完成表单的CRUD操作,简化开发过程
2.3 MP入门案例
1.导入jar包 2.使用对象的方式操作数据库 3.便捷POJO实现对象与数据表的映射的关系 4.继承公共的接口,获取常用的CRUD的操作 5.实现数据操作.
2.3.1 引入jar包
<!--spring整合mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
2.2.2 编辑pojo
说明: 1.POJO应该与数据库中的表完成映射 @TableName("demo_user")//实现对象与表名映射 2.实现主键自增 @TableId(type = IdType.AUTO) 3.实现属性与字段映射 规则:如果属性和字段名一致可以省略 @TableField("name")
@Data//ste/get/toString
@Accessors(chain = true)//链式加载
@TableName("demo_user")//实现对象与表名映射
public class User {
//设定主键自增
@TableId(type = IdType.AUTO)//ASSIGN_ID + ASSIGN_UUID
private Integer id;
@TableField("name")//实现属性与字段映射
private String name;
@TableField("age")
private Integer age;
@TableField("sex")
private String sex;
}
2.2.3 继承公共的接口
说明:继承接口后,必须添加泛型对象,否则程序无法执行
父类中的接口:MP将常用的CRUD的方法进行了抽取,以后子类如果需要调用,则直接抽取
配置过程
接口文件
public interface UserMapper extends BaseMapper<User> {
List<User> findAll();
}
.yml文件
mybatis-plus:
#设置别名包
type-aliases-package: com.jt.pojo
#加载映射文件
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#打印SQl语句
logging:
level:
com.jt.mapper: debug
2.4 核心思想:以对象的方式操作数据库
配置:
- 编辑POJO与数据表的映射.
- 编辑POJO属性与表字段映射.
- 封装了大量的常用CURD API
- 根据对象动态的生成Sql语句
执行过程:
- 程序业务开始执行 userMapper.insert(user);
- 根据Mapper接口动态获取操作的泛型对象.获取对象之后获取表的相关数据 public interface UserMapper extends BaseMapper
- 只要获取对象获取了表名称,字段名称.数据的值
- 将对象转化为特定的SQL,之后交给Mybatis执行 userMapper.insert(user对象) Sql: insert into 表名 (字段名....) values (数据的值......)
2.5 MP常用操作
2.5.1 根据ID查询
//1.根据主键查询数据库
@Test
public void testSelect1(){//SELECT id,name,age,sex FROM demo_user WHERE id=?
User user = userMapper.selectById(1);
System.out.println(user);//User(id=1, name=黑熊精, age=3000, sex=男)
}
2.5.2 selectList查询(一)
//2.根据name查询name="小乔" sex="男"
@Test
public void textselect2(){
User user = new User();
user.setName("小乔").setSex("男");
//创建条件构造器 封装where条件的
//在实现时会动态的根据对象中不为null的属性 去拼接where条件
//默认的关系链接符 and
QueryWrapper queryWrapper=new QueryWrapper(user);
List<User> userList=userMapper.selectList(queryWrapper);//SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
System.out.println(userList);//[User(id=43, name=小乔, age=19, sex=男)]
}
2.5.3 selectList查询(二)
//3.查询name="小乔" sex="男"的用户
//Sql:SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
@Test
public void testselect3(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("name", "小乔")
.eq("sex","男");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);//[User(id=43, name=小乔, age=19, sex=男)]
}
2.5.4 selectList查询(三)
//4.查询age>18 sex="女"的用户
//sql:select * from demo_user where age >18 and sex='女'
//逻辑运算符 >gt, <lt, =eq, >=ge, <=le, !=ne
@Test
public void testselect4(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.gt("age", "18")
.eq("sex", "女");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
2.5.5 like关键字
//5.like关键字
//5.1查询name包含"乔" where name lik '%乔%'
//5.2查询name以乔结尾的 where name like '%乔'
@Test
public void testselect5(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
// queryWrapper.like("name", "乔");
queryWrapper.likeLeft("name", "乔");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
2.5.6 in关键字
/*6.
* in 关键字
* 需求: 查询Id为1,5,6的数据
* sql: select * fron demo_user where in(1,3,5,6)
*/
@Test
public void testselect6(){
Integer[] ids={1,3,5,6};
//一般的数组采用包装类型,使用对象身上的方法 基本类型没有方法
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.in("id",ids);
//采用可变参数类型 实现查询
//queryWrapper.in("id",1,3,5,6,);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
2.5.7 order by关键字
/*
* 关键字:order by 排序
* 默认规则: 升序 asc 降序 desc
* 需求:查询性别为男的用户,按照年龄降序排列
* sql:select * from demo_user where sex="男" order by age desc*/
@Test
public void testselect(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("sex", "男")
.orderByDesc("name","id" );
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}