周梦康 发表于 2016-01-25 2592 次浏览 标签 : Mybatis

首先理解 Mybatis 的基础配置,笔记 demo https://github.com/zhoumengkang/notes/tree/master/java/mybatisDemo

然后就是把 Mybatis 和 SpringMVC 整合的笔记,下面的笔记可能只有自己能看懂了。

容器最开始加载applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 自动扫描包 ,将带有注解的类 纳入spring容器管理 -->
    <context:component-scan base-package="me.topit.awesome.t16"/>
    <import resource="applicationContext-persistence.xml"/>
    <import resource="applicationContext-mybatis.xml"/>
</beans>

component-scan可以不用管,和 mybatis 的配置无关,主要是下面的一个持久层配置applicationContext-persistence.xml和 mybatis 配置applicationContext-mybatis.xml

持久层配置applicationContext-persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 数据库配置 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
    <bean id="dataSource" scope="prototype" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}" />
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
        <property name="minPoolSize" value="${c3p0.minPoolSize}" />
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    <!-- 数据库配置 -->

	<!-- 事务配置 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
    <!-- 事务配置 -->

    <!-- mybatis 配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!-- mapper映射的 xml 文件路径 -->
        <property name="mapperLocations" value="classpath:mybatis/*.xml" />
    </bean>
</beans>

其中加载了jdbc.properties数据库配置文件,如下

c3p0.initialPoolSize=5
c3p0.minPoolSize=5
c3p0.initialPoolSize=3
c3p0.maxPoolSize=20
c3p0.maxStatementsPerConnection=60
c3p0.checkoutTimeout=100
c3p0.maxIdleTime=3600

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/shiliu?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&sessionVariables=time_zone%3D%27%2B08%3A00%27&autoReconnect=true
jdbc.username=root
jdbc.password=zmkzmk

加载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>
        <!-- 全局映射器启用缓存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 查询时,关闭关联对象即时加载以提高性能 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
        <setting name="aggressiveLazyLoading" value="false" />
        <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 允许使用列标签代替列名 -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
        <setting name="useGeneratedKeys" value="true" />
        <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
        <setting name="autoMappingBehavior" value="FULL" />
        <!-- 对于批量更新操作缓存SQL以提高性能 -->
        <setting name="defaultExecutorType" value="REUSE" />
        <!-- 数据库超过25000秒仍未响应则超时 -->
        <setting name="defaultStatementTimeout" value="25000" />
    </settings>

    <!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->
    <typeAliases>
        <package name="me.topit.awesome.t16.po"/>
    </typeAliases>

</configuration>

这里typeAliases的配置就是官方的规定:在me.topit.awesome.t16.po这个包下的对象的手写字母小写就是该对象的别名。这在后面的mapperLocations可以用到,避免了每次写一长串的包名。

加载applicationContext-mybatis.xml

任务就是扫描me.topit.awesome.t16.dao下的 Dao 类

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="me.topit.awesome.t16.dao" />
    </bean>
</beans>

Demo 演示

me.topit.awesome.t16.dao下新建一个 Dao 接口

该接口中使用了注解和 xml 配置两种形式。

package me.topit.awesome.t16.dao;

import me.topit.awesome.t16.entity.User;
import me.topit.awesome.t16.po.UserPo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;


@Repository
public interface UserDao {

    int add(UserPo userPo);

    int update(UserPo userPo);

    @Select("select id,name from user where id= #{id}")
    User getOne(@Param("id") int id);

    @Select("select id,name,icon from user limit 10")
    List<User> list();

    @Delete("delete from user where id= #{id}")
    boolean del(@Param("id") int id);

}

使用注解形式的,可以直接调用。

没有加注解的则需要配置 xml 文件,为addupdate添加 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="me.topit.awesome.t16.dao.UserDao">
    <insert id="add"
        useGeneratedKeys="true" keyColumn="id" keyProperty="id"
        parameterType="userPo">
          INSERT INTO `user` (`name`,sex,register_ts) VALUES (#{name},#{sex},#{registerTs})
    </insert>

    <update id="update" parameterType="userPo">
        UPDATE `user`
            <set>
                <if test="name != null">`name`=#{name},</if>
                <if test="icon != null">icon=#{icon},</if>
                <if test="sex != null">sex=#{sex},</if>
                <if test="birthday != null">birthday=#{birthday},</if>
                <if test="location != null">location=#{location},</if>
            </set>
        WHERE id=#{id}
    </update>
</mapper>

上面的namespace则是对应的 Dao 的接口名me.topit.awesome.t16.dao.UserDaoparameterTypeuserPo是因为mybatis-config.xml配置的别名,也就说这个需要的参数类型也可以写成me.topit.awesome.t16.po.UserPo

评论列表