经过验证:springframework采用4.3以上版本,mybatis-spring采用1.3.0以上版本,可以解决冲突的问题。
<!--spring-mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
一级缓存:每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。 为了解决这一问题,MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果缓存起来, 当下次查询的时候,如果判断先前有个完全一样的查询,会直接从缓存中直接将结果取出,返回给用户,不需要再进行一次数据库查询了。
1、SqlSessionFactory通过spring提供的 SqlSessionFactoryBean 来创建,是SqlSessionFactoryBean.getObject()返回的结果。
SqlSessionFactoryBean 有以下几个属性:
1) dataSource 该属性必须配置,多数据源时会有多个dataSource,同时也需要配置多个sqlSessionFactory来对应。
2) configLocation 它是用来指定mybatis 的基础配置文件路径的。当SqlSessionFactoryBean提供的配置不能满足使用时,你可以使用mybatis-config.xml配置其他属性。通过configLocation属性指定该配置的路径,SqlSessionFactoryBean会使用该配置文件创建Configuration。
3) typeAliasesPackage 一般对应我们的实体类所在的包,会自动取对应包中简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。
<typeAliases>
<typeAlias type="com.changhf.entity" alias="user"/>
</typeAliases>
<!--上述配置,随实体类数量线性增长,可以通过package方式批量配置,且这种方式别名不区分大小写-->
<typeAliases>
<package name="com.changhf.entity"/>
</typeAliases>
mybatis自定义别名:string/long/int/double/boolean等小写配置
4) mapperLocations sqlSessionFactory会自动扫描并解析该路径下的所有映射器文件。
5) plugins 可以配置MyBatis的拦截器,拦截器的配置顺序会影响拦截器的执行顺序。
从上往下的拦截器,实际的执行顺序是这样,第一个拦截器会最后执行,最后一个会首先执行。然后出拦截器的顺序和配置的顺序一致,第一个最先返回,最后一个最后返回。
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource1" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="typeAliasesPackage" value="com.cgw360.cls.domain.model" />
<property name="mapperLocations" value="classpath*:sqlmap/**/*.xml" />
<property name="plugins">
<bean
class="com.cmcc.akso.plugin.database.page.PaginationInterceptor">
<property name="properties">
<props>
<prop key="dialect">${jdbc.type}</prop>
</props>
</property>
</bean>
</property>
</bean>
2、MapperScannerConfigurer 配置 它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
MyBatis-Spring 提供了一个动态代理的实现MapperFactoryBean。这个类可以将数据映射器接口注入到你的 service 层 bean 中。你不需要编写任何 DAO 实现的代码,因为 MyBatis-Spring 将会为你创建代理。
1) basePackage属性 必须要配的属性。
2) sqlSessionFactoryBeanName属性 只有当你配置多数据源的时候,这时会有多个sqlSessionFactory,你就需要通过该属性来指定哪一个sqlSessionFactory
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.chf.dao"/>
</bean>
3、mybatis只是一个半自动化的ORM实现,需要我们自己写sql,而不像hibernate那样,直接定义好实体与数据表的映射就行。
参考 mybatis开发Dao的方法
4、typeAliases属性
resultType属性的值为com.yu.model.User,表示这个查询返回的类型为com.yu.model.User类型。
<select id="findUserById" resultType="com.yu.model.User" parameterType="long">
select * from t_user where id = #{id}
</select>
如果有很多种类型的话,每次都得把类型的全路径写上,感觉就很费事。所以就可以用mybatis提供的typeAliases来进行别名配置。
<typeAliases>
<typeAlias type="com.yu.model.User" alias="User" />
<typeAlias type="com.yu.model.Org" alias="Org"/>
</typeAliases>
上面的配置可以改为
<select id="findUserById" resultType="User" parameterType="long">
select * from t_user where id = #{id}
</select>
5、连接池配置
个人经验,一般在线上建议最小连接数控制在10 左右,最大连接数控制在 20~30 左右即可。