MyBatis操作数据库(1)
1. MyBatis 简介
MyBatis 是一款持久层框架,简化了 JDBC 的复杂操作,通过配置和映射文件将 Java 对象与数据库表关联。核心优势:
-
自动管理资源:无需手动关闭连接、释放资源。
-
动态 SQL:支持参数绑定、条件查询等。
-
灵活映射:支持结果集与 Java 对象的自动映射。
2. 快速入门
2.1 准备工作
-
创建 Spring Boot 工程,添加依赖:
<!-- MyBatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
2.数据库表准备:
CREATE TABLE `user_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(127) NOT NULL,
`password` VARCHAR(127) NOT NULL,
`age` TINYINT NOT NULL,
`gender` TINYINT DEFAULT '0' COMMENT '1-男 2-女 0-默认',
`phone` VARCHAR(15) DEFAULT NULL,
`delete_flag` TINYINT DEFAULT '0' COMMENT '0-正常 1-删除',
`create_time` DATETIME DEFAULT NOW(),
`update_time` DATETIME DEFAULT NOW() ON UPDATE NOW(),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.实体类:
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
2.2 配置数据源
在 application.yml
中配置数据库连接:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
3. 注解方式操作数据库
3.1 查询操作
Mapper 接口
@Mapper
public interface UserInfoMapper {
@Select("SELECT username, password, age, gender, phone FROM user_info")
List<UserInfo> queryAllUser();
}
测试类:
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void queryAllUser() {
List<UserInfo> userList = userInfoMapper.queryAllUser();
System.out.println(userList);
}
}
3.2 参数传递
使用 #{参数名}
动态传参:
@Select("SELECT * FROM user_info WHERE id = #{id}")
UserInfo queryById(Integer id);
3.3 插入操作
返回自增主键:
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO user_info (username, password) VALUES (#{username}, #{password})")
Integer insert(UserInfo userInfo);
4. XML 方式操作数据库
4.1 配置 XML 路径
在 application.yml
中指定 XML 文件位置:
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
4.2 编写 XML 文件
UserInfoMapper.xml:
<mapper namespace="com.example.mapper.UserInfoMapper">
<select id="queryAllUser" resultType="UserInfo">
SELECT * FROM user_info
</select>
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_info (username, password)
VALUES (#{username}, #{password})
</insert>
</mapper>
4.3 结果映射
解决字段名与属性名不一致问题:
<resultMap id="userMap" type="UserInfo">
<id column="id" property="id"/>
<result column="delete_flag" property="deleteFlag"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
</resultMap>
5. 常见问题与解决方案
5.1 字段名映射
-
开启驼峰命名(推荐)
mybatis:
configuration:
map-underscore-to-camel-case: true
2. 手动别名:
SELECT delete_flag AS deleteFlag FROM user_info
5.2 #{}
与 ${}
的区别
-
#{}
:预编译 SQL,防止 SQL 注入。 -
@Select("SELECT * FROM user_info WHERE username = #{name}") UserInfo queryByName(String name);
${}
:直接拼接 SQL,适用于动态排序或表名:
@Select("SELECT * FROM user_info ORDER BY ${sortKey}")
List<UserInfo> queryBySort(@Param("sortKey") String sortKey);
5.3 模糊查询
使用 CONCAT
函数避免 SQL 注入:
@Select("SELECT * FROM user_info WHERE username LIKE CONCAT('%', #{key}, '%')")
List<UserInfo> queryByKeyword(String key);
6. 多表查询示例
实体类:
@Data
public class ArticleInfo {
private Integer id;
private String title;
private String content;
private Integer userId;
private String username; // 关联用户表字段
}
Mapper 接口:
@Select("SELECT a.*, u.username FROM article_info a LEFT JOIN user_info u ON a.user_id = u.id WHERE a.id = #{id}")
ArticleInfo getArticleWithUser(Integer id);
7. 数据库连接池
Spring Boot 默认使用 Hikari,切换为 Druid:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.21</version>
</dependency>
8. 总结
-
核心功能:MyBatis 通过注解或 XML 简化 SQL 操作,支持动态 SQL 和结果映射。
-
最佳实践:
-
优先使用
#{}
防止 SQL 注入。 -
开启驼峰命名简化字段映射。
-
复杂 SQL 使用 XML 配置,简单操作使用注解。
-
-
企业规范:表名小写下划线分隔,必备字段
id
、create_time
、update_time
。