引言
MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
本文将带您从入门到进阶,深入解析 MyBatis 的使用,并通过实战案例来展示如何高效应用 MyBatis。
一、MyBatis 入门
1.1 MyBatis 简介
MyBatis 遵循约定优于配置的原则,通过 XML 或注解的方式配置 SQL 映射,将 SQL 与 Java 代码分离,使得代码更加简洁。
1.2 环境搭建
- 添加依赖:在项目的
pom.xml文件中添加 MyBatis 的依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
- 配置数据源:在
application.properties或application.yml文件中配置数据库连接信息。
# application.properties
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=root
- 编写 Mapper 接口:定义一个接口,用于操作数据库。
public interface UserMapper {
User getUserById(int id);
}
- 编写 Mapper XML:定义 SQL 映射文件,将 SQL 与 Java 代码关联。
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
- 配置 MyBatis:在
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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 使用 MyBatis:在 Java 代码中,通过
SqlSessionFactory和SqlSession来操作数据库。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
}
二、MyBatis 进阶
2.1 动态 SQL
MyBatis 支持动态 SQL,可以灵活地编写 SQL 语句。
<if>标签:根据条件判断是否执行 SQL 语句。
<select id="getUserByCondition" resultType="com.example.entity.User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
<choose>标签:类似于 Java 中的switch语句。
<select id="getUserByCondition" resultType="com.example.entity.User">
SELECT * FROM user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="name != null">
name = #{name}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
<foreach>标签:遍历集合,执行 SQL 语句。
<update id="updateUserByIds" parameterType="java.util.List">
UPDATE user
SET status = 1
WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</update>
2.2 插入、更新、删除
MyBatis 支持插入、更新、删除操作。
- 插入操作:
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
- 更新操作:
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user
SET name = #{name}, age = #{age}
WHERE id = #{id}
</update>
- 删除操作:
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
2.3 关联查询
MyBatis 支持关联查询,可以方便地查询关联表的数据。
- 一对一关联:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.entity.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="address" javaType="com.example.entity.Address">
<id property="id" column="address_id"/>
<result property="province" column="province"/>
<result property="city" column="city"/>
</association>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT u.id, u.name, u.age, a.id as address_id, a.province, a.city
FROM user u
LEFT JOIN address a ON u.address_id = a.id
WHERE u.id = #{id}
</select>
</mapper>
- 一对多关联:
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.entity.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orders" ofType="com.example.entity.Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="price" column="price"/>
</collection>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT u.id, u.name, u.age, o.id as order_id, o.order_no, o.price
FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>
三、实战案例详解
3.1 用户管理系统
本案例将使用 MyBatis 实现一个简单的用户管理系统,包括用户注册、登录、查询、修改和删除等功能。
- 数据库设计:创建用户表和订单表。
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
address_id INT,
status INT
);
CREATE TABLE address (
id INT PRIMARY KEY AUTO_INCREMENT,
province VARCHAR(50),
city VARCHAR(50)
);
CREATE TABLE order (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
order_no VARCHAR(50),
price DECIMAL(10, 2)
);
- 实体类:定义用户、地址和订单的实体类。
public class User {
private int id;
private String name;
private int age;
private Address address;
// ... getter 和 setter
}
public class Address {
private int id;
private String province;
private String city;
// ... getter 和 setter
}
public class Order {
private int id;
private int userId;
private String orderNo;
private BigDecimal price;
// ... getter 和 setter
}
- Mapper 接口:定义用户、地址和订单的 Mapper 接口。
public interface UserMapper {
User getUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
List<User> getUsersByCondition(User user);
}
public interface AddressMapper {
Address getAddressById(int id);
void insertAddress(Address address);
void updateAddress(Address address);
void deleteAddress(int id);
}
public interface OrderMapper {
Order getOrderById(int id);
void insertOrder(Order order);
void updateOrder(Order order);
void deleteOrder(int id);
}
- Mapper XML:定义用户、地址和订单的 Mapper XML。
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<!-- ... -->
</mapper>
<!-- AddressMapper.xml -->
<mapper namespace="com.example.mapper.AddressMapper">
<!-- ... -->
</mapper>
<!-- OrderMapper.xml -->
<mapper namespace="com.example.mapper.OrderMapper">
<!-- ... -->
</mapper>
- Service 层:定义用户、地址和订单的 Service 层。
public class UserService {
private UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(int id) {
return userMapper.getUserById(id);
}
public void insertUser(User user) {
userMapper.insertUser(user);
}
public void updateUser(User user) {
userMapper.updateUser(user);
}
public void deleteUser(int id) {
userMapper.deleteUser(id);
}
public List<User> getUsersByCondition(User user) {
return userMapper.getUsersByCondition(user);
}
}
public class AddressService {
private AddressMapper addressMapper;
public AddressService(AddressMapper addressMapper) {
this.addressMapper = addressMapper;
}
// ... 地址相关的操作
}
public class OrderService {
private OrderMapper orderMapper;
public OrderService(OrderMapper orderMapper) {
this.orderMapper = orderMapper;
}
// ... 订单相关的操作
}
- Controller 层:定义用户、地址和订单的 Controller 层。
@RestController
@RequestMapping("/user")
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id) {
return userService.getUserById(id);
}
@PostMapping
public void insertUser(@RequestBody User user) {
userService.insertUser(user);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable int id, @RequestBody User user) {
user.setId(id);
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable int id) {
userService.deleteUser(id);
}
@GetMapping
public List<User> getUsersByCondition(User user) {
return userService.getUsersByCondition(user);
}
}
@RestController
@RequestMapping("/address")
public class AddressController {
private AddressService addressService;
public AddressController(AddressService addressService) {
this.addressService = addressService;
}
// ... 地址相关的操作
}
@RestController
@RequestMapping("/order")
public class OrderController {
private OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
// ... 订单相关的操作
}
通过以上步骤,您就可以完成一个简单的用户管理系统。在实际开发中,您可以根据需求进一步完善系统功能,例如添加权限控制、日志记录等。
四、总结
本文详细介绍了 MyBatis 的入门、进阶和实战案例,希望对您有所帮助。MyBatis 是一个功能强大的持久层框架,能够帮助您快速开发高效的数据库应用程序。在实际开发中,您可以根据需求灵活运用 MyBatis 的各种功能,提高开发效率。
