Java Mybatis框架由浅入深全解析中篇
本文将从Mybatis框架的基本配置、映射器、插件、缓存、批处理等方面进行全面介绍,以帮助读者更好地理解和使用Mybatis框架。
基本配置
Mybatis框架的基本配置包括数据库信息、连接池、日志等。这些配置都可以在mybatis-config.xml中进行设置。下面是一个基本的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="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/PersonMapper.xml"/>
</mappers>
</configuration>
在上面的配置文件中,settings
指定了日志的输出方式,默认为STDOUT_LOGGING
,即控制台输出。environments
指定了使用的数据库连接信息,可以定义多个environment
标签,可以用default
指定使用哪个environment
。dataSource
标签中的type
属性指定了连接池的实现,这里使用的是POOLED
类型的连接池。具体的dataSource
的属性可以根据具体的实现而不同。mappers
指定了映射文件的位置,可以指定多个映射文件。
映射器
映射器是Mybatis框架中最重要的组件之一。它是将Java对象和数据库表进行映射的工具。Mybatis框架中的映射器有两种实现方式,一种是基于XML配置文件的映射器,另一种是基于注解的映射器。
基于XML配置文件的映射器
基于XML配置文件的映射器需要在mybatis-config.xml中的mappers
标签中进行配置。下面是一个示例的映射器配置文件:
<!-- PersonMapper.xml -->
<mapper namespace="com.example.mapper.PersonMapper">
<resultMap id="personResultMap" type="com.example.Person">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="gender" column="gender"/>
</resultMap>
<select id="getPersonById" resultMap="personResultMap">
SELECT * FROM person WHERE id = #{id}
</select>
<insert id="insertPerson" parameterType="com.example.Person">
INSERT INTO person(name, age, gender) VALUES(#{name}, #{age}, #{gender})
</insert>
<delete id="deletePersonById" parameterType="int">
DELETE FROM person WHERE id = #{id}
</delete>
</mapper>
在上面的示例中,namespace
指定了映射器的接口类名。resultMap
标签定义了结果集映射规则,即数据库中的列对应对象中的属性。select
、insert
、delete
等标签都对应着相应的SQL操作,id
属性指定了对应的方法名,resultMap
和parameterType
分别指定了返回的结果集的映射规则和参数类型。
基于注解的映射器
基于注解的映射器是在接口方法上添加注解来描述映射规则。下面是一个示例:
// PersonMapper.java
public interface PersonMapper {
@Select("SELECT * FROM person WHERE id = #{id}")
@ResultMap("personResultMap")
Person getPersonById(@Param("id")Integer id);
@Insert("INSERT INTO person(name, age, gender) VALUES(#{name}, #{age}, #{gender})")
int insertPerson(Person person);
@Delete("DELETE FROM person WHERE id = #{id}")
int deletePersonById(Integer id);
@SelectProvider(type = PersonSqlProvider.class, method = "getPersonSql")
@ResultMap("personResultMap")
List<Person> getPersonBySql(@Param("name")String name, @Param("age")Integer age);
}
在上面的示例中,@Select
、@Insert
、@Delete
注解分别对应着相应的SQL操作。@ResultMap
注解指定了结果集映射规则。这里还演示了使用注解动态生成SQL语句的方式,使用@SelectProvider
注解指定动态生成SQL语句的类和方法。
插件
插件是Mybatis框架中常用的扩展机制,它可以在执行SQL语句的过程中修改、增强或拦截这个过程。下面是一个示例的插件:
public class ExamplePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// ...
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
if (target instanceof Executor) {
return Plugin.wrap(target, this);
}
return target;
}
@Override
public void setProperties(Properties properties) {
// ...
}
}
在上面的示例中,Interceptor
接口是插件的基本接口,它有三个方法:intercept
、plugin
、setProperties
。在intercept
方法中可以进行对SQL语句的修改、增强或拦截。plugin
方法可以返回一个代理对象,可以拦截Executor
对象的操作。setProperties
方法用于设置插件的属性。
缓存
Mybatis框架中的缓存是在执行SQL语句的时候,将查询的结果放到内存或别的缓存中,当下次查询同样的SQL语句时,可以不用再去查询数据库,而是直接从缓存中获取结果。Mybatis框架中的缓存分为一级缓存和二级缓存。
一级缓存
一级缓存是SqlSession级别的缓存,在SqlSession中进行数据查询时,数据会被缓存在SqlSession的内部HashMap中。一级缓存默认开启。
二级缓存
二级缓存是mapper级别的缓存,在多个SqlSession之间共享。二级缓存需要在mapper中进行配置。下面是一个示例的二级缓存配置:
<!-- PersonMapper.xml -->
<mapper namespace="com.example.mapper.PersonMapper">
<cache eviction="FIFO" size="1024" flushInterval="3600000" />
<!-- ... -->
</mapper>
在上面的配置中,cache
标签指定了缓存的基本属性:eviction
属性指定了缓存的淘汰算法、size
属性指定了缓存的大小、flushInterval
属性指定了缓存的刷新间隔。
批处理
Mybatis框架中的批处理可以将多个SQL操作合并为一个批处理操作,提高执行效率。下面是一个批处理的示例:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
for (Person person : personList) {
mapper.insertPerson(person);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
在上面的示例中,使用ExecutorType.BATCH
指定使用批处理模式执行SQL操作。在循环中,将多个insert
操作合并为一个批处理,最后通过commit
方法一次性提交所有SQL操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Mybatis框架由浅入深全解析中篇 - Python技术站