提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
MyBatis 是一个流行的 Java 持久层框架,它通过简单的 XML 或注解来配置和映射原生信息,将数据库操作与 Java 对象进行映射。它的核心功能是简化数据库操作和 SQL 语句的执行。
一、Why Mybatis?
对比 | JDBC | Mybatis |
---|---|---|
数据库连接 | 代码中手动注册驱动并创建连接 | 将连接配置信息放到 XML 文件中,连接池自动管理连接 |
操作 | 手动编写代码来处理 SQL 参数传递、结果集的封装 | 自动完成参数传递和结果封装 |
SQL 语句 | java程序中编写sql语句 | XML 配置文件或注解中编写并用Mapper 接口方法映射 sql |
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建数据库连接
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, username, password);
// 3. 创建 SQL对象 PreparedStatement
String sql = "SELECT * FROM users WHERE name = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name); // 设置查询参数
// 4. 执行查询
ResultSet resultSet = preparedStatement.executeQuery();
// 5. 处理查询结果
if (resultSet.next()) {
user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setAge(resultSet.getInt("age"));
user.setEmail(resultSet.getString("email"));
}
// 6. 释放资源
preparedStatement.close();
connection.close();
// 1. 加载 MyBatis 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 获取 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3. 获取 Mapper 接口的实现
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 4. 调用 Mapper 方法执行查询
User user = userMapper.findUserByName(name);
二、Mybatis使用
- SQL的XML映射文件与Mapper接口同包同名
- SQL的XML映射文件中的namespace属性值为Mapper接口全限定名
- SQL的XML映射文件中SQL语句的id与Mapper接口的方法名一致
1. mybatis配置文件(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>
<!-- 配置 MyBatis 设置 -->
<settings>
<!-- 将数据库字段的下划线自动映射为 Java 对象的驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 配置 TypeAlias,自动为指定包下的所有类起别名 -->
<typeAliases>
<package name="com.example.pojo"/>
</typeAliases>
<!-- 配置数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置数据源 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- MySQL 驱动 -->
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 配置 Mapper 文件 -->
<mappers>
<!-- 使用包路径引用所有 Mapper 文件 -->
<package name="com.example.mapper"/>
</mappers>
</configuration>
2. SQL的xml映射文件(EmpMapper.xml)
<?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.EmpMapper">
<!-- 结果映射,匹配数据库字段与对象属性 -->
<resultMap id="empResultMap" type="emp">
<result column="work_no" property="workNo"/>
<result column="work_address" property="workAddress"/>
<result column="id_card" property="idCard"/>
</resultMap>
<!-- 查询所有字段配合<include>实现代码复用 -->
<sql id="select*">
select id, work_no, name, gender, age, id_card, work_address, entrydate from emp
</sql>
<!-- 添加新记录 -->
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into emp (work_no, name, gender, age, id_card, work_address, entrydate)
values (#{workNo}, #{name}, #{gender}, #{age}, #{idCard}, #{workAddress}, #{entryDate})
</insert>
<!-- 更新记录 -->
<update id="update">
update emp
<set>
<if test="workNo != null">work_no = #{workNo},</if>
<if test="name != null">name = #{name},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="age != null">age = #{age},</if>
<if test="idCard != null">id_card = #{idCard},</if>
<if test="workAddress != null">work_address = #{workAddress},</if>
<if test="entryDate != null">entrydate = #{entryDate}</if>
</set>
where id = #{id}
</update>
<!-- 根据 ID 删除记录 -->
<delete id="deleteByIds">
delete from emp
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<!-- 查询所有记录 -->
<select id="selectAll" resultMap="empResultMap">
<include refid="select*"/>
</select>
<!-- 根据 ID 查询单个记录 -->
<select id="selectById" resultMap="empResultMap">
<include refid="select*"/>
where id = #{id}
</select>
<!-- 根据条件查询记录 -->
<select id="selectByCondition" resultMap="empResultMap">
<include refid="select*"/>
<where>
<if test="age != 0 and age != null">age < #{age}</if>
<if test="gender != null">and gender = #{gender}</if>
<if test="workAddress != null">and work_address = #{workAddress}</if>
</where>
</select>
</mapper>
3. Mapper接口(EmpMapper.java)
public interface EmpMapper {
// 查询所有员工
List<Emp> selectAll();
// 根据 ID 查询员工
Emp selectById(int id);
// 根据条件查询员工,传入一个 Map,包含不同查询条件
List<Emp> selectByCondition(@Param("condition") Map<String, Object> map);
// 添加员工
void add(Emp emp);
// 更新员工信息,返回更新的记录数
int update(Emp emp);
// 根据 IDs 批量删除员工,返回删除的记录数
int deleteByIds(@Param("ids") List<Integer> ids); // 改为使用 List
}
三、Spring整合Mybatis
-
数据源管理:将 MyBatis 的数据源交给 Spring 管理,使用 Druid 或 C3P0 等连接池代替 MyBatis 内置的连接池,提高数据库连接池的性能和管理。
-
SqlSessionFactory 管理:使用 SqlSessionFactoryBean 将 SqlSessionFactory 交给 Spring 管理,简化配置和管理,并且支持 Spring 的事务管理。
-
Mapper 接口代理:通过 MapperScannerConfigurer 或 @MapperScan / @Mapper注解将 Mapper 接口交给 Spring IoC 容器管理,简化接口代理过程,并支持自动注入和事务管理。
不需要再单独设置mybatis的配置文件,只需要Mapper接口与SQL的XML映射文件,使用时不需要再手动创建SqlSessionFactory、SqlSession与Mapper使用IOC容器与依赖注入直接获取Mapper代理对象。
@Autowired
EmpMapper empMapper;
User user = empMapper.selectById(id);