• 高并发秒杀系统--mybatis整合技巧


    mybatis实现DAO接口编码技巧

    1.XML文件通过namespace命名空间关联接口类

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.azcode.dao.SeckillDao">

    2.接口传入的参数类型可以通过@Param("paramName")告知mybatis

    /**
         * 根据偏移量查询秒杀商品列表
         * @param offset
         * @param limit
         * @return
         */
        List<Seckill> queryAll(@Param("offset") int offset, @Param("limit") int limit);

    3.通过ognl表达式可以映射实体类的同时映射实体类中的其他实体对象

    <select id="queryByIdWithSeckill" resultType="SuccessKilled">
            <!-- 根据id查询SuccessKilled并携带Seckill -->
            <!-- mybatis技巧 如何把结果映射到SuccessKilled同时映射Seckill -> ongl表达式 el表达式 -->
            <!-- mybatis的优势,可以自由的控制sql -->
            select
              sk.seckill_id,
              sk.user_phone,
              sk.state,
              sk.create_time,
              s.seckill_id "seckill.seckill_id",
              s.name "seckill.name",
              s.number "seckill.number",
              s.start_time "seckill.start_time",
              s.end_time "seckill.end_time",
              s.create_time "seckill.create_time"
            from success_killed sk
            inner join seckill s on sk.seckill_id = s.seckill_id
            where sk.seckill_id = #{seckillId} and sk.user_phone = #{userPhone}
        </select>

    mybatis 整合 Spring理论

    1.目标:[更少的代码]  [更少的配置]  [足够的灵活性]

    2.更少的代码:只写接口不写实现类(接口本身可以传递足够多的信息)

    3.更少的配置:

      3.1别名(包扫描org.azcode.dao.Seckill -> Seckill) typeAliasesPackage

      3.2配置扫描(自动XML配置文件扫描 Mybatis配置文件+Mapper的XML) configLocation mapperLocations

      3.3DAO接口的实现(1.自动实现DAO接口2.自动注入Spring容器) MapperScannerConfigurer -> basePackage

    4.足够的灵活性:自己定制SQL 自由传参 结果集自动赋值resultMap

    5.整合方式:XML提供SQL DAO提供Mapper

    [Mybatis全局配置文件 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>
            <!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键值 -->
            <setting name="useGeneratedKeys" value="true"/>
            <!-- 使用别名代替列明 默认true -->
            <setting name="useColumnLabel" value="true"/>
            <!-- 开启驼峰命名转换:Table(create_time) -> Entity(createTime) -->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    </configuration>

    [Mybatis-Spring整合 spring-dao.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"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- Spring整合Mybatis的过程 -->
        <!-- 1:配置数据库相关的参数 properties参数使用:${property_name} -->
        <context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="NEVER"/>
    
        <!-- 2: 配置数据库连接池 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- 配置连接池属性 -->
            <property name="driverClass" value="${driver}"/>
            <property name="jdbcUrl" value="${url}"/>
            <property name="user" value="${username}"/>
            <property name="password" value="${password}"/>
            <!-- c3p0连接池的私有属性 -->
            <property name="maxPoolSize" value="30"/>
            <property name="minPoolSize" value="10"/>
            <!-- 关闭连接池后不自动Commit默认false -->
            <property name="autoCommitOnClose" value="false"/>
            <!-- 获取连接超时时间避免一直等待 -->
            <property name="checkoutTimeout" value="1000"/>
            <!-- 连接失败之后的重复次数 -->
            <property name="acquireRetryAttempts" value="2"/>
        </bean>
    
        <!-- 约定大于配置 -->
        <!-- 3:配置SqlSessionFactory对象 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 配置Mybatis全局配置文件 -->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
            <!-- Entity包扫描使用别名 org.azcode.entity.Seckill -> Seckill -->
            <property name="typeAliasesPackage" value="org.azcode.entity"/>
            <!-- 扫描sql配置的文件:Mapper需要的xml文件 -->
            <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        </bean>
    
        <!-- 4:配置扫描Dao接口包,动态实现Dao接口,并注入到Spring容器中 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 注入sqlSessionFactory属性 -->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <!-- 给出扫描Dao接口的包 -->
            <property name="basePackage" value="org.azcode.dao"/>
        </bean>
    </beans>
  • 相关阅读:
    mysql注入小测试
    让函数返回指定值实用写法
    源码下载网址
    带宽
    九度oj 题目1080:进制转换
    九度oj 题目1079:手机键盘
    poj 3046 Ant Counting
    整数拆分问题
    poj 2229 Sumsets
    九度oj 题目1411:转圈
  • 原文地址:https://www.cnblogs.com/azcode/p/6707601.html
Copyright © 2020-2023  润新知