1. 环境准备
-
添加依赖(Maven)
在
pom.xml
中添加 MyBatis 和数据库驱动依赖:<dependencies> <!-- MyBatis 核心库 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies>
2.创建数据库表
示例用户表 user
:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
email VARCHAR(100)
);
2. 配置文件
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>
<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/test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. 实体类和Mapper接口
-
实体类
User.java
javapublic class User { private Integer id; private String name; private Integer age; private String email; // Getter和Setter方法省略 }
2.Mapper接口 UserMapper.java
java
public interface UserMapper {
User selectUserById(Integer id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(Integer id);
List<User> selectUsersByCondition(User user);
}
4. XML映射文件
UserMapper.xml
java
<?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">
<!-- 结果映射 -->
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="email" column="email"/>
</resultMap>
<!-- 查询用户 -->
<select id="selectUserById" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 插入用户 -->
<insert id="insertUser" parameterType="User">
INSERT INTO user (name, age, email)
VALUES (#{name}, #{age}, #{email})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="User">
UPDATE user
SET name = #{name}, age = #{age}, email = #{email}
WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser">
DELETE FROM user WHERE id = #{id}
</delete>
<!-- 动态SQL查询 -->
<select id="selectUsersByCondition" resultMap="userResultMap">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
</mapper>
5. 使用MyBatis API执行操作
java
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.InputStream;
import java.util.List;
public class MyBatisDemo {
public static void main(String[] args) throws Exception {
// 加载配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 获取Mapper接口实例
UserMapper mapper = session.getMapper(UserMapper.class);
// 插入用户
User newUser = new User();
newUser.setName("张三");
newUser.setAge(25);
newUser.setEmail("[email protected]");
mapper.insertUser(newUser);
session.commit(); // 提交事务
// 查询用户
User user = mapper.selectUserById(1);
System.out.println("查询结果:" + user);
// 动态查询
User condition = new User();
condition.setName("张");
List<User> users = mapper.selectUsersByCondition(condition);
System.out.println("动态查询结果:" + users);
// 更新用户
user.setEmail("[email protected]");
mapper.updateUser(user);
session.commit();
// 删除用户
mapper.deleteUser(2);
session.commit();
}
}
}
6. 动态SQL示例解析
-
<where>
标签 :自动处理条件前的AND
或OR
,避免语法错误。 -
<if>
标签:根据条件动态拼接 SQL 片段。java<select id="selectUsersByCondition" resultMap="userResultMap"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
7. 缓存配置
-
开启二级缓存
在
UserMapper.xml
中添加<cache/>
标签:java<mapper namespace="com.example.mapper.UserMapper"> <cache/> <!-- 其他SQL配置 --> </mapper>
2.实体类序列化
确保 User
类实现 Serializable
接口:
java
public class User implements Serializable {
// 属性和方法
}
8. 与Spring集成
-
添加MyBatis-Spring依赖
java<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency>
2.配置数据源
在 application.properties
中配置:
java
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
3.Mapper扫描
在启动类添加 @MapperScan
:
java
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
9. 常见问题解决
1.SQL注入风险
- 使用
#{}
占位符代替字符串拼接(${}
)。
2.字段名与属性名不一致
- 使用
<resultMap>
显式映射字段和属性。
3.事务管理
- 在需要事务的方法上添加
@Transactional
注解。
总结
通过以上步骤,可以掌握MyBatis的基本使用,包括配置、CRUD操作、动态SQL、缓存及与Spring集成。实际开发中应结合具体需求,合理利用MyBatis的灵活性和强大功能,提升数据库操作效率和代码可维护性。