本文详细介绍了Mybatis的入门教程,从Mybatis的基本概念和环境搭建开始,涵盖了核心概念、动态SQL、与Spring的集成以及项目实战等内容,帮助读者全面了解并掌握Mybatis的使用方法。
Mybatis入门教程:从基础到简单项目实战 Mybatis简介与环境搭建Mybatis是什么
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 可以通过简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 代理成 JDBC 代码。它是一个半自动化的 ORM(对象关系映射)框架,可以根据 XML 文件生成 SQL 语句,同时具备一定的动态 SQL 能力。
Mybatis的优势与适用场景
MyBatis 的主要优势如下:
- 灵活性:MyBatis 的 SQL 语句是直接书写在 XML 文件中,易于理解和维护。
- 易于扩展:通过扩展插件,可以方便地扩展功能。
- 性能好:基于 JDBC 的直接操作,没有过多的中间层,性能较高。
适用场景:
- 项目规模适中,对 SQL 语句的定制化要求较高。
- 需要频繁进行复杂的 SQL 操作,特别是涉及大量 JOIN 操作的情况。
- 需要对 SQL 语句进行动态生成和优化。
开发环境搭建(IDE、JDK、Mybatis安装等)
为了开始 MyBatis 的学习,我们需要准备好以下开发环境:
- IDE:推荐使用 IntelliJ IDEA 或 Eclipse。
- JDK:需要安装 Java 开发工具包 JDK,目前最新版本为 JDK 11。
- MyBatis:安装 MyBatis 可以通过 Maven 依赖管理来引入。
- 数据库:例如 MySQL 或 Oracle。
环境搭建步骤
-
安装 JDK:
- 下载最新版本的 JDK 从 Oracle 官网。
- 安装 JDK,设置
JAVA_HOME
环境变量,并将 JDK 的bin
目录添加到系统PATH
环境变量中。
-
安装数据库:
- 下载并安装 MySQL 数据库。
- 启动 MySQL 并创建一个用于测试的数据库。
-
配置 Maven 项目:
- 创建一个新的 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.26</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> </dependencies>
- 数据库连接配置:
- 在
resources
目录下创建mybatis-config.xml
文件,配置数据库连接信息以及 MyBatis 核心配置。<?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/mybatis"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
- 在
通过以上步骤,开发环境已经搭建完成,可以开始学习 MyBatis 的核心概念和使用方法。
Mybatis核心概念解析SqlSession和SqlSessionFactory
SqlSession 是 MyBatis 的核心接口,它负责执行 SQL 语句,并返回结果。SqlSessionFactory 是创建 SqlSession 的工厂,它通过 SqlSessionFactoryBuilder 创建。SqlSessionFactoryBuilder 通过解析 MyBatis 配置文件,生成 SqlSessionFactory。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper接口
Mapper 接口是 MyBatis 中用于映射数据库表和 Java 对象的接口。接口中的方法对应特定的 SQL 语句。例如:
public interface UserMapper {
List<User> selectAll();
User selectById(int id);
int insert(User user);
int update(User user);
int delete(int id);
}
配置文件详解
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"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
{}与${}的区别与使用场景
在 SQL 语句中,#{}
和 ${}
有不同的作用:
#{}
用于编写预处理语句,防止 SQL 注入。${}
直接拼接字符串,可能导致 SQL 注入。
public interface UserMapper {
User selectById(int id);
int insert(User user);
}
// UserMapper.xml
<select id="selectById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.example.User">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
结果集映射
结果集映射通过 <resultMap>
标签定义,将 SQL 语句查询的结果映射到 Java 对象。
<resultMap id="UserResult" type="com.example.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectAll" resultMap="UserResult">
SELECT id, name, age FROM user
</select>
Mybatis动态SQL与条件查询
动态SQL标签(if,choose, when, otherwise等)
MyBatis 提供了多种动态 SQL 标签,如 <if>
, <choose>
, <when>
, <otherwise>
等,可以根据条件生成不同的 SQL 语句。
<select id="selectByCondition" resultType="com.example.User">
SELECT id, name, age FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
使用动态SQL实现条件查询
通过动态 SQL 标签实现条件查询,可以灵活地生成 SQL 语句。
public interface UserMapper {
List<User> selectByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age);
}
<select id="selectByCondition" resultType="com.example.User">
SELECT id, name, age FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
Mybatis与数据库交互
CRUD操作实现(增删改查)
MyBatis 支持基本的 CRUD 操作,通过 SQL 语句实现。
public interface UserMapper {
int insert(User user);
int update(User user);
int delete(int id);
User selectById(int id);
List<User> selectAll();
}
<insert id="insert" parameterType="com.example.User">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
<update id="update" parameterType="com.example.User">
UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM user WHERE id=#{id}
</delete>
<select id="selectById" resultType="com.example.User">
SELECT * FROM user WHERE id=#{id}
</select>
<select id="selectAll" resultType="com.example.User">
SELECT * FROM user
</select>
批量操作:批量插入和批量删除
MyBatis 支持批量操作,如批量插入和批量删除。
public interface UserMapper {
int batchInsert(List<User> users);
int batchDelete(List<Integer> ids);
}
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (id, name, age) VALUES
<foreach item="item" index="index" collection="users" separator=",">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
<delete id="batchDelete" parameterType="java.util.List">
DELETE FROM user WHERE id IN
<foreach item="item" index="index" collection="ids" separator=",">
#{item}
</foreach>
</delete>
批量查询:分页查询
MyBatis 支持分页查询,通过 SQL 语句实现。
public interface UserMapper {
List<User> selectByPage(int offset, int limit);
}
<select id="selectByPage" resultType="com.example.User">
SELECT * FROM user
LIMIT #{offset}, #{limit}
</select>
Mybatis与Spring集成
Mybatis与Spring集成的意义
MyBatis 与 Spring 集成可以实现事务管理,简化数据库操作。Spring 可以管理 MyBatis 的 SqlSessionFactory 和 SqlSession,提供依赖注入功能。
Mybatis与Spring集成的基本步骤
-
添加依赖:
在pom.xml
中添加 Spring 和 MyBatis 依赖。<dependencies> <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> <dependency> <groupId>org.mybatis.spring</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> </dependencies>
-
配置数据源和 SqlSessionFactory:
在 Spring 配置文件中配置数据源和 SqlSessionFactory。<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
-
配置 Mapper 扫描:
通过<mybatis:scan>
标签自动扫描 Mapper 接口。<mybatis:scan base-package="com.example.mapper"/>
-
使用 Mapper 接口:
在 Spring 配置文件中注入 Mapper 接口。<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.example.mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
-
使用事务管理:
配置事务管理器并启用事务管理。<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
Mybatis与Spring事务管理
通过注解 @Transactional
可以实现 Spring 事务管理。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void addUser(User user) {
userMapper.insert(user);
}
}
Mybatis项目实战
项目需求与设计
假设我们正在开发一个简单的用户管理系统,需实现以下功能:
- 用户信息的增删改查。
- 用户信息的批量操作。
- 用户信息的分页查询。
- 用户信息的条件查询。
数据库表设计与实体类定义
创建一个包含用户信息的表 user
,包含字段 id
, name
, age
。
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
创建 User
实体类,用于映射数据库表中的数据。
public class User {
private int id;
private String name;
private int age;
// Getter and Setter methods
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
项目实现步骤
-
创建数据库表:
创建一个包含用户信息的表user
,包含字段id
,name
,age
。CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50), age INT );
-
创建实体类:
创建User
实体类,用于映射数据库表中的数据。public class User { private int id; private String name; private int age; // Getter and Setter methods public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
创建 Mapper 接口:
创建UserMapper
接口,定义数据库操作方法。public interface UserMapper { int insert(User user); int update(User user); int delete(int id); User selectById(int id); List<User> selectAll(); int batchInsert(List<User> users); int batchDelete(List<Integer> ids); List<User> selectByPage(int offset, int limit); List<User> selectByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age); }
-
创建 Mapper XML 文件:
创建UserMapper.xml
文件,编写 SQL 语句实现 Mapper 接口中的方法。<mapper namespace="com.example.mapper.UserMapper"> <insert id="insert" parameterType="com.example.User"> INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> <update id="update" parameterType="com.example.User"> UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id} </update> <delete id="delete" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> <select id="selectById" resultType="com.example.User"> SELECT * FROM user WHERE id=#{id} </select> <select id="selectAll" resultType="com.example.User"> SELECT * FROM user </select> <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (id, name, age) VALUES <foreach item="item" index="index" collection="users" separator=","> (#{item.id}, #{item.name}, #{item.age}) </foreach> </insert> <delete id="batchDelete" parameterType="java.util.List"> DELETE FROM user WHERE id IN <foreach item="item" index="index" collection="ids" separator=","> #{item} </foreach> </delete> <select id="selectByPage" resultType="com.example.User"> SELECT * FROM user LIMIT #{offset}, #{limit} </select> <select id="selectByCondition" resultType="com.example.User"> SELECT * FROM user <where> <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select> </mapper>
-
编写 Service 层代码:
创建UserService
类,实现用户信息的增删改查操作,并使用 Spring 注解管理事务。@Service public class UserService { @Autowired private UserMapper userMapper; @Transactional public void addUser(User user) { userMapper.insert(user); } @Transactional public void updateUser(User user) { userMapper.update(user); } @Transactional public void deleteUser(int id) { userMapper.delete(id); } public User getUserById(int id) { return userMapper.selectById(id); } public List<User> getAllUsers() { return userMapper.selectAll(); } @Transactional public void batchAddUsers(List<User> users) { userMapper.batchInsert(users); } @Transactional public void batchDeleteUsers(List<Integer> ids) { userMapper.batchDelete(ids); } public List<User> getUsersByPage(int offset, int limit) { return userMapper.selectByPage(offset, limit); } public List<User> getUsersByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age) { return userMapper.selectByCondition(id, name, age); } }
-
编写 Controller 层代码:
创建UserController
类,提供 RESTful API 接口,处理用户请求。@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @PostMapping public void addUser(@RequestBody User user) { userService.addUser(user); } @PutMapping public void updateUser(@RequestBody User user) { userService.updateUser(user); } @DeleteMapping("/{id}") public void deleteUser(@PathVariable int id) { userService.deleteUser(id); } @GetMapping("/{id}") public User getUserById(@PathVariable int id) { return userService.getUserById(id); } @GetMapping public List<User> getAllUsers() { return userService.getAllUsers(); } @PostMapping("/batch") public void batchAddUsers(@RequestBody List<User> users) { userService.batchAddUsers(users); } @DeleteMapping("/batch") public void batchDeleteUsers(@RequestBody List<Integer> ids) { userService.batchDeleteUsers(ids); } @GetMapping("/page") public List<User> getUsersByPage(@RequestParam int offset, @RequestParam int limit) { return userService.getUsersByPage(offset, limit); } @GetMapping("/condition") public List<User> getUsersByCondition(@RequestParam(required = false) Integer id, @RequestParam(required = false) String name, @RequestParam(required = false) Integer age) { return userService.getUsersByCondition(id, name, age); } }
项目调试与常见问题解决
常见问题及解决方法
-
SQL 注入问题:
- 使用
#{}
代替${}
,防止 SQL 注入。 - 配置拦截器或过滤器,对输入参数进行校验。
- 使用
-
Mapper 接口未找到:
- 确保 Mapper XML 文件和 Mapper 接口在同一包下。
- 检查配置文件中
<mybatis:scan>
标签是否正确配置。
-
数据库连接问题:
- 确保数据库已启动且连接信息正确。
- 使用数据库连接池(如
BasicDataSource
)。
- 事务管理问题:
- 确保事务管理器配置正确,
@Transactional
注解使用正确。 - 检查 Spring 配置文件中事务管理器是否正确配置。
- 确保事务管理器配置正确,
通过以上步骤,我们可以完成一个简单的 MyBatis 用户管理系统。在实际开发过程中,还需要根据具体需求进行进一步的扩展和优化。
共同学习,写下你的评论
评论加载中...
作者其他优质文章