mybatisplus使⽤函数_mybatis-plus的使⽤------⼊门
前⾔:
mybatis在持久层框架中还是⽐较⽕的,⼀般项⽬都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进⾏,就必须写⼤量的xml⽂件,很是⿇烦。mybatis-plus就很好的解决了这个问题。
⼀、mybatis-plus简介:
Mybatis-Plus(简称MP)是⼀个 Mybatis 的增强⼯具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提⾼效率⽽⽣。这是官⽅给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官⽹。那么它是怎么增强的呢?其实就是它已经封装好了⼀些crud⽅法,我们不需要再写xml了,直接调⽤这些⽅法就⾏,就类似于JPA。
⼆、spring整合mybatis-plus:
正如官⽅所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦⾮常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:1、l:
1、l:
核⼼依赖如下:
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.14.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- mp 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
注意:这些是核⼼依赖,本项⽬还⽤到了mysql驱动、c3p0、⽇志(slf4j-api,slf4j-log4j2)、lombok。集成mybatis-plus要把
注意:
mybatis、mybatis-spring去掉,避免冲突;lombok是⼀个⼯具,添加了这个依赖,开发⼯具再安装Lombok插件,就可以使⽤它了,最常⽤的⽤法就是在实体类中使⽤它的@Data注解,这样实体类就不⽤写set、get、toString等⽅法了。关于Lombok的更多⽤法,请⾃⾏百
2、l:
度。2、l:
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">        <param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd
HH:mm:ss,SSS} %m (%F:%L) n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
3、jdbc.properties:
jdbc.sql.jdbc.Driver
jdbc.url=jdbc:mysql:///数据库名?useUnicode=true&characterEncoding=utf8 jdbc.username=#
jdbc.password=#
4、l:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
5、l:
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:p="/schema/p"
xmlns:aop="/schema/aop"
xmlns:context="/schema/context"
xmlns:jee="/schema/jee"
xmlns:tx="/schema/tx"
xsi:schemaLocation="
/schema/aop /schema/aop/spring-aop-4.0.xsd
/schema/beans /schema/beans/spring-beans-4.0.xsd
/schema/context /schema/context/spring-context-4.0.xsd            /schema/jee /schema/jee/spring-jee-4.0.xsd
/schema/tx /schema/tx/spring-tx-4.0.xsd">
<!-- 配置整合mybatis-plus过程 -->
<!-- 1、配置数据库相关参数properties的属性:${url} -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 2、配置数据库连接池 -->
<bean id="dataSource" class="hange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>
</bean>
<!-- mybatis的sqlsessionFactorybean:batis.spring.SqlSessionFactoryBean-->
<!-- 3、配置mybatis-plus的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="batisplus.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" /> <property name="configLocation" value="l"/> <property name="typeAliasesPackage" value="ity"/>
</bean>
<!-- 4、DAO接⼝所在包名,Spring会⾃动查其下的类 -->
<bean class="batis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="batisplus.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
6、entity:
@Data
@TableName(value = "tb_employee")//指定表名
public class Employee {
//value与数据库主键列名⼀致,若实体类属性名与表主键列名⼀致可省略value
@TableId(value = "id",type = IdType.AUTO)//指定⾃增策略
private Integer id;
//若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列    @TableField(value = "last_name",exist = true)
private String lastName;
private String email;
private Integer gender;
private Integer age;
}
7、mapper:
public interface EmplopyeeDao extends BaseMapper<Employee> {
}
8、测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:l"})
public class test {
@Autowired
private DataSource dataSource;
@Test
public void testDataSource() throws SQLException {
System.out.Connection());
}
}
本⽂所有代码本⼈均亲⾃测试过,本⽂涉及代码⼜较多,为了不影响篇幅,故⾮必要处不再截图。接下来的所有操作都是基于此整合好的项⽬。
需求:
三、mp的通⽤crud:需求:
存在⼀张 tb_employee 表,且已有对应的实体类 Employee,实现tb_employee 表的 CRUD 操作我们需要做什么呢?基于 Mybatis:
基于 Mybatis:
基于 MP:
需要编写 EmployeeMapper 接⼝,并在 l 映射⽂件中⼿动编写 CRUD ⽅法对应的sql语句。基于 MP:
只需要创建 EmployeeMapper 接⼝, 并继承 BaseMapper 接⼝。
1、insert操作:我们已经有了Employee、tb_employee了,并且EmployeeDao也继承了BaseMapper了,接下来就使⽤crud⽅法。1、insert操作:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:l"})
public class test {
@Autowired
private EmplopyeeDao emplopyeeDao;
@Test
public void testInsert(){
Employee employee = new Employee();
employee.setLastName("东⽅不败");
employee.setEmail("dfbb@163");
employee.setGender(1);
employee.setAge(20);
emplopyeeDao.insert(employee);
/
/mybatisplus会⾃动把当前插⼊对象在数据库中的id写回到该实体中
System.out.Id());
}
}
执⾏添加操作,直接调⽤insert⽅法传⼊实体即可。2、update操作:
2、update操作:
@Test
public void testUpdate(){
Employee employee = new Employee();
employee.setId(1);
employee.setLastName("更新测试");
/
/emplopyeeDao.updateById(employee);//根据id进⾏更新,没有传值的属性就不会更新
emplopyeeDao.updateAllColumnById(employee);//根据id进⾏更新,没传值的属性就更新为null
}
注:注意这两个update操作的区别,updateById⽅法,没有传值的字段不会进⾏更新,⽐如只传⼊了lastName,那么age、gender等属注:
性就会保留原来的值;updateAllColumnById⽅法,顾名思义,会更新所有的列,没有传值的列会更新为null。3、select操作:
(1)、根
3、select操作:(1)、
据id查询:
(2)、根据条件查询⼀条数据:
Employee employee = emplopyeeDao.selectById(1);(2)、
Employee employeeCondition = new Employee();
employeeCondition.setId(1);
employeeCondition.setLastName("更新测试");
//若是数据库中符合传⼊的条件的记录有多条,那就不能⽤这个⽅法,会报错
Employee employee = emplopyeeDao.selectOne(employeeCondition);
(3)、根据查询注:这个⽅法的sql语句就是where id = 1 and last_name = 更新测试,若是符合这个条件的记录不⽌⼀条,那么就会报错。(3)、
注:
条件返回多条数据:
当符合指定条件的记录数有多条时,上⾯那个⽅法就会报错,就应该⽤这个⽅法。
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("last_name","东⽅不败");//写表中的列名
columnMap.put("gender","1");
List<Employee> employees = emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());
注:查询条件⽤map集合封装,columnMap,写的是数据表中的列名,⽽⾮实体类的属性名。⽐如属性名为lastName,数据表中字段为注:
(4)、通过id批量查询:
last_name,这⾥应该写的是last_name。selectByMap⽅法返回值⽤list集合接收。(4)、
List<Integer> idList = new ArrayList<>();
idList.add(1);
jpa mybatis
idList.add(2);
idList.add(3);
List<Employee> employees = emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);
注:
注:把需要查询的id都add到list集合中,然后调⽤selectBatchIds⽅法,传⼊该list集合即可,该⽅法返回的是对应id的所有记录,所有返
(5)、分页查询:
回值也是⽤list接收。(5)、
List<Employee> employees = emplopyeeDao.selectPage(new Page<>(1,2),null);
注:selectPage⽅法就是分页查询,在page中传⼊分页信息,后者为null的分页条件,这⾥先让其为System.out.println(employees);注:
null,讲了条件构造器再说其⽤法。这个分页其实并不是物理分页,⽽是内存分页。也就是说,查询的时候并没有limit语句。等配置了分页
(1)、根据id删除:
4、delete操作:(1)、
插件后才可以实现真正的分页。4、delete操作:
(2)、根据条件删除:
emplopyeeDao.deleteById(1);(2)、
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);
注:
注:该⽅法与selectByMap类似,将条件封装在columnMap中,然后调⽤deleteByMap⽅法,传⼊columnMap即可,返回值是Integer
(3)、根据id批量删除:
类型,表⽰影响的⾏数。(3)、
List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
emplopyeeDao.deleteBatchIds(idList);
注:该⽅法和selectBatchIds类似,把需要删除的记录的id装进idList,然后调⽤deleteBatchIds,传⼊idList即可。
注:
四、全局策略配置:
通过上⾯的⼩案例我们可以发现,实体类需要加@TableName注解指定数据库表名,通过@TableId注解指定id的增长策略。实体类少倒也⽆所谓,实体类⼀多的话也⿇烦。所以可以在l的⽂件中进⾏全局策略配置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。