MYBATIS
1.#{}相当于占位符,会自动拼接""、${}动态拼接的变量,不会自动拼接"",在业务层都需要增加@Param("AAA")来指定变量名;
2.Mapper文件执行原理:
public UserMapper userMapper;
@Before
public void setUp() throws Exception {
// 指定配置文件
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 1. 映射文件的命名空间(namespace)必须是mapper接口的全路径
// 2. 映射文件的statement的id必须和mapper接口的方法名保持一致
// 3. Statement的resultType必须和mapper接口方法的返回类型一致
// 4. statement的parameterType必须和mapper接口方法的参数类型一致(不一定)
this.userMapper = sqlSession.getMapper(UserMapper.class);
}
3.mybatis一级缓存的作用域是sesson,当openSession后,若执行的是相同的sql,mybatis不会执行,会从缓存里取数据;一级缓存默认开启,无法关闭,满足条件:同一个Session,且sql和参数相同。
4.用sqlSession.clearCache()可以清除之前查询过程,重新出发查询;
5.mybatis 的二级缓存的作用域是一个mapper的namespace ,同一个namespace中查询sql可以从缓存中命中。
6.开启二级缓存:
<settings>
<!--开启二级缓存,全局总开关,这里关闭,mapper中开启了也没用-->
<setting name="cacheEnabled" value="false"/>
</settings>
7.<![CDATA[ < ]]>这个使用。sql不用转义。
8.mybatis文件的配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:properties/*.properties"/>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url"
value="jdbc:mysql://${jdbc.host}:3306/${jdbc.database}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.passWord}"/>
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}"></property>
<!-- 连接池最大数据库连接数 0 为没有限制 -->
<property name="maxActive" value="${jdbc.maxActive}"></property>
<!-- 连接池最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态 0 为没有限制 -->
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}"></property>
<!--最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制-->
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mappers/*.xml"></property>
<!--如果mybatis-config.xml没有特殊配置也可以不需要下面的配置-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zpc.mybatis.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
9.结果集映射
在PreparedStatementHandler中的query()方法中,是用ResultSetHandler.handleResultSets()来完成结果集的映射的。
1>每条结果都会生成一个java对象
2>根据构造方法实例化对象
3>自动映射(结果集有但在resultMap里没有配置的字段),有两情况会发生自动映射
在resultMap上配置了autoMapping="true"属性
在mybatis-config.xml配置了autoMappingBehavior="PARTIAL|FULL",默认为PARTIAL。
在实际应用中,都会使用自动映射,减少配置的工作。自动映射在Mybatis中也是默认开启的。
4>最后再映射属性。
[深入浅出了解mybatis]
Mybatis解读
1.Mybatis的运行可以分为两部分:读取配置文件(解析XML文件)缓存到Configuration对象里,用来创建SQLSessionFactory;第二部分就是sqlSession的执行过程。
2.代理模式:在原来的服务上增加一个占位,通过这个占位去控制访问。
3.动态代理一般分为两部分:JDK提供的反射机制(必须提供接口类来实现);CGLIB代理。
4.SQLSessionFactory是mybatis的核心类之一,用来创建SQLSession。
5.SQLSession的四大对象:Executor执行器,StatementHandler执行数据库的操作,是四大对象的核心,ParameterHandler对sql参数的处理,ResultHandler对结果集的封装返回。
6.Spring ioc是运用反射机制完成的。AOP则是根据动态代理实现,主要用处是事务的控制。
7.Spring的事务隔离(存在两个以上的事务会出现错误)和传播行为(方法之间的调用)。
8.SpringMVC:核心的DispatcherServlet,servlet根据拦截的配置,请求分发。增加@RequestBody能把结果集转换成Json数据,返回给视图层。
9.SqlSessionTemplate是mybatis的一个模板类,通过调用sqlSession来完成工作。
10.SpringAop分为申明式事务(xml文件里配置)和编程式事务。
11.mybatis的批量操作可以通过配置文件实现(settings增加配置属性:defaultExecutorType为BATCH)或者可以通过java代码实现(sqlSessionFactory.openSession(ExecutorType.BATCH)).
12.mybatis调用存储过程:
1》statementType=CALLABLE#申明调用存过。
2》参数定义:mode=IN(定义为输入参数)/OUT(定义为出参)。
13.分表查询:
例如公司账单,根据年份,那么查询sql可以写成:select * from t_bill_${year} where id=#{id}