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 configurationPUBLIC "-//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
public class User {private Integer id;private String name;private Integer age;private String email;// Getter和Setter方法省略 }
2.Mapper接口 UserMapper.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
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 userSET 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执行操作
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);// 获取SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 获取Mapper接口实例UserMapper mapper = session.getMapper(UserMapper.class);// 插入用户User newUser = new User();newUser.setName("张三");newUser.setAge(25);newUser.setEmail("zhangsan@example.com");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("new_email@example.com");mapper.updateUser(user);session.commit();// 删除用户mapper.deleteUser(2);session.commit();}}
}
6. 动态SQL示例解析
-
<where>
标签:自动处理条件前的AND
或OR
,避免语法错误。 -
<if>
标签:根据条件动态拼接 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>
7. 缓存配置
-
开启二级缓存
在UserMapper.xml
中添加<cache/>
标签:<mapper namespace="com.example.mapper.UserMapper"><cache/><!-- 其他SQL配置 --> </mapper>
2.实体类序列化
确保 User
类实现 Serializable
接口:
public class User implements Serializable {// 属性和方法
}
8. 与Spring集成
-
添加MyBatis-Spring依赖
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency>
2.配置数据源
在 application.properties
中配置:
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
:
@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的灵活性和强大功能,提升数据库操作效率和代码可维护性。