1.插入
@Autowired
User_plusDAO user_plusDAO;
@Test
public void insert(){
User_plus user_plus= new User_plus();
user_plus.setName("刘备");
user_plus.setAge(18);
user_plus.setEmail("jckslafkas@163.com");
int i=user_plusDAO.insert(user_plus);
//
System.out.println(i+"id:"+user_plus.getId());
}
主键生成策略
因为在最开始建表的sql语句中就指明了,id是数据库的主键,主键不能唯一,
常见的数据库中主键自动设置方法有(uuid、自增id、雪花算法、redis生成、zookeeper生成)
1.雪花策略
这里生成的id默认采用的是雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake。雪花算法支持的TPS可以达到419万左右(2^22*1000),几乎保证全球唯一。
//生成getter和setter方法
@Data
//无参构造方法
@NoArgsConstructor
//全参构造方法
@AllArgsConstructor
//重写打印方法
@ToString
//将实体类与数据库表形成映射,如果类名和表名一致则可以不加
@TableName("user")
public class User_plus {
//枚举注解,雪花算法使用ID_WORKER策略,全局唯一ID,数据库设置自增也没用
@TableId(type = IdType.ASSIGN_ID,value = "id")
private Long id;
private String name;
private Integer age;
private String email;
}
注解可以自定义配置
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD}) //枚举注解
public @interface TableId {
//可以设置以下两个参数
String value() default "";
IdType type() default IdType.NONE; //ID策略
}
2.主键自增策略:使用数据库自增策略,先设置数据库id字段自增不然报错
//生成getter和setter方法
@Data
//无参构造方法
@NoArgsConstructor
//全参构造方法
@AllArgsConstructor
//重写打印方法
@ToString
//将实体类与数据库表形成映射,如果类名和表名一致则可以不加
@TableName("user")
public class User_plus {
//要是自增策略,在id上加入下列代码
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
3.其他策略
public enum IdType {
/**
* 数据库ID自增
* <p>该类型请确保数据库设置了 ID自增 否则无效</p>
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4);
private final int key;
IdType(int key) {
this.key = key;
}
}
2.删除
1.根据id
@Autowired
User_plusDAO user_plusDAO;
@Test
public void deleteById(){
int i = user_plusDAO.deleteById(6);
System.out.println(i);
}
2.根据列名
@Autowired
User_plusDAO user_plusDAO;
@Test
public void deleteByMap(){
//先创建Map
Map<String,Object> map=new HashMap<>();
map.put("name","刘备");
map.put("age",18);
int i = user_plusDAO.deleteByMap(map);
System.out.println(i);
}
3.根据实体条件
@Autowired
User_plusDAO user_plusDAO;
@Test
public void deleteByEntity(){
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("name","刘备");
int i = user_plusDAO.delete(wrapper);
System.out.println(i);
}
4.根据id批量删除
@Autowired
User_plusDAO user_plusDAO;
@Test
public void deletByBatchIds(){
Collection<Integer> list=new ArrayList<>();
list.add(9);
list.add(10);
int i=user_plusDAO.deleteBatchIds(list);
System.out.println(i);
}
3.更新
1.根据id
@Autowired
User_plusDAO user_plusDAO;
@Test
public void updateById(){
User_plus user=new User_plus();
user.setId(1L);
user.setAge(20);
int i = user_plusDAO.updateById(user);
System.out.println(i);
}
2.条件更新
@Autowired
User_plusDAO user_plusDAO;
@Test
public void update(){
User_plus user=new User_plus();
UpdateWrapper<User_plus> updateWrapper=new UpdateWrapper<>();
//设置更新字段
updateWrapper.set("name","张飞");
//设置更新条件
updateWrapper.eq("id",1);
int i = user_plusDAO.update(user,updateWrapper);
System.out.println(i);
}
4.查询
1.通过id
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectById(){
User_plus user = user_plusDAO.selectById(1);
System.out.println(user);
}
2.通过id列表查询
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectByBatchId(){
List<User_plus> userlist = user_plusDAO.selectBatchIds(Arrays.asList(1,2,3));
userlist.forEach(System.out::println);
}
3.通过列条件
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectByMap(){
//先创建Map
Map<String,Object> map=new HashMap<>();
map.put("age","20");
List<User_plus> userlist = user_plusDAO.selectByMap(map);
userlist.forEach(System.out::println);
}
4.根据多条件查询一个
@Autowired(required = false)
User_plusDAO user_plusDAO;
@Test
public void selectOne(){
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("name","张飞");
wrapper.eq("age",20);
User_plus user = user_plusDAO.selectOne(wrapper);
System.out.println(user);
}
5.查询符合条件的数量
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectCount(){
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("age",20);
Long i = user_plusDAO.selectCount(wrapper);
System.out.println(i);
}
6.根据实体条件
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectList(){
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("age",20);
List<User_plus> userlist = user_plusDAO.selectList(wrapper);
userlist.forEach(System.out::println);
}
7.根据条件查询,返回一个集合列表
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectMaps(){
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("age",20);
List<Map<String, Object>> userlist = user_plusDAO.selectMaps(wrapper);
userlist.forEach(System.out::println);
}
8.条件组装默认为and,如果是or请调用or方法
基础版:用like(R column, Object val)等基础方法:
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectList2(){
//多条件拼接,有条件就拼接
String name="";
Integer agebegin = 20;
Integer ageend=21;
QueryWrapper<User_plus> queryWrapper=new QueryWrapper<>();
if (StringUtils.isNotBlank(name)){
//isNotBlank判断是否不为空字符串,不为null,不为空白符
queryWrapper.like("name",name);
}
if (agebegin!=null){
//大于agebegin的
queryWrapper.ge("age",agebegin);
}
if (ageend!=null){
//小于agebegin的
queryWrapper.le("age",agebegin);
}
List<User_plus> userlist = user_plusDAO.selectList(queryWrapper);
userlist.forEach(System.out::println);
}
进阶版利用condition条件的like(boolean condition, R column, Object val)等方法:
@Test
public void selectList3(){
//多条件拼接,有条件就拼接
String name="";
Integer agebegin = 20;
Integer ageend=21;
QueryWrapper<User_plus> queryWrapper=new QueryWrapper<>();
// queryWrapper.like(StringUtils.isNotBlank(name),"name",name);
// queryWrapper.ge(agebegin!=null,"age",agebegin);
// queryWrapper.le(ageend!=null,"age",agebegin);
//等同于上面三句
queryWrapper.like(StringUtils.isNotBlank(name),"name",name)
.ge(agebegin!=null,"age",agebegin)
.le(ageend!=null,"age",agebegin);
List<User_plus> userlist = user_plusDAO.selectList(queryWrapper);
userlist.forEach(System.out::println);
}
9.条件分页查询(mybatis-plus自带分页插件)
配置分页类:
在java文件夹下创建config文件夹,在里面创建mybatisplusconfig类
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
/**
* 分页插件配置
*从MyBatis-Plus 3.4.0开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。
*旧版本分页插件
* @Bean
* public PaginationInterceptor paginationInterceptor() {
* return new PaginationInterceptor();
* }
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
在application类添加config扫描
@SpringBootApplication
@MapperScan("mapper")//引导类扫描定义的接口
@ComponentScan("config")//添加config扫描
public class MybatisplusSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusSpringbootApplication.class, args);
}
}
测试:
@Autowired
User_plusDAO user_plusDAO;
@Test
public void selectPage(){
//分页设置
IPage<User_plus> ipage=new Page<>();
//当前页
ipage.setCurrent(1);
//每页数量
ipage.setSize(2);
//条件
QueryWrapper<User_plus> wrapper=new QueryWrapper<>();
wrapper.eq("age",20);
IPage<User_plus> page = user_plusDAO.selectPage(ipage,wrapper);
System.out.println("当前页:"+page.getCurrent());
System.out.println("总页数:"+page.getPages());
System.out.println("总条数:"+page.getTotal());
System.out.println("查询到的集合:"+page.getRecords());
}