您好,登录后才能下订单哦!
在现代软件开发中,数据持久化是一个至关重要的环节。数据持久化框架的选择直接影响到应用程序的性能、可维护性和扩展性。MyBatis优秀的半自动化ORM(对象关系映射)框架,因其灵活性和易用性而广受开发者欢迎。本文将详细介绍如何使用MyBatis进行数据持久化操作,涵盖从基础配置到高级特性的各个方面。
MyBatis是一个基于Java的持久化框架,它通过XML或注解的方式将Java对象与数据库中的记录进行映射。MyBatis的核心思想是将SQL语句与Java代码分离,使得开发者可以专注于SQL语句的编写,而不必关心底层的JDBC操作。
MyBatis的核心组件包括:
SqlSessionFactory
是MyBatis的核心接口之一,它负责创建SqlSession
对象。通常情况下,SqlSessionFactory
是通过SqlSessionFactoryBuilder
从XML配置文件或Java代码中构建的。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession
是MyBatis的核心接口之一,它提供了执行SQL语句、获取Mapper接口实例、管理事务等方法。SqlSession
的生命周期通常与一个数据库会话绑定,使用完毕后需要及时关闭。
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
}
Mapper
是MyBatis中用于定义SQL语句的接口或XML文件。通过Mapper
,开发者可以将SQL语句与Java方法进行映射,从而简化数据库操作。
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
}
Configuration
是MyBatis的全局配置类,它包含了MyBatis的所有配置信息,如数据源、事务管理器、映射文件等。Configuration
对象通常由SqlSessionFactoryBuilder
从XML配置文件或Java代码中构建。
<configuration>
<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"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
MyBatis的配置主要包括全局配置和映射配置两部分。全局配置用于配置MyBatis的核心组件,如数据源、事务管理器等;映射配置用于配置SQL语句与Java方法的映射关系。
MyBatis的全局配置通常通过XML文件进行配置,主要包括以下内容:
<configuration>
<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"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
MyBatis的映射配置可以通过XML文件或注解进行配置。XML文件通常用于配置复杂的SQL语句,而注解则用于配置简单的SQL语句。
XML映射配置文件通常包含以下内容:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
MyBatis支持通过注解配置SQL语句,常用的注解包括:
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);
}
MyBatis支持多种类型的SQL语句,包括查询、插入、更新和删除。通过MyBatis,开发者可以灵活地编写SQL语句,并将其与Java方法进行映射。
查询语句是MyBatis中最常用的SQL语句类型。MyBatis支持通过<select>
标签或@Select
注解定义查询语句。
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
插入语句用于向数据库中插入新记录。MyBatis支持通过<insert>
标签或@Insert
注解定义插入语句。
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);
更新语句用于更新数据库中的记录。MyBatis支持通过<update>
标签或@Update
注解定义更新语句。
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);
删除语句用于从数据库中删除记录。MyBatis支持通过<delete>
标签或@Delete
注解定义删除语句。
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);
MyBatis支持通过注解配置SQL语句,常用的注解包括@Select
、@Insert
、@Update
、@Delete
等。通过注解,开发者可以简化SQL语句的配置,提高代码的可读性。
@Select
注解用于定义查询语句。
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
@Insert
注解用于定义插入语句。
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);
@Update
注解用于定义更新语句。
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);
@Delete
注解用于定义删除语句。
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);
@Results
注解用于定义结果映射。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
@Param
注解用于指定参数名称。
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age);
MyBatis提供了强大的动态SQL功能,允许开发者根据条件动态生成SQL语句。动态SQL主要通过<if>
、<choose>
、<when>
、<otherwise>
、<trim>
、<where>
、<set>
、<foreach>
等标签实现。
<if>
标签用于根据条件判断是否包含某段SQL语句。
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
<choose>
标签用于实现多条件选择,类似于Java中的switch
语句。
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
<trim>
标签用于去除SQL语句中的多余字符,如AND
、OR
等。
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM users
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</trim>
</select>
<where>
标签用于生成WHERE
子句,并自动去除多余的AND
或OR
。
<select id="selectUserByCondition" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
<set>
标签用于生成SET
子句,并自动去除多余的逗号。
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
<foreach>
标签用于遍历集合,并生成相应的SQL语句。
<select id="selectUsersByIds" resultType="com.example.model.User">
SELECT * FROM users
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
MyBatis支持两种事务管理方式:JDBC和MANAGED。JDBC事务管理方式由MyBatis自身管理事务,而MANAGED事务管理方式则由外部容器(如Spring)管理事务。
JDBC事务管理方式由MyBatis自身管理事务,开发者可以通过SqlSession
的commit
和rollback
方法手动提交或回滚事务。
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("John");
user.setAge(25);
mapper.insertUser(user);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
}
MANAGED事务管理方式由外部容器(如Spring)管理事务,开发者无需手动提交或回滚事务。
<transactionManager type="MANAGED"/>
MyBatis提供了两级缓存机制:一级缓存和二级缓存。一级缓存是SqlSession
级别的缓存,二级缓存是Mapper
级别的缓存。
一级缓存是SqlSession
级别的缓存,默认开启。一级缓存的作用范围是同一个SqlSession
,当SqlSession
关闭时,一级缓存也会被清空。
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
User user2 = mapper.selectUserById(1);
System.out.println(user1 == user2); // true
}
二级缓存是Mapper
级别的缓存,默认关闭。二级缓存的作用范围是同一个Mapper
,当SqlSession
关闭时,二级缓存不会立即清空。
<cache/>
@CacheNamespace
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);
}
MyBatis支持插件机制,开发者可以通过插件扩展MyBatis的功能。MyBatis的插件通过实现Interceptor
接口来实现。
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("Before update");
Object result = invocation.proceed();
System.out.println("After update");
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
<plugins>
<plugin interceptor="com.example.plugin.MyPlugin"/>
</plugins>
MyBatis可以与多种框架集成,如Spring、Spring Boot等。通过集成,开发者可以简化MyBatis的配置和使用。
MyBatis与Spring的集成主要通过SqlSessionFactoryBean
和MapperScannerConfigurer
实现。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
MyBatis与Spring Boot的集成主要通过mybatis-spring-boot-starter
实现。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
”`java @Mapper public interface UserMapper { @Select(“SELECT * FROM users WHERE id
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。