您的位置:首页 > 编程语言 > Java开发

Spring Boot + MyBatis 实现CRUD

qintaipeng 2020-05-11 04:08 573 查看 https://blog.csdn.net/qintaipe

Spring Boot + MyBatis 实现CRUD

  • CRUD 第一步 查
  • Mybatis的逆向工程generator

    通过Mybatis提供的generator完成逆向工程使得项目在创建model层更高效。
    这样通过大佬哪里得到了逆向工程的jar包,所以不用自己去完成generator的实现。
    我通过百度云分享给大家
    链接:https://pan.baidu.com/s/1l4CIAmlXiLCnetA7_W5ZfQ
    提取码:u26e
    这个generator逆向工程的项目只需要修改几个地方运行就可得到实体类,mapper接口以及mapper.xml.将这个项目导入eclipse中,目录结构如下:

    然后 打开generatorConfig.xml这是generator的配置文件,只需要改几个地方就可以完成逆向工程。首先是

    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/sb_middleware" userId="root" password="1234">
    </jdbcConnection>

    第一.这一部分是数据库的数据源连接,主要修改数据库名以及账号密码。

    <!-- targetProject:生成PO类的位置 -->
    <javaModelGenerator targetPackage="org.example.model.entity" targetProject=".\src">
    <!-- enableSubPackages:是否让schema作为包的后缀 -->
    <property name="enableSubPackages" value="false" />
    <!-- 从数据库返回的值被清理前后的空格 -->
    <property name="trimStrings" value="true" />
    </javaModelGenerator>
    
    <!-- targetProject:mapper映射文件生成的位置 -->
    <sqlMapGenerator targetPackage="org.example.model.mappers" targetProject=".\src">
    <!-- enableSubPackages:是否让schema作为包的后缀 -->
    <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>
    
    <!-- targetPackage:mapper接口生成的位置 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="org.example.model.mapper" targetProject=".\src">
    <!-- enableSubPackages:是否让schema作为包的后缀 -->
    <property name="enableSubPackages" value="false" />
    </javaClientGenerator>

    第二 这一部分主要改的是targetPackage这个属性。这个属性是包的名字,对应spring boot项目的包名,只要包名一直了,就可以直接复制过去就可以用,不用在修改生成的类里面的包名。

    <!-- 指定数据库表 -->
    <table schema="" tableName="user_order" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false">
    </table>

    第三 这是确定要名称要逆向生成那个表。tableName对应数据库里面的表名。

    然后运行这个类
    生成实体类,mapper接口以及mapper.xml.我们需要的Mybatis的文件。

    把生成的文件copy到我们的Spring boot项目中,第一个步骤就完成了。

    整合Mybatis

    导入所依赖的jar

    <!--spring-mybatis-->
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis-spring-boot.version}</version>
    </dependency>
    
    <!--for page 分页的依赖-->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${mybatis-pagehelper.version}</version>
    </dependency>

    Mybatis的相关配置

    数据源的配置 spring-jdbc.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    " >
    
    <!--主数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="true" >
    <!-- 基本属性 url、user、password -->
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    
    <!-- 配置初始化大小、最小、最大 -->
    <property name="initialSize" value="10" />
    <property name="minIdle" value="10" />
    <property name="maxActive" value="20" />
    
    <!-- 配置获取连接等待超时的时间 -->
    <property name="maxWait" value="60000" />
    
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="60000" />
    
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="300000" />
    
    <property name="validationQuery" value="SELECT 1 " />
    <property name="testWhileIdle" value="true" />
    <property name="testOnBorrow" value="false" />
    <property name="testOnReturn" value="false" />
    
    <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
    <property name="poolPreparedStatements" value="true" />
    <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    
    <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->
    <property name="filters" value="stat" />
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    </bean>
    
    </beans>

    mybatis-config.xml

    <?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>
    
    <settings>
    <!-- Globally enables or disables any caches configured in any mapper under this configuration -->
    <setting name="cacheEnabled" value="true"/>
    <!-- Sets the number of seconds the driver will wait for a response from the database -->
    <setting name="defaultStatementTimeout" value="3000"/>
    <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- Allows JDBC support for generated keys. A compatible driver is required.
    This setting forces generated keys to be used if set to true,
    as some drivers deny compatibility but still work -->
    <setting name="useGeneratedKeys" value="true"/>
    <!-- 设置控制台打印sql -->
    <setting name="logImpl" value="stdout_logging" />
    </settings>
    
    <!-- Continue going here -->
    
    <plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
    <!-- 4.0.0以后版本可以不设置该参数 -->
    <property name="dialect" value="mysql"/>
    <!-- 该参数默认为false -->
    <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
    <!-- 和startPage中的pageNum效果一样-->
    <property name="offsetAsPageNum" value="true"/>
    <!-- 该参数默认为false -->
    <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
    <property name="rowBoundsWithCount" value="true"/>
    <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
    <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
    <property name="pageSizeZero" value="true"/>
    <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
    <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
    <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
    <property name="reasonable" value="false"/>
    <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
    <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
    <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
    <!-- 不理解该含义的前提下,不要随便复制该配置 -->
    <!--<property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>-->
    <!-- 支持通过Mapper接口参数来传递分页参数 -->
    <property name="supportMethodsArguments" value="false"/>
    <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
    <property name="returnPageInfo" value="none"/>
    </plugin>
    </plugins>
    
    </configuration>

    spring boot 的配置文件 配置Mybaits相关配置

    #数据源配置
    datasource.url=jdbc:mysql://127.0.0.1:3306/sb_middleware?useUnicode=true&amp;characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
    datasource.username=root
    datasource.password=1234
    
    #mybatis
    mybatis.config-location=classpath:mybatis-config.xml
    mybatis.checkConfigLocation=true
    mybatis.mapper-locations=classpath:mappers/*.xml

    这样就完成Mybatis的整合步骤。

    CRUD 第一步 查

    第一步 直接进行分页查询。由于在之前的步骤中已经导入的分页所选的jar包了,所以直接开始写代码
    Contriller层:

    @RequestMapping(value = "list",method = RequestMethod.GET)
    @ResponseBody
    public BaseResponse pageList (UserOrderPageDto  dto) {
    System.out.println(dto.getPageNo()+"+++"+dto.getPageSize());
    BaseResponse response = new BaseResponse(StatusCode.success);
    try {
    //userOrderMapper.selectOrder();
    response.setDate(orderService.pageGetOrders(dto));
    } catch (Exception e) {
    log.error("订单详细层出现错误");
    response = new BaseResponse(StatusCode.fail.getCode(), e.getMessage());
    }
    
    return response;
    }

    service层

    public PageInfo<UserOrder> pageGetOrders(UserOrderPageDto dto){
    PageHelper.startPage(dto.getPageNo(),dto.getPageSize());
    List<UserOrder> list = userOrderMapper.pageSelectOrder(dto);
    return new PageInfo<>(list);
    }

    model 层

    <select id="pageSelectOrder" resultType="org.example.model.entity.UserOrder" parameterType="org.example.model.entity.UserOrderPageDto">
    SELECT
    <include refid="Base_Column_List"></include>
    FROM
    user_order
    WHERE
    is_active=1
    <if test="search!=null and search!=''">
    AND order_no LIKE CONCAT('%',#{search},'%')
    </if>
    ORDER BY create_time DESC
    </select>

    if里是模糊查询要用到的条件,如果不需要可以删掉

    运行得到相应的分页数据和查出的数据。分页数据主要是配合前端页面制作分页的视图。在分页数据和查出的数据再与表单相结合完成分页功能,这里重点是后台的分页数据获取。前端的不赘述。
    返回给页面的结果:

    {
    "code": 0,
    "msg": "成功",
    "date": {
    "pageNum": 1,
    "pageSize": 2,
    "size": 2,
    "orderBy": null,
    "startRow": 1,
    "endRow": 2,
    "total": 4,
    "pages": 2,
    "list": [
    {
    "id": 1,
    "orderNo": "Book20191222001",
    "userId": 10010,
    "isActive": 1,
    "createTime": "2019-12-25 11:30:14",
    "updateTime": "2019-12-28 11:37:31",
    "payStatus": 1
    },
    {
    "id": 5,
    "orderNo": "Book2019122310010",
    "userId": 10010,
    "isActive": 1,
    "createTime": "2019-12-25 11:20:42",
    "updateTime": "2019-12-28 11:37:31",
    "payStatus": 1
    }
    ],
    "firstPage": 1,
    "prePage": 0,
    "nextPage": 2,
    "lastPage": 2,
    "isFirstPage": true,
    "isLastPage": false,
    "hasPreviousPage": false,
    "hasNextPage": true,
    "navigatePages": 8,
    "navigatepageNums": [
    1,
    2
    ]
    }
    }
    qintaipeng 原创文章 8获赞 0访问量 200 关注 私信
    标签: