Contents
  1. 1. mybatis—template的配置
  2. 2. mybatis相关优化
  3. 3. mybatis标签
    1. 3.1. foreach标签的使用
    2. 3.2. chose标签的使用
  4. 4. PageHelper的引入
    1. 4.1. 配置和使用
    2. 4.2. 注意事项
  5. 5. mybatis xml热加载
    1. 5.1. 引用步骤
    2. 5.2. 使用和原理

mybatis—template的配置

相对于配置接口的纯mybatis,利用mybatis-template可以简化代码,省去接口层,直接调用相关的sql
下面是原始的mybatis的配置方法

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:com/ge/eapp/xml/*Mapper.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ge.eapp.dao" />
</bean>

  • 引入相关jar包
  • spring中添加配置

    <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定数据库连接信息 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 指定SQL语句的XML文件 -->
    <property name="mapperLocations" value="classpath:com/test/dao/*.xml" />
    </bean>
    <!--定义SqlSessionTemplate -->
    <bean id="sqlSessionTemplate"
    class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlsessionfactory"/>
    </bean>
  • java引用

    @Resource
    private SqlSessionTemplate template;
    public void updateUsers(){
    template.update("com.test.dao.UserMapper.update", 1);
    template.update("com.test.dao.UserMapper.update", 2);
    }

mybatis相关优化

  • 设置typeAliasesPackage,可以在mapper文件中省去类的包路径
    <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:com/test/dao/*.xml" />
    <property name="typeAliasesPackage" value="com.test.entity"/>
    </bean>

简化的地方resultType 和parameterType可以直接写User了,而不是com.test.entity.User

<select id="findAll" resultType="User" >
select * from USERS
</select>
<insert id="add" useGeneratedKeys="true" keyProperty="id" parameterType="User">
insert into USERS(USERNAME,PASSWORD) VALUES(#{username},#{password})
</insert>

  • resultType为实体类时,只有属性和数据库字段不一致时才需要用resultMap指定不一样的字段映射
    如果所有属性和数据库字段名一样,不需要用 resultMap来映射

    <resultMap id="mainResultMap" type="account_huang.entity.Sleep" >
    result column="GET_UP" property="getUp" />
    result column="GET_SLEEP" property="getSleep" />
    </resultMap>
  • parameterType省可以略不写

mybatis标签

foreach标签的使用

参数可以是一个 list也可以是一个数组Array,放在hashmap中,从而批量删除不需要用 ${}注入式 拼进去,通过foreach直接取更安全

<delete id="deleteById" parameterType="java.util.HashMap">
delete from ${tableName} where id in
<foreach collection="ids"
open="(" close=")" separator="," item="id">
#{id}
</foreach>
</delete>
@Transactional
public int deleteById(String tableName,String ids){
Map<String, Object> params =new HashMap<String, Object>();
params.put("tableName",tableName);
params.put("ids",ids.split(","));
int result=template.delete("account_huang.dao.CommonDao.deleteById",params);
return result;
}

chose标签的使用

<select id="findBySalary"
parameterType="com.tarena.entity.Condition"
resultType="com.tarena.entity.Emp">
select * from t_emp
<choose>
<when test="salary > 3000">
where sal>#{salary}
when>
<otherwise>
where sal>=3000
otherwise>
choose>
select>

PageHelper的引入

作用:

  • 可以在mybatis查询的时候,做带分页的查询,会根据配置的dialect自动实现不同数据库的分页语句。从而从某种角度上实现了跨数据库和简化sql,因为sql不再去嵌入分页语句
  • 可以一起求count,省略了写count的sql,简化xml代码

    配置和使用

  • 配置mybatis引入pagehelper,注意配置dialect的数据库类型

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:com/ge/eapp/xml/*Mapper.xml" />
    <property name="plugins">
    <array>
    <bean class="com.github.pagehelper.PageHelper">
    <property name="properties">
    <value>
    dialect=mysql
    reasonable=true
    </value>
    </property>
    </bean>
    </array>
    </property>
    </bean>
  • jar包依赖

    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.0.0</version>
    </dependency>
  • java中调用,注意pageNum为1表示第一页,pageNum为2表示第二页

    PageHelper.startPage(pageIndex+1, pageSize,true);
    list=template.selectList("com.ge.eapp.dao.PCBMapper.findCourseByCode", map);
    PageInfo<Course> page = new PageInfo(list);
    long total=page.getTotal();

注意事项

  • select 不能以 ; 号结尾,否则会sql语法报错,如下desc后不能加 ;号

    <select id="findCourseByCodeAllDistinct" >
    select * from course order by e.read_times desc
    </select>
  • pageNum是以1开头的,表示第一页取size个,如果pageNum为0的话,也还是取第一页;如果pageNum>总页数,则取最后一个,所以

PageHelper.startPage(pageNum, pageSize,true);

mybatis xml热加载

参考BLOG: http://thinkgem.iteye.com/blog/2304557

引用步骤

  1. 引入 SqlSessionFactoryBean.java这个文件,只需要改一下类包的路径。

  2. applicationContext.xml里面的配置 指向这个Bean。如下:

  3. 引入mybatis-refresh.properties 配置一些参数
    mappingPath指向的是要扫描的xml包路径

    enabled=true
    delaySeconds=60
    sleepSeconds=3
    mappingPath=account_huang/mybatisXml
  4. 引入 MapperRefresh.java文件

使用和原理

通过一个独立的线程,定时去check所有xml文件的lastModified(),检查是否变更过。如果有变更,则重新构建mybatis的XMLMapperBuilder,然后调用parse()生效。
实现FactoryBean类,重写buildSqlSessionFactory()方法,启动refresh线程和一些异常处理(MapperXML有错误时)

XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
xmlMapperBuilder.parse();

  • 设置刷新时间,定时的去check路径下面的file是否有变动file.lastModified(),来判断是否要更新
    #设置为false表示不启动该服务,就不会定时刷新xml文件
    enabled=true
    #设置延迟时间,表示等待程序启动后,延迟60秒后才开始 定期刷新xml文件
    delaySeconds=60
    #一旦刷新开始了,则设置sleepSeconds来设置每次刷新的间隔时间,一旦开始刷新了,就每3秒check一次
    sleepSeconds=3
    #设置xml文件的路径,相对路径
    mappingPath=com/test/dao
Contents
  1. 1. mybatis—template的配置
  2. 2. mybatis相关优化
  3. 3. mybatis标签
    1. 3.1. foreach标签的使用
    2. 3.2. chose标签的使用
  4. 4. PageHelper的引入
    1. 4.1. 配置和使用
    2. 4.2. 注意事项
  5. 5. mybatis xml热加载
    1. 5.1. 引用步骤
    2. 5.2. 使用和原理