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)