Java DAO、Service、web理解之DAO层

DAO 模式

DAO (Data Access Object 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。(接口设计+SQL编写,不涉及业务代码)

DAO 包含的模块:

  1. dao :接口层(Mapper 自动实现DAO接口,API编程方式实现DAO接口),一般采用Mapper 自动实现DAO接口
  2. entity:实体层
  3. resource:sql(xml提供sql,注解提供sql),一般使用前者,注解对于简单sql使用较为方便

mybatis 实现原理 参数+sql =Entity/List

 

mybatis 参数配置注意点:

<!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列别名替换列名,默认: true 
    select content as title from table 
-->
<setting name="useColumnLabel" value="true"/>
<!-- 开启驼峰命名转换 : Table(create_time) -> Entity(createTime) -->
<setting name="mapUnderscoreToCamelCase" value="true"/>

mybatis奇技淫巧:

  1. ignore 使用 ,为防止主键冲突,使用ignore关键字,若插入失败不会抛异常,而是返回插入成功的条数为0。
        <insert id="insertSuccessKilled">
            <!--当出现主键冲突时(即重复秒杀时),会报错;不想让程序报错,加入ignore-->
            INSERT ignore INTO success_killed(seckill_id,user_phone,state)
            VALUES (#{seckillId},#{userPhone},0)
        </insert>

     

  2. 返回结果实体中出现多对1的情况,用双引号指明是对象的那个属性
    <select id="queryByIdWithSeckill" resultType="SuccessKilled">
    
            <!--根据seckillId查询SuccessKilled对象,并携带Seckill对象-->
            <!--如何告诉mybatis把结果映射到SuccessKill属性同时映射到Seckill属性-->
            <!--可以自由控制SQL语句-->
    
            SELECT
                sk.seckill_id,
                sk.user_phone,
                sk.create_time,
                sk.state,
                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>

     

  3. 多参数需要用@param注解,java没有形参保存记录

 

mybatis 与Spring整合

  1. 配置数据库连接池
    <!--配置整合mybatis过程
        1.配置数据库相关参数-->
        <context:property-placeholder location="classpath:jdbc.properties"/>
    
        <!--2.数据库连接池-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!--配置连接池属性-->
            <property name="driverClass" value="${jdbc.driver}" />
    
            <!-- 基本属性 url、user、password -->
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="user" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    
            <!--c3p0私有属性-->
            <property name="maxPoolSize" value="30"/>
            <property name="minPoolSize" value="10"/>
            <!--关闭连接后不自动commit-->
            <property name="autoCommitOnClose" value="false"/>
    
            <!--获取连接超时时间-->
            <property name="checkoutTimeout" value="1000"/>
            <!--当获取连接失败重试次数-->
            <property name="acquireRetryAttempts" value="2"/>
        </bean>

     

  2. 配置SqlSessionFactory对象,约定大于配置
    <!--约定大于配置-->
        <!--3.配置SqlSessionFactory对象-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--往下才是mybatis和spring真正整合的配置-->
            <!--注入数据库连接池-->
            <property name="dataSource" ref="dataSource"/>
            <!--配置mybatis全局配置文件:mybatis-config.xml-->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
            <!--扫描entity包,使用别名,多个用;隔开-->
            <property name="typeAliasesPackage" value="cn.codingxiaxw.entity"/>
            <!--扫描sql配置文件:mapper需要的xml文件-->
            <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        </bean>
    

     

  3. 配置扫描DAO接口包,动态实现DAO接口,注入到spring容器中
        <!--4:配置扫描Dao接口包,动态实现DAO接口,注入到spring容器-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--注入SqlSessionFactory-->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <!-- 给出需要扫描的Dao接口-->
            <property name="basePackage" value="cn.codingxiaxw.dao"/>
        </bean>

     

最后,需要到dao层接口单独写单元测试

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值