mybatis-plus 通用的CRUD

①mybatsi-plus
javabean中的属性最好是用装箱后的
因为在初始化的时候,int等基本类型会有默认的初始值
这样的目的:为了框架方便判断。

②依赖配置
需要一个
<!-- mp依赖
  			 mybatisPlus 会自动的维护Mybatis 以及MyBatis-spring相关的依赖
  		 -->
		<dependency>
		    <groupId>com.baomidou</groupId>
		    <artifactId>mybatis-plus</artifactId>
		    <version>2.3</version>
		</dependency>		

③applicationContext.xml
spring的配置文件中,主要是把
<!--  配置SqlSessionFactoryBean 
		Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean
		MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
	 -->
	 主要就是将这个FactoryBean换成
	 
	 
	<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<!-- 别名处理 -->
		<property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>		
		
		<!-- 注入全局MP策略配置 -->
		<property name="globalConfig" ref="globalConfiguration"></property>
	</bean>
	
	
	其它bean中的属性配置都是一样的。
	
	
	
	③如果是在mybatis中,我们需要mapper接口
	还要写相关的 xml,也就是sql映射文件
	但是如果是在plus:接口,提供了默认的一些方法,我们可以继承BaseMapper
	mapper.xml文件plus怎么帮我们处理呢?
	
	不需要处理,框架内部处理完成了
  ④自增主键的问题。	
	@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface TableId {
    String value() default "";

    IdType type() default IdType.NONE;
}
这个是定义主键生成策略的,plus自己默认有设置这个值。
这个注解中的两个字段,一个是数据库中的主键的字段名称
一个是主键的策略,用的枚举。

	/*
	 * @TableId:
	 * 	 value: 指定表中的主键列的列名, 如果实体属性名与列名一致,可以省略不指定. 
	 *   type: 指定主键策略. 
	 */
	//@TableId(value="id" , type =IdType.AUTO)
	private Integer id ;   //  int 
	
	
	⑤表名字和Bean对象名不对应的问题。
	
/*
 * MybatisPlus会默认使用实体类的类名到数据中找对应的表. 
 * 
 */
@TableName(value="tbl_employee")
public class Employee {
还是在Bean上加这样的一个注解。


⑥ 驼峰和字段的转换问题
INSERT INTO tbl_employee ( last_name, email, gender, age ) VALUES ( ?, ?, ?, ? )
看配置文件,mybatis中我们并没有配置这个开启,是默认开启了吗?
是的,mybatis其实默认是不开启的。但是plus是开启的。

<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
		<property name="dbColumnUnderline" value="true"></property>
		
		
		
		
		
⑦,全局配置问题:		之前解决问题4,5的时候,只是针对的一张表
		有没有针对所有的配置
		
		<!-- 全局的主键策略 -->
		<property name="idType" value="0"></property>
		
		<!-- 全局的表前缀策略配置 -->
		<property name="tablePrefix" value="tbl_"></property>
	
只是这样的添加并没有真的配置进入mybatisSqlSessionFactory中,需要的最后一行。

<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<!-- 别名处理 -->
		<property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>		
		
		<!-- 注入全局MP策略配置 -->
		<property name="globalConfig" ref="globalConfiguration"></property>
	</bean>
	
	
	前边的注解都要用table开头,然后是id 和 name
	table代表的就是数据库的表
	
⑦  这个其实就是对应的驼峰命名的一个单一的注解
	//	@TableField(value = "last_name")
	private String  lastName; 
	
	
	⑧如果你数据库中没有这个字段,但是你的entity中却有这个字段,那么在insert的时候,就会出现问题  数据库异常,没有这个字段。处理方法如下
	@TableField(exist=false)
	private Double salary ;
	
	
	⑨plus 自动的封装主键到entity的id 上
	// insert方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中   也就是如果是NULLsql上没有这个字段。
		Integer result = employeeMapper.insert(employee);
		
		//获取当前数据在数据库中的主键值
		Integer key = employee.getId();
		System.out.println("key:" + key );
		
		⑩一直用全字段的sql
			//insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中. 
//		Integer result = employeeMapper.insertAllColumn(employee);
没有值的就赋值为null,数据库中INT是可以为null的。

十一:updatebyid传入的也是对象,就是和⑨有相同的处理方式,空的字段不会在sql中出现。
// insert方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
		Integer result = employeeMapper.insert(employee);
十二:和⑩是一个效果。只不过现在是updat了
	//insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中. 
//		Integer result = employeeMapper.insertAllColumn(employee);

十三:selectbyid  传入的参数是Serializable的传入的id  int类型其实是实现了这个接口的。
1. 通过id查询
		Employee employee = employeeMapper.selectById(1);
		System.out.println(employee); 查询成功。
		
十四:利用多条件来查一条数据
//2. 通过多个列进行查询    id  +  lastName
		Employee  employee = new Employee();
		employee.setId(2);
		employee.setLastName("Jerry");
		employee.setGender(0);

		Employee result = employeeMapper.selectOne(employee);
		System.out.println("result: " +result );
		
		因为:传入的是对象,还是非空的加在sql上。
		传的条件可以没有id的,但是条件不能查出多条数据,如果出现,那么就会报错。
		
		
		十五:一个字段的多条数据查询
		有点像批量的插入
		List<Integer> idList = new ArrayList<>();
		idList.add(4);
		idList.add(5);
		idList.add(6);
		idList.add(7);
		List<Employee> emps = employeeMapper.selectBatchIds(idList);
		System.out.println(emps);
		底层的sql 语句其实用的是in(?,?,?)这个语法
		没有查到的数据就是null 并不封装进入list。 是list定了。没查到就是一个空的list。
		
		
		十六:通过columnMap来封装参数,有点像对象的entity的方式,但是结果是个list
		Map<String,Object> columnMap = new HashMap<>();
		columnMap.put("last_name", "Tom");
		columnMap.put("gender", 1);

		List<Employee> emps = employeeMapper.selectByMap(columnMap);
		System.out.println(emps);
		
		需要注意的是last_name要这样写。

十七:关于plus的默认分页
//5. 分页查询
		List<Employee> emps = employeeMapper.selectPage(new Page(3, 2), null);
		System.out.println(emps);
		
		 SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee  其实查询的时候并没有真的去分页,而是在内存中分页,这种是不可取的。


十八:根据id删除
//1 .根据id进行删除
		Integer result = employeeMapper.deleteById(13);
		System.out.println("result: " + result );
		

十九:根据条件删除
	//2. 根据 条件进行删除
		Map<String,Object> columnMap = new HashMap();
//		columnMap.put("last_name", "MP");
		columnMap.put("email", "mp@atguigu.com");
		Integer result = employeeMapper.deleteByMap(columnMap);
		System.out.println("result: " + result );	


二十:删除ids的数组
DELETE FROM tbl_employee WHERE id IN ( ? , ? , ? )  其实也就是和查询一样,用的是in
	//3. 批量删除
		List<Integer> idList = new ArrayList<>();
		idList.add(3);
		idList.add(4);
		idList.add(5);
		Integer result = employeeMapper.deleteBatchIds(idList);
		System.out.println("result: " + result );	


plus启动的时候,就会将默认的mapper注入了
也就是sql的形成过程,我们需要的是:mybatis 的原理有些了解,比如configration对象, mapperStatement 这些对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值