Mybatis是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,简化了数据库的持久层操作。本文将详细介绍Mybatis的配置、核心概念、常用操作和高级特性。Mybatis持久层框架资料包括环境搭建、Mapper接口使用、动态SQL编写等内容,帮助开发者更好地理解和使用Mybatis。
Mybatis与JDBC相比,提供了更强大的映射能力和动态SQL支持,简化了数据库操作,同时减少了手动编写SQL语句和处理结果集的复杂性。Mybatis允许开发者通过XML配置文件或注解来配置数据库映射关系,并将接口和Java的POJO对象映射到数据库的表结构中,提供了一组强大的动态SQL工具来处理复杂的查询逻辑。
Mybatis概述Mybatis简介
Mybatis是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。Mybatis的设计目标是降低使用门槛,让开发者以最小的代价与最简洁的代码完成数据库的持久层操作。Mybatis可以通过XML配置文件或注解来配置数据库映射关系,它将接口和Java的POJO对象映射到数据库的表结构中,提供了一组强大的动态SQL工具来处理复杂的查询逻辑。
Mybatis的特点和优势
- 轻量级框架:Mybatis不需要复杂的配置,易于学习和使用。
- 灵活的SQL支持:支持自定义SQL,存储过程调用,灵活的动态SQL。
- 强大的映射能力:支持基本的Java数据类型和复杂对象的映射。
- 支持插件:Mybatis的插件机制可以方便地进行扩展,允许在运行时拦截Mybatis的任何一个调用。
- 与数据库无关:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server、DB2等。
Mybatis与JDBC的区别
Mybatis与JDBC之间存在诸多区别,具体如下:
特征 | JDBC | Mybatis |
---|---|---|
数据操作 | 需要手动编写SQL语句和处理结果集 | 自动映射SQL结果集到Java对象 |
SQL生成 | 手动编写SQL语句 | 使用XML或注解定义SQL语句 |
结果集处理 | 手动解析结果集,处理类型转换等 | 自动解析结果集,提供类型转换支持 |
代码复杂度 | 代码冗长,调试困难 | 代码简洁,易于维护和调试 |
性能优化 | 手动管理连接池、事务等 | 内置连接池、事务管理,性能优化更高 |
扩展性 | 通过编写更多Java代码来实现扩展 | 通过插件机制实现扩展,易于维护 |
Java开发环境准备
首先,需要确保JDK已经安装并配置好环境变量。可以通过以下命令检查JDK是否安装成功:
java -version
如果环境配置正确,将显示JDK的版本信息。
Mybatis依赖的引入
接下来,在Maven项目中引入Mybatis的依赖。编辑pom.xml
文件,添加以下依赖:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
</dependencies>
Mybatis配置文件的编写
Mybatis的配置文件mybatis-config.xml
需要包含数据库连接信息和Mybatis核心配置。创建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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
配置文件中的<mappers>
标签用于指定映射器文件的位置,这里假设UserMapper.xml
文件位于com/example/mapper
包中。
SqlSessionFactory和SqlSession
SqlSessionFactory是Mybatis中的工厂类,用于创建SqlSession对象。SqlSession是Mybatis的核心接口,提供了执行SQL语句、提交事务、获取数据库连接等操作。
创建SqlSessionFactory
的代码示例:
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = MybatisUtil.class.getClassLoader().getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
Mapper接口和Mapper XML文件
Mapper接口定义了与数据库交互的接口方法。Mapper XML文件中定义了SQL语句和与接口方法对应的映射关系。例如,定义一个UserMapper
接口:
import com.example.model.User;
import java.util.List;
public interface UserMapper {
List<User> getAllUsers();
User getUserById(int id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
对应的UserMapper.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM user
</select>
<select id="getUserById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
Mybatis的执行流程
- 创建
SqlSessionFactory
对象。 - 使用
SqlSessionFactory
创建SqlSession
对象。 - 通过
SqlSession
对象执行数据库操作。 - 使用
SqlSession
提交事务。 - 关闭
SqlSession
。
示例代码:
import org.apache.ibatis.session.SqlSession;
public class MainApp {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getAllUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
}
Mybatis常用操作
CRUD操作示例
CRUD操作包括Create(创建)、Read(读取)、Update(更新)和Delete(删除)。
创建用户
import com.example.model.User;
public static void createUser() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("John Doe");
user.setAge(30);
mapper.insertUser(user);
sqlSession.commit();
sqlSession.close();
}
读取用户
public static void readUser() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
更新用户
public static void updateUser() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setName("Jane Doe");
user.setAge(32);
mapper.updateUser(user);
sqlSession.commit();
sqlSession.close();
}
删除用户
public static void deleteUser() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(1);
sqlSession.commit();
sqlSession.close();
}
使用Mapper接口进行数据库操作
上面的示例已经展示了如何使用Mapper接口进行数据库操作。Mapper接口提供了一种简洁的方法来执行数据库操作,而不需要直接编写SQL语句。
动态SQL的使用
动态SQL可以根据条件自动生成SQL语句。例如,根据条件生成不同的SQL语句:
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
在Mapper接口中定义一个方法:
List<User> queryUser(User user);
对应的XML文件中定义动态SQL:
<select id="queryUser" resultType="com.example.model.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
示例代码:
public static void queryUser() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("John Doe");
List<User> users = mapper.queryUser(user);
for (User u : users) {
System.out.println(u);
}
sqlSession.close();
}
Mybatis的高级特性
结果集的映射与关联
Mybatis可以处理复杂的嵌套查询,例如一对多、多对一等关联关系。例如,假设有一个Post
表和一个Comment
表,每个Post
可以有多个Comment
。
定义Post
和Comment
类:
public class Post {
private int id;
private String title;
private List<Comment> comments;
}
public class Comment {
private int id;
private int postId;
private String content;
}
在PostMapper.xml
中配置关联查询:
<mapper namespace="com.example.mapper.PostMapper">
<resultMap id="postResultMap" type="com.example.model.Post">
<id property="id" column="post_id"/>
<result property="title" column="title"/>
<collection property="comments" javaType="ArrayList" ofType="com.example.model.Comment" select="getCommentsByPostId"/>
</resultMap>
<select id="getPostById" resultMap="postResultMap">
SELECT * FROM post WHERE id = #{id}
</select>
<select id="getCommentsByPostId" resultType="com.example.model.Comment">
SELECT * FROM comment WHERE post_id = #{postId}
</select>
</mapper>
示例代码:
public static void getPostWithComments() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
PostMapper mapper = sqlSession.getMapper(PostMapper.class);
Post post = mapper.getPostById(1);
System.out.println(post.getTitle());
for (Comment comment : post.getComments()) {
System.out.println(comment.getContent());
}
sqlSession.close();
}
参数和结果的类型转换
Mybatis支持自定义类型处理器,可以实现自定义的类型转换。例如,可以定义一个类型处理器来处理Date类型:
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
public class CustomDateTypeHandler implements TypeHandler<Date> {
@Override
public void setParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
ps.setTimestamp(i, new java.sql.Timestamp(parameter.getTime()));
}
@Override
public Date getResult(ResultSet rs, String columnName) throws SQLException {
return rs.getTimestamp(columnName);
}
@Override
public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getTimestamp(columnIndex);
}
@Override
public Date getResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getTimestamp(columnIndex);
}
}
在mybatis-config.xml
中配置类型处理器:
<typeHandlers>
<typeHandler handler="com.example.typehandler.CustomDateTypeHandler" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
</typeHandlers>
批量操作和缓存机制
批量操作
Mybatis支持批量插入操作,通过useGeneratedKeys
属性和useCache
属性可以提高批量操作的性能。
<insert id="insertUsers" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.model.User">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
示例代码:
public static void insertUsers() {
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25));
users.add(new User("Bob", 30));
for (User user : users) {
mapper.insertUser(user);
}
sqlSession.commit();
sqlSession.close();
}
缓存机制
Mybatis提供了一级缓存和二级缓存。
一级缓存:SqlSession级别的缓存,每个SqlSession都有一个缓存,当一个SqlSession执行一个SQL语句后,会将结果存入缓存,下次执行相同SQL语句时直接从缓存中获取结果。
二级缓存:全局缓存,可以配置多个SqlSession共享一个缓存。配置二级缓存需要在mapper配置文件中开启:
<cache/>
示例代码:
public static void enableSecondLevelCache() {
SqlSession sqlSession1 = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.getUserById(1);
System.out.println(user1.getName());
SqlSession sqlSession2 = MybatisUtil.getSqlSessionFactory().openSession();
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = mapper2.getUserById(1);
System.out.println(user2.getName());
sqlSession1.close();
sqlSession2.close();
}
Mybatis与Spring集成
Mybatis与Spring的整合步骤
- 引入依赖:在
pom.xml
文件中引入Mybatis和Spring的相关依赖。
<dependency>
<groupId>org.mybatis.spring</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
- 配置数据源:在Spring配置文件中配置数据源。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
- 创建SqlSessionFactory Bean:配置SqlSessionFactory Bean来生成SqlSession。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
- 配置Mapper扫描器:使用Mapper扫描器自动扫描Mapper接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
使用Spring管理Mybatis的SqlSessionFactory
在Spring配置文件中定义SqlSessionFactory Bean,并将其注入到需要使用的地方。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
Spring注解方式配置Mapper接口
可以使用@Mapper
注解来标记Mapper接口,让Spring自动扫描注册这些接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
在Mapper接口中使用@Mapper
注解:
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
List<User> getAllUsers();
User getUserById(int id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
示例代码:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMybatisApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper mapper = context.getBean(UserMapper.class);
List<User> users = mapper.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}
}
``
通过以上步骤,可以将Mybatis与Spring集成,利用Spring的依赖注入和事务管理功能,从而简化Mybatis的配置和使用。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章