①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 这些对象。
mybatis-plus 通用的CRUD
最新推荐文章于 2022-09-15 10:16:59 发布