mybatis 整合 spring(持续更新)

Mybatis 重要的类:SqlSessionFactoryBuilder - - > SqlSessionFactory - - > SqlSession

Mybatis的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。

Mybatis-Spring: SqlSessionFactoryBean - - > SqlSession

Mybatis-Spring是基于SqlSessionFactoryBean的。在使用Mybatis-Spring的时候,我们也需要SqlSession,而且这个SqlSession是内嵌在程序中的,一般不需要我们直接访问。SqlSession也是由SqlSessionFactory来产生的,但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。

1、spring 整合 mybatis

将properties文件读入配置文件

<context:component-scan base-package="com.lby"/>
<context:property-placeholder location="classpath*:db.properties" />
 <!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="${db.initialSize}"/>
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="${db.maxActive}"/>
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="${db.maxIdle}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- sql映射文件路径 -->
        <property name="mapperLocations" value="classpath*:mappers/*Mapper.xml"/>
        <!--todo 配置类型别名:采用包扫描的方式到基础包下扫描所有的类,作为MyBatis能够转换的类型,多个包之间用;分隔 -->
        <!--todo 设置别名,在mapper.xml中可以使用简称 -->
        <property name="typeAliasesPackage">
            <value>
                com.lby.bean
            </value>
        </property>


        <!-- 分页插件 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageHelper">
                    <property name="properties">
                        <value>
                            dialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>

</bean>

扫描对应包下的接口,并注入spring中

<bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--要扫描的类-->
        <property name="basePackage" value="com.mmall.dao"/>
</bean>

MapperScannerConfigurer 作用:如下,因为mapper 类并没有写  @Repository ,所以这个类的作用就是加上这个注解

public interface UserMapper {

    User login(String loginName);
}

 事务管理

<!-- 事务管理 -->
<!--定义事物管理器,由spring管理事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="rollbackOnCommitFailure" value="true"/>
</bean>


<!-- 使用@Transactional进行声明式事务管理 -->
<!--注解驱动的事务管理,指定事务管理器 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

 mapper ,resultMap映射pojo类,下面是基于constructor的,pojo类必须要有constructor

<mapper namespace="com.mmall.dao.CartMapper" >
  <resultMap id="BaseResultMap" type="com.mmall.pojo.Cart" >
    <constructor >
      <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="user_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="product_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="quantity" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="checked" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="create_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
      <arg column="update_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
    </constructor>
  </resultMap>
</mapper>

以下是基于setter,pojo类必须要有setter


<resultMap id="articleResultMap" type="Article">
    <result column="putaway_date" property="putawayDate"></result>
    <result column="create_date" property="createDate"></result>
    <!-- 查询出商品的类型 :关联映射  N-1 -->
    <association property="articleType" javaType="ArticleType"
		     column="TYPE_CODE" select="com.lby.repository.ArticleTypeMapper.getTypeByCode"></association>
</resultMap>

或者使用注解形式,不用写mapper.xml

public interface UserMapper {

    @Select("select * from ec_article_type where code like #{typeCode} and length(code) = #{len} ")
    List<ArticleType> loadSecondTypes(@Param("typeCode") String typeCode, @Param("len") int i);
}

2、springboot 整合 mybatis(纯注释)

配置数据源

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/lby
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20

@MapperScan 扫描对应的包并注入spring, 跟 MapperScannerConfigurer  作用一样

或者在 mapper类上 @Mapper 

@SpringBootApplication
@MapperScan("com.lby.mapper")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(QuickStartApplication.class, args);
    }

}
public interface UserMapper {

    @Select("select * from ec_article_type where code like #{typeCode} and length(code) = #{len} ")
    List<ArticleType> loadSecondTypes(@Param("typeCode") String typeCode, @Param("len") int i);
}

 3、springboot 整合 mybatis(xml)

mybatis-plus:
  #指定mybatis映射文件的地址
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.lby.pojo
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

然后写一个mapper.xml就可以了 ,@MapperScan不能忘(或@Mapper)

猜你喜欢

转载自blog.csdn.net/q503385724/article/details/88655932