生活是苦难的,我又划着我的断桨出发了..... 博客首页

MyBatis-Plus

MyBatis-Plus

官网:https://mybatis.plus/

ORM(hibernate、jpa、mybatis)

MyBatisPlus:只做增强 不做改变

什么是Mybatis Plus?

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

特性

这是官方的原话

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查

  • 内置全局拦截插件:提供全表 delete 、 操作智能分析阻断update ,也可自定义拦截规则,预防误操作。

支持数据库

  • mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver 、 presto

  • 达梦数据库 、 虚谷数据库 、 人大金仓数据库

本次:maven+spring+mybatis

步骤

配置

  • jar包
<dependencies>
  <dependency>
    <!--mybatis-plus:mybatis-plus mybatis spring-mybatis-->
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.1.1</version>
  </dependency>
  <!--mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
  </dependency>

  <!--日志-->
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>

  <!--数据库连接池-->
  <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
  </dependency>

  <!--spring context-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.24.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.3.24.RELEASE</version>
  </dependency>
  • 数据表(student) 类(Student)创建一张表、一个实体,一 一对应
package com.xingwei.entity;

public class Student  {

    private int stuNo;

    private String stuName;

    private int stuAge;

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public int getStuNo() {
        return stuNo;
    }

    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    public Student(int stuNo, String stuName, int stuAge) {
        this.stuNo = stuNo;
        this.stuName = stuName;
        this.stuAge = stuAge;
    }
    public Student(String stuName, int stuAge) {
        this.stuName = stuName;
        this.stuAge = stuAge;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuNo=" + stuNo +
                ", stuName='" + stuName + '\'' +
                ", stuAge=" + stuAge +
                '}';
    }
}
  • MyBatis配置文件 mybatis.xml (没有具体配置信息,因为会放入到Spring中配置)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--配置数据库信息-->
    <!--<properties resource="db.properties"/>-->
    <!--配置日志  LOG4J默认的配置文件就是 log4j.properties-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

</configuration>
  • 日志 log4j.xml
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  • 数据库的连接信息
<!--配置数据源 c3p0-->
<context:property-placeholder location="classpath:db.properties" />

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${driver}"></property>
  <property name="jdbcUrl" value="${url}"></property>
  <property name="user" value="${username}"></property>
  <property name="password" value="${password}"></property>
</bean>

<!--事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
</bean>

<tx:annotation-driven transaction-manager="dataSourceTransactionManager" />

<!--SqlSessionFactoryBean   MyBatis-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
  <!--mybatis配置文件-->
  <property name="configLocation" value="classpath:mybatis.xml"></property>
  <!-- 别名-->
  <property name="typeAliasesPackage" value="com.xingwei.entity"></property>

</bean>

<!--MyBatis在操作时,只写接口不写实现类 -->
<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.xingwei.mapper"></property>
</bean>
  • Spring配置文件:ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!--引入db.properties-->
    <context:property-placeholder location="classpath:db.properties" />
    <!--配置数据源 c3p0-->
    <bean id="dataSource" class="com.mchange.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>

    <!--事务管理器-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="dataSourceTransactionManager" />

    <!-- MyBatis: SqlSessionFactoryBean <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">-->
    <!--MyBatisPlus: MybatisSqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatis.xml"/>
        <!-- 别名-->
        <property name="typeAliasesPackage" value="com.xingwei.entity"/>
    </bean>

    <!--MyBatis在操作时,只写接口不写实现类 -->
    <bean id="configurer"   class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xingwei.mapper"/>
    </bean>

</beans>

开始操作 CRUD

1、创建实体类:见上面

2、创建一个Mapper接口,实现BaseMapper接口,无需编写 mapper.xml 文件,即可获得CRUD功能

package com.xingwei.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xingwei.entity.Student;
//Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
public interface StudentMapper  extends BaseMapper<Student> {
}

3、测试数据源的连接

package com.xingwei.test;

import com.xingwei.entity.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;

public class Test {

public static void main(String[] args) throws SQLException {
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
      ComboPooledDataSource ds =(ComboPooledDataSource) context.getBean("dataSource");
      System.out.println("数据源============="+ds);
      Connection connection  = ds.getConnection();
      System.out.println("连接对象------------"+connection);

      }
}

4、编写测试类 CRUD操作

package com.xingwei.test;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xingwei.entity.Student;
import com.xingwei.mapper.StudentMapper;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;

public class Test {
    /*增加的方法*/
    public static void testInsert(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Ioc容器中获取xxxMapper对象
        StudentMapper studentMapper = context.getBean("studentMapper",StudentMapper.class);
        Student student = new Student("ww",23); //增加数据  还会将数据库中的自增的主键   回写给原对象
        int count = studentMapper.insert(student);
        System.out.println(count);
        System.out.println(student);
    }
    /*删除的方法*/
    public static void testDelete(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Ioc容器中获取xxxMapper对象
        StudentMapper studentMapper = context.getBean("studentMapper",StudentMapper.class);
        int count = studentMapper.deleteById(2);
        System.out.println(count);
    }
    /*修改的方法*/
    public static void testUpdate(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Ioc容器中获取xxxMapper对象
        StudentMapper studentMapper = context.getBean("studentMapper", StudentMapper.class);
        Student student = new Student(1,"邢伟",20);
        int count = studentMapper.updateById(student);

        System.out.println(count);
    }
    
    /*查询的方法*/
    public static void testSelect(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Ioc容器中获取xxxMapper对象
        StudentMapper studentMapper = context.getBean("studentMapper", StudentMapper.class);
        Student student = studentMapper.selectById(1);
        System.out.println(student);
    }
    public static void main(String[] args) throws SQLException {

       //测试获取c3p0数据源连接
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ComboPooledDataSource ds =(ComboPooledDataSource) context.getBean("dataSource");
        System.out.println("数据源============="+ds);
        Connection connection  = ds.getConnection();
        System.out.println("连接对象------------"+connection);

        testInsert();
        testUpdate();
        testSelect();
        testDelete();
    }
}

以上操作可能出现的问题

1、建表的时候需要把表的自增选项给√上

2、出现类中属性与数据库中的字段不匹配,可以会进行转换的问题

解决方式:
1、加上@TableId(value = "stuno",type = IdType.AUTO)、@TableField(value = "stuname")...进行指定
2、通过配置来取消陀螺峰的转换

<setting name="mapUnderscoreToCamelCase" value="false"/>

3、@TableName("tb_student") :用于指定表的名称

posted @ 2020-12-16 12:47  黑黑XW  阅读(299)  评论(0编辑  收藏  举报