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>