用MyBatis三剑客实现一个简单的电商信息管理系统

文章目录

一、主要功能

本次任务主要是使用MyBatis实现一个简单的电商信息管理系统,主要功能为:
1.显示所有商品的信息(默认为20个)
2. 点击按钮,显示出商品详情页的信息
3. 增加商品信息
4. 使用MyBatis配置pagehelper高效准确实现分页和动态排序

二、实现思路

1.数据管理:对于创建时间和更新时间不在业务代码中控制,通过DB的内置函数进行填写
2.通过LP的方式,执行数据SQL后面写上分页处理
3.mybatis pager监听到变化,mybatis pager通过LP自动把分页需要的LP再次执行
4.使用 pagehelper动态排序 把符合筛选条件的商品信息显示在主页上。

三、代码实现

1、在prom.xml中配置mybatis-generator

 <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <configuration>
          <verbose>true</verbose>
          <overwrite>true</overwrite>
        </configuration>
      </plugin>

mybatis插件需要的jar包自动加载
2、配置mybatis-generator

<generatorConfiguration>
    <!--导入属性配置-->
    <properties resource="datasource.properties"></properties>
创建datasource.properties,根据数据库配置参数
db.driverLocation=/Users/mysql-connector-java-5.1.6-bin.jar
db.driverClassName=com.mysql.jdbc.Driver

db.url=jdbc:mysql://192.1.1.1:3306/mall?characterEncoding=utf-8
#db.url=jdbc:mysql://数据库IP:数据库Port/你的database?characterEncoding=utf-8
db.username=mall
db.password=password


db.initialSize = 20
db.maxActive = 50
db.maxIdle = 20
db.minIdle = 10
db.maxWait = 10
db.defaultAutoCommit = true
db.minEvictableIdleTimeMillis = 3600000

3、根据数据库的表配置映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!--导入属性配置-->
    <properties resource="datasource.properties"></properties>

    <!--指定特定数据库的jdbc驱动jar包的位置-->
    <classPathEntry location="${db.driverLocation}"/>

    <context id="default" targetRuntime="MyBatis3">

        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的数据库连接 -->
        <jdbcConnection
                driverClass="${db.driverClassName}"
                connectionURL="${db.url}"
                userId="${db.username}"
                password="${db.password}">
        </jdbcConnection>


        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>


        <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
            targetPackage     指定生成的model生成所在的包名
            targetProject     指定在该项目下所在的路径
        -->
        <!--<javaModelGenerator targetPackage="com.mall.pojo" targetProject=".\src\main\java">-->
        <javaModelGenerator targetPackage="com.mall.pojo" targetProject="./src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
        <!--<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">-->
        <sqlMapGenerator targetPackage="mappers" targetProject="./src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
                type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
        -->

        <!-- targetPackage:mapper接口dao生成的位置 -->
        <!--<javaClientGenerator type="XMLMAPPER" targetPackage="com.mall.dao" targetProject=".\src\main\java">-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.mall.dao" targetProject="./src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>


        <table tableName="mall_shipping" domainObjectName="Shipping" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_cart" domainObjectName="Cart" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_cart_item" domainObjectName="CartItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_category" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_order_item" domainObjectName="OrderItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_pay_info" domainObjectName="PayInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="mall_product" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
            <columnOverride column="detail" jdbcType="VARCHAR" />
            <columnOverride column="sub_images" jdbcType="VARCHAR" />
        </table>
        <table tableName="mall_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>


        <!-- geekfanrnote mybatis插件的搭建 -->
    </context>
</generatorConfiguration>

4、使用mybatis-generator生成数据对象
在Maven下找到mybatis-generator双击,自动生成dao层、pojo层、mappers层
create_time字段记录数据创建的时间
update_time字段记录数据更新的时间
在查一些线上逻辑业务问题时,这两个字段至关重要

<arg column="create_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="update_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />

5.时间戳优化
对于创建时间和更新时间不在业务代码中控制,通过DB的内置函数进行填写,改变每个Mapper.xml中create_time、update_time属性,让他们由数据库完成

#{createTime,jdbc=TIMESTAMP},#{updateTime,jdbc=TIMESTAMP},

更改value属性为mysql内置函数now()

<insert id="insert" parameterType="com.mall.pojo.Cart" >
    insert into mall_cart (id, user_id, product_id, 
      quantity, checked, create_time, 
      update_time)
    values (#{id,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{productId,jdbcType=INTEGER}, 
      #{quantity,jdbcType=INTEGER}, #{checked,jdbcType=INTEGER}, now(),
      now())
  </insert>
更新操作中create_time属性不作处理、update_time属性更改为now()
 <update id="updateByPrimaryKeySelective" parameterType="com.mall.pojo.Cart" >
    update mall_cart
    <set >
      <if test="userId != null" >
        user_id = #{userId,jdbcType=INTEGER},
      </if>
      <if test="productId != null" >
        product_id = #{productId,jdbcType=INTEGER},
      </if>
      <if test="quantity != null" >
        quantity = #{quantity,jdbcType=INTEGER},
      </if>
      <if test="checked != null" >
        checked = #{checked,jdbcType=INTEGER},
      </if>
      <if test="createTime != null" >
        create_time = #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateTime != null" >
        update_time = now(),
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>

5.安装mybatis-plugin
对于跟踪DAO层,通过mybatis-plugin插件找到对应的xml,方便跳转
6.安装mybatis-pagehelper分页插件
在porm.xml中引入mybatis-pagehelper分页插件

   <!-- mybatis pager -->

    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.1.0</version>
    </dependency>

    <dependency>
      <groupId>com.github.miemiedev</groupId>
      <artifactId>mybatis-paginator</artifactId>
      <version>1.2.17</version>
    </dependency>

    <dependency>
      <groupId>com.github.jsqlparser</groupId>
      <artifactId>jsqlparser</artifactId>
      <version>0.9.4</version>
    </dependency>

7.执行分页查询部分数据,分页查询总数量,根据pagesize页面容量进行分页,对分页数量进行返回
利用 mybatis RequestParam 设置 默认值

@RequestParam(value = "pageNum", defaultValue = "1") int pageNum, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize
 

8.高效准确地分页及动态排序

public ServerResponse getProductList(int pageNum, int pageSize) {
  
    PageHelper.startPage(pageNum, pageSize);    // PageHelper 加载
    List<Product> productList = productMapper.selectList();
 
    List<ProductListVo> productListVoList = Lists.newArrayList();    // vo
    for (Product productItem : productList) {
        ProductListVo productListVo = assembleProductListVo(productItem);
        productListVoList.add(productListVo);
    }

    //根据productList生成PageInfo对象,会根据productList 各种计算页面参数
    PageInfo pageResult = new PageInfo(productList);    
    //但是给前端展示的不是整个 productList,而是productVoList 所以需要重置一下 setList
    pageResult.setList(productListVoList);
    return ServerResponse.createBySuccess(pageResult);
}

9.pageHelper 分页插件还会自动加 limit 等语句,mapper中写sql的时候,末尾加 “;” 会出现语法错误

<select id="selectList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from immall_product
    order by id asc
</select>

四、效果展示

用MyBatis三剑客实现一个简单的电商信息管理系统
用MyBatis三剑客实现一个简单的电商信息管理系统
用MyBatis三剑客实现一个简单的电商信息管理系统

五、总结

mybatis-generator是很好用的mybatis自动代码生成工具。手动写一个个实体类和mapper还有xml配置文件会很麻烦,使用mybatis-generator只需要简单的配置就能完成。在mapper中定义的方法不能通过ctrl+鼠标右键找到对应的xml实现语句中,对代码的编写效率大打折扣,使用mybatis-plugin跳转插件提高效率。mybatis-pagehelper分页插件可以高效准确实现分页和动态排序,无需去封装以及关心sql分页等问题,使用很方便,前端取数据也很方便。

上一篇:MyBatis处理MySQL字段类型date与datetime


下一篇:MyBatis(二)批量插入insert语句拼接方式