Mybatis持久層框架學(xué)習(xí)入門(mén)
本文将详细介绍Mybatis持久层框架学习入门,包括Mybatis的基本概念、特点与优势,以及与JDBC的区别。文章还会指导如何搭建开发环境并进行基本的SQL映射和CRUD操作,并探讨Mybatis与Spring的集成方法。
Mybatis简介Mybatis是什么
Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs映射成数据库中的记录。
Mybatis的特点与优势
- 简单易用:Mybatis的配置简单,学习成本低,开发效率高。
- 与数据库无关:Mybatis可以支持多种数据库,如MySQL、Oracle、DB2等。
- 支持存储过程:Mybatis支持存储过程,并且可以传入参数和返回参数,操作灵活。
- 动态SQL:通过Mybatis的动态SQL,可以灵活地处理各种复杂的SQL语句。
- 插件扩展": Mybatis易于扩展,可以通过自定义插件来对框架进行扩展。
- 映射关系灵活:Mybatis可以提供复杂的数据类型映射,支持一对一、一对多、多对多关系映射。
- 高质量的文档:Mybatis拥有质量很高的文档,社区活跃,问题解答及时。
Mybatis与JDBC的区别
JDBC与Mybatis的主要区别如下:
-
JDBC:JDBC是一种Java语言级别的数据库访问接口,提供了一种标准的方式来访问数据库。它依赖于原始SQL语句的执行,并要求应用程序处理SQL语句的构造和数据库结果集的解析。JDBC代码通常包含了大量的低级数据库操作,如连接管理、异常处理和SQL字符串拼接。
- Mybatis:Mybatis是一个持久层框架,它简化了数据库操作,使得开发者可以专注于业务逻辑。Mybatis将SQL语句和Java对象映射起来,提供了动态查询、存储过程调用、高级映射等特性。它负责SQL语句的执行和结果集的映射,使开发者可以更专注于业务逻辑的实现。
// JDBC示例代码
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// Mybatis示例代码
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisExample {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MybatisConfig.xml"));
SqlSession session = factory.openSession();
try {
List<User> users = session.selectList("selectUsers");
for (User user : users) {
System.out.println(user.getName());
}
} finally {
session.close();
}
}
}
环境搭建
开发环境准备
开发Mybatis项目需要以下环境:
- JDK 1.8及以上
- Maven或Gradle构建工具
- MySQL数据库
Mybatis的下载与引入
Mybatis可以通过Maven或Gradle来引入,这里以Maven为例:
在项目的pom.xml
文件中添加Mybatis依赖:
<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.22</version>
</dependency>
</dependencies>
Mybatis的配置文件详解
Mybatis的核心配置文件是mybatis-config.xml
,该文件位于类路径下(通常是src/main/resources
目录下),配置文件中定义了数据库连接信息、映射文件位置、事务管理器等信息。
<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>
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisConfig {
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
}
基本使用
SQL映射文件
SQL映射文件定义了数据库操作的SQL语句,通常与Java接口或类对应,映射文件的根元素是<mapper>
元素。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsers" resultType="com.example.model.User">
SELECT id, name, age FROM users
</select>
</mapper>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession()) {
List<User> users = session.selectList("com.example.mapper.UserMapper.selectUsers");
for (User user : users) {
System.out.println(user.getName());
}
}
}
}
SQL映射元素及属性
Mybatis支持多种SQL映射元素,包括<select>
、<insert>
、<update>
、<delete>
等。
<!-- 查询 -->
<select id="selectUserById" resultType="com.example.model.User" parameterType="int">
SELECT id, name, age 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="deleteUserById" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class CRUDExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
session.insert("com.example.mapper.UserMapper.insertUser", new User("John Doe", 30));
session.update("com.example.mapper.UserMapper.updateUser", new User(1, "Jane Doe", 35));
session.delete("com.example.mapper.UserMapper.deleteUserById", 1);
session.selectList("com.example.mapper.UserMapper.selectUsers").forEach(user -> System.out.println(user.getName()));
}
}
}
动态SQL的使用
动态SQL允许在运行时根据条件生成SQL语句,常用的元素有<if>
、<choose>
、<when>
、<otherwise>
等。
<select id="selectUsersByCondition" resultType="com.example.model.User" parameterType="com.example.model.User">
SELECT id, name, age FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DynamicSqlExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
User user = new User("John Doe", 30);
List<User> users = session.selectList("com.example.mapper.UserMapper.selectUsersByCondition", user);
users.forEach(u -> System.out.println(u.getName()));
}
}
}
CRUD操作
增删改查操作详解
CRUD操作是数据库中最常见的操作,Mybatis提供了相应的SQL映射语句来支持这些操作。
<!-- 插入 -->
<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="deleteUserById" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
<!-- 查询 -->
<select id="selectUserById" resultType="com.example.model.User" parameterType="int">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class CRUDExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
session.insert("com.example.mapper.UserMapper.insertUser", new User("John Doe", 30));
session.update("com.example.mapper.UserMapper.updateUser", new User(1, "Jane Doe", 35));
session.delete("com.example.mapper.UserMapper.deleteUserById", 1);
session.selectList("com.example.mapper.UserMapper.selectUsers").forEach(user -> System.out.println(user.getName()));
}
}
}
结果集的映射与处理
Mybatis通过结果映射将数据库的查询结果映射到Java对象中。结果映射可以通过resultType
属性直接映射到Java类,或者通过resultMap
元素进行复杂的映射。
<!-- 直接映射 -->
<select id="selectUserById" resultType="com.example.model.User">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
<!-- 复杂映射 -->
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectUserById" resultMap="userResultMap">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class ResultSetMappingExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1);
System.out.println(user.getName());
}
}
}
批量操作
批量操作可以提高数据库性能,减少网络开销。Mybatis可以通过<foreach>
元素实现批量插入或更新操作。
<insert id="insertUsers" parameterType="java.util.List">
INSERT INTO users (name, age) VALUES
<foreach item="item" index="index" collection="list" separator="," open="(" close=")">
#{item.name}, #{item.age}
</foreach>
</insert>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class BatchOperationExample {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (SqlSession session = sqlSessionFactory.openSession(true)) {
List<User> users = Arrays.asList(new User("John Doe", 30), new User("Jane Doe", 35));
session.insert("com.example.mapper.UserMapper.insertUsers", users);
}
}
}
Mybatis与Spring集成
Spring与Mybatis集成方法
Spring与Mybatis的集成可以通过配置SqlSessionFactory
和SqlSessionTemplate
来实现,也可以使用MapperScannerConfigurer
自动扫描Mapper接口。
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.apache.ibatis.session.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg>
<ref bean="sqlSessionFactory"/>
</constructor-arg>
</bean>
<!-- 配置MapperScan -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.example.mapper"/>
</bean>
使用Spring管理Mybatis的SqlSessionFactory
通过Spring的SqlSessionFactoryBean
来创建SqlSessionFactory
,并将其注入到需要的地方。
<!-- 配置DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp2.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 id="sqlSessionFactory" class="org.apache.ibatis.session.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
Mybatis注解与XML配置对比
Mybatis提供了两种配置方式:Java注解和XML配置文件。注解方式更加简洁,但灵活性较低,而XML配置方式则更加灵活,适合复杂的情况。
// 注解方式
@Select("SELECT id, name, age FROM users WHERE id = #{id}")
User selectUserById(@Param("id") int id);
<!-- XML配置方式 -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
</mapper>
事务管理与异常处理
Mybatis的事务管理机制
Mybatis通过SqlSession
对象来管理事务,可以使用SqlSession
的commit
和rollback
方法来提交或回滚事务。
SqlSession session = sqlSessionFactory.openSession();
try {
// 执行数据库操作
session.commit();
} catch (Exception e) {
session.rollback();
} finally {
session.close();
}
异常处理与回滚操作
在Mybatis中,可以通过捕获异常并调用rollback
方法来处理事务的回滚操作。在配置文件中也可以设置全局的事务策略。
try {
// 执行数据库操作
} catch (Exception e) {
session.rollback();
throw e;
} finally {
session.close();
}
事务的传播行为与隔离级别
Mybatis支持多种事务传播行为,包括PROPAGATION_REQUIRED
、PROPAGATION_SUPPORTS
、PROPAGATION_MANDATORY
等。隔离级别有ISOLATION_DEFAULT
、ISOLATION_READ_UNCOMMITTED
、ISOLATION_READ_COMMITTED
等。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
Mybatis提供了丰富的功能来提高数据库操作的效率和灵活性,通过本文的介绍,读者可以了解到Mybatis的基本使用方法以及在实际开发中的应用场景。
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)