Mybatis是一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,简化了数据库操作。本文将详细介绍Mybatis的安装与配置、核心概念、环境搭建以及CRUD操作等内容,帮助读者掌握Mybatis持久层框架学习。
Mybatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,使用简单的 XML 或注解进行配置和原始映射,并将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)进行映射,将数据库返回的记录转换成易于操作的 Java 对象。
Mybatis 的核心概念和术语如下:
Java 类示例:
package com.example.dao; public class User { private int id; private String name; private int age; // 构造器、getters 和 setters 方法 }
映射接口示例:
package com.example.mapper; public interface UserMapper { int insert(User user); int delete(int id); int update(User user); List<User> selectAll(); }
mybatis-config.xml
,该文件位于项目的 resources
目录下。mapper.xml
,该文件用于描述 SQL 语句的执行。一个典型的 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> <properties resource="db.properties"/> <typeAliases> <typeAlias type="com.example.dao.User" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/dao/UserMapper.xml"/> </mappers> </configuration>
数据库连接信息通常放在 db.properties
文件中,如下所示:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis username=root password=root
在 mybatis-config.xml
中引用该文件。
在开发工具中创建一个新的 Java 项目,例如使用 IntelliJ IDEA 或 Eclipse。需要安装 JDK,然后在开发工具中创建一个新的 Java 项目。
使用 Maven 管理项目依赖及构建,示例项目结构如下:
project-root |-- pom.xml |-- src |-- main |-- java |-- resources |-- db.properties |-- mybatis-config.xml |-- mapper |-- UserMapper.xml |-- test |-- java |-- com.example.test |-- UserMapperTest.java
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mybatis-demo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> </dependencies> </project>
mybatis-config.xml
放在 resources
目录下。创建数据库表:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Java 代码示例:
package com.example.dao; public class User { private int id; private String name; private int age; // 构造器、getters 和 setters 方法 } package com.example.mapper; import com.example.dao.User; public interface UserMapper { int insert(User user); }
Mapper 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"> <insert id="insert" parameterType="com.example.dao.User"> INSERT INTO user(name, age) VALUES (#{name}, #{age}) </insert> </mapper>
Java 代码示例:
package com.example.mapper; public interface UserMapper { int delete(int id); }
Mapper XML:
<delete id="delete" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete>
Java 代码示例:
package com.example.mapper; public interface UserMapper { int update(User user); }
Mapper XML:
<update id="update" parameterType="com.example.dao.User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update>
Java 代码示例:
package com.example.mapper; import java.util.List; public interface UserMapper { List<User> selectAll(); }
Mapper XML:
<select id="selectAll" resultType="com.example.dao.User"> SELECT * FROM user </select>
<insert>
:插入数据。<delete>
:删除数据。<update>
:更新数据。<select>
:查询数据。映射文件 UserMapper.xml
的结构如下:
<mapper namespace="com.example.mapper.UserMapper"> <insert id="insert" parameterType="com.example.dao.User"> INSERT INTO user(name, age) VALUES (#{name}, #{age}) </insert> <delete id="delete" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> <update id="update" parameterType="com.example.dao.User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <select id="selectAll" resultType="com.example.dao.User"> SELECT * FROM user </select> </mapper>
namespace
:映射文件对应的接口。id
:映射文件中的 SQL 语句的唯一标识符。parameterType
:SQL 语句中参数的数据类型。resultType
:结果集映射的 Java 类型。<insert>
:插入数据。<delete>
:删除数据。<update>
:更新数据。<select>
:查询数据。动态 SQL 是 Mybatis 的一个强大特性,它允许你根据条件动态生成 SQL 语句。
Java 代码示例:
package com.example.mapper; import java.util.List; public interface UserMapper { List<User> selectByCondition(User condition); }
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
Java 代码示例:
package com.example.mapper; import java.util.List; public interface UserMapper { List<User> selectByCondition(User condition); }
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
Java 代码示例:
package com.example.mapper; import java.util.List; public interface UserMapper { List<User> selectByCondition(User condition); }
Mapper XML:
<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User"> SELECT * FROM user <where> <choose> <when test="name != null"> AND name = #{name} </when> <when test="age != null"> AND age = #{age} </when> <otherwise> AND id = 1 </otherwise> </choose> </where> </select>
Java 代码示例:
package com.example.mapper; import java.util.List; import java.util.ArrayList; public interface UserMapper { List<User> selectByIds(ArrayList<Integer> ids); }
Mapper XML:
<select id="selectByIds" parameterType="java.util.List" resultType="com.example.dao.User"> SELECT * FROM user WHERE id IN <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
Mybatis 支持多种结果集的处理方式,例如:
Java 代码示例:
package com.example.mapper; import java.util.List; public interface UserMapper { List<User> selectUsers(); }
Mapper XML:
<select id="selectUsers" resultMap="UserResultMap"> SELECT id, name, age FROM user </select> <resultMap id="UserResultMap" type="com.example.dao.User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap>
可以使用 Mybatis 的 RowBounds
类进行简单的分页查询。
Java 代码示例:
package com.example.mapper; import java.util.List; import org.apache.ibatis.session.RowBounds; public interface UserMapper { List<User> selectByRowBounds(User condition, RowBounds rowBounds); }
Mapper XML:
<select id="selectByRowBounds" parameterType="java.lang.Integer" resultType="com.example.dao.User"> SELECT * FROM user <if test="offset != null and limit != null"> LIMIT #{offset}, #{limit} </if> </select>
Mybatis 支持事务管理,可以通过配置文件或编程方式来管理事务。
在 mybatis-config.xml
中配置事务管理器:
<transactionManager type="JDBC"/>
在 Java 代码中执行事务:
package com.example.test; import com.example.mapper.UserMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; public UserMapperTest() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public void testTransaction() { try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(new User(1, "Tom", 20)); mapper.insert(new User(2, "Jerry", 25)); // 提交事务 session.commit(); } catch (Exception e) { e.printStackTrace(); } } }
以上是 Mybatis 的基本概念和一些高级特性,通过这些内容,你可以更深入地了解和掌握 Mybatis 的使用。