本文详细介绍了MyBatis入门所需的基本知识,包括MyBatis简介、优势、应用场景以及环境搭建。文中还涵盖了MyBatis的核心概念、基本CRUD操作、动态SQL以及结果集处理等内容,帮助读者快速上手MyBatis入门。
MyBatis入门:简单教程详解 MyBatis简介MyBatis是什么
MyBatis是一款优秀的持久层框架,它支持定制化SQL查询,存储过程调用,以及对象关系映射。MyBatis简化了数据访问层的开发,使得开发者能够通过简单的配置文件来管理数据库交互。
MyBatis的优势和应用场景
MyBatis的优势包括:
- 灵活的SQL映射:与Hibernate等ORM框架相比,MyBatis提供了更灵活的SQL映射机制,允许开发者直接编写原生SQL语句,以达到更高的执行效率。
- 轻量级:MyBatis没有复杂的框架层次结构,使得其学习成本和使用成本都很低。
- 低侵入性:MyBatis不强制要求使用特定的编程模型,可以与现有的应用程序无缝集成。
- 与数据库无关:虽然MyBatis提供了大量的数据库支持,但其核心逻辑与特定的数据库无关,使得迁移数据库时更灵活。
应用场景包括:
- 中小型项目:对于中小型项目,MyBatis可以提供足够的灵活性和性能。
- 需要复杂SQL的应用:对于需要复杂SQL的应用,MyBatis提供了强大的SQL映射能力。
- 性能敏感的应用:对于性能敏感的应用,MyBatis提供了直接操作SQL的能力,可以避免ORM带来的性能损耗。
以下是MyBatis的基本配置示例:
<!-- mybatis-config.xml 示例 -->
<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/mybatis_test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
环境搭建
开发环境准备
为了使用MyBatis,你需要准备以下开发环境:
- JDK 8或更高版本
- IDE(如IntelliJ IDEA或Eclipse)
- MySQL数据库
- Maven构建工具
安装JDK
确保你已经安装了JDK,可以通过以下命令检查JDK版本:
java -version
安装Maven
确保你已经安装了Maven,并可以通过以下命令检查Maven版本:
mvn -version
安装MySQL
安装MySQL数据库,并运行以下命令来创建数据库:
CREATE DATABASE mybatis_test;
Maven项目配置
创建一个新的Maven项目,并在pom.xml
文件中添加MyBatis相关的依赖:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
在src/main/resources
目录下添加一个mybatis-config.xml
文件,并配置数据库连接信息:
<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/mybatis_test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
</configuration>
核心概念
SqlSessionFactory和SqlSession
SqlSessionFactory
接口用于创建SqlSession
实例,而SqlSession
负责执行SQL语句、提交事务等操作。
创建SqlSessionFactory
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession openSession() {
return sqlSessionFactory.openSession();
}
}
使用SqlSession执行SQL
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
// 执行SQL
List<User> users = session.selectList("com.example.mapper.UserMapper.selectAll");
for (User user : users) {
System.out.println(user);
}
} finally {
session.close();
}
}
Mapper接口和Mapper XML配置
Mapper接口用于定义数据库操作方法,而Mapper XML文件则负责实现这些方法中的具体SQL语句。
创建Mapper接口
public interface UserMapper {
List<User> selectAll();
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAll" resultType="com.example.model.User">
SELECT * FROM users
</select>
</mapper>
将Mapper XML文件添加到mybatis-config.xml
中:
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
基本CRUD操作
插入数据
创建Mapper接口
public interface UserMapper {
int insert(User user);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insert" parameterType="com.example.model.User" keyProperty="id" useGeneratedKeys="true">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
</mapper>
测试插入操作
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
int rows = session.insert("com.example.mapper.UserMapper.insert", user);
System.out.println("Rows inserted: " + rows);
} finally {
session.close();
}
}
查询数据
创建Mapper接口
public interface UserMapper {
User selectById(int id);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectById" resultType="com.example.model.User" parameterType="int">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
测试查询操作
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = session.selectOne("com.example.mapper.UserMapper.selectById", 1);
System.out.println(user);
} finally {
session.close();
}
}
更新数据
创建Mapper接口
public interface UserMapper {
int update(User user);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<update id="update" parameterType="com.example.model.User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
</mapper>
测试更新操作
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = new User();
user.setId(1);
user.setName("Jane Doe");
user.setEmail("jane.doe@example.com");
int rows = session.update("com.example.mapper.UserMapper.update", user);
System.out.println("Rows updated: " + rows);
} finally {
session.close();
}
}
删除数据
创建Mapper接口
public interface UserMapper {
int delete(int id);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
测试删除操作
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
int rows = session.delete("com.example.mapper.UserMapper.delete", 1);
System.out.println("Rows deleted: " + rows);
} finally {
session.close();
}
}
动态SQL
if标签
if
标签用于根据条件判断是否执行某个SQL片段。
创建Mapper接口
public interface UserMapper {
List<User> selectByCondition(User user);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectByCondition" resultType="com.example.model.User" parameterType="com.example.model.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
</mapper>
测试if标签
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = new User();
user.setName("John Doe");
List<User> users = session.selectList("com.example.mapper.UserMapper.selectByCondition", user);
for (User u : users) {
System.out.println(u);
}
} finally {
session.close();
}
}
choose标签
choose
标签类似Java中的switch
语句,允许选择执行多个条件之一。
创建Mapper接口
public interface UserMapper {
List<User> selectByPriority(User user);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectByPriority" resultType="com.example.model.User" parameterType="com.example.model.User">
SELECT * FROM users
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="name != null">
AND name = #{name}
</when>
<otherwise>
AND email = #{email}
</otherwise>
</choose>
</where>
</select>
</mapper>
测试choose标签
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = new User();
user.setName("John Doe");
List<User> users = session.selectList("com.example.mapper.UserMapper.selectByPriority", user);
for (User u : users) {
System.out.println(u);
}
} finally {
session.close();
}
}
foreach标签
foreach
标签用于遍历集合或数组。
创建Mapper接口
public interface UserMapper {
List<User> selectByIds(String[] ids);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectByIds" resultType="com.example.model.User" parameterType="string[]">
SELECT * FROM users
WHERE id IN
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
测试foreach标签
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
String[] ids = {"1", "2", "3"};
List<User> users = session.selectList("com.example.mapper.UserMapper.selectByIds", ids);
for (User u : users) {
System.out.println(u);
}
} finally {
session.close();
}
}
结果集处理
单一结果映射
单一结果映射通常用于映射单个字段或单个实体。
创建Mapper接口
public interface UserMapper {
User selectById(int id);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectById" resultType="com.example.model.User" parameterType="int">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
复杂结果映射(嵌套查询)
复杂结果映射用于处理嵌套查询,如一对多关联关系。
创建Mapper接口
public interface UserMapper {
User selectUserWithPosts(int userId);
}
创建Mapper XML配置文件
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserWithPosts" resultType="com.example.model.User" parameterType="int">
SELECT u.id, u.name, u.email, p.id as postId, p.title, p.content
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.id = #{userId}
</select>
</mapper>
创建User实体
public class User {
private int id;
private String name;
private String email;
private List<Post> posts;
// getters and setters
}
public class Post {
private int id;
private String title;
private String content;
// getters and setters
}
测试复杂结果映射
public static void main(String[] args) {
SqlSession session = MyBatisUtil.openSession();
try {
User user = session.selectOne("com.example.mapper.UserMapper.selectUserWithPosts", 1);
System.out.println(user);
for (Post post : user.getPosts()) {
System.out.println(post);
}
} finally {
session.close();
}
}
通过以上示例,你可以看到MyBatis在处理基本CRUD操作、动态SQL以及复杂结果映射时的灵活性和强大能力。希望这篇教程能帮助你更好地理解和使用MyBatis。