Mybatis与Spring整合

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

MyBatis 是一个流行的 Java 持久层框架,它通过简单的 XML 或注解来配置和映射原生信息,将数据库操作与 Java 对象进行映射。它的核心功能是简化数据库操作和 SQL 语句的执行。

一、Why Mybatis?

对比JDBCMybatis
数据库连接代码中手动注册驱动并创建连接将连接配置信息放到 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使用

  1. SQL的XML映射文件与Mapper接口同包同名
  2. SQL的XML映射文件中的namespace属性值为Mapper接口全限定名
  3. 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 &lt; #{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

  1. 数据源管理:将 MyBatis 的数据源交给 Spring 管理,使用 Druid 或 C3P0 等连接池代替 MyBatis 内置的连接池,提高数据库连接池的性能和管理。

  2. SqlSessionFactory 管理:使用 SqlSessionFactoryBean 将 SqlSessionFactory 交给 Spring 管理,简化配置和管理,并且支持 Spring 的事务管理。

  3. Mapper 接口代理:通过 MapperScannerConfigurer 或 @MapperScan / @Mapper注解将 Mapper 接口交给 Spring IoC 容器管理,简化接口代理过程,并支持自动注入和事务管理。

不需要再单独设置mybatis的配置文件,只需要Mapper接口与SQL的XML映射文件,使用时不需要再手动创建SqlSessionFactory、SqlSession与Mapper使用IOC容器与依赖注入直接获取Mapper代理对象。

	@Autowired
	EmpMapper empMapper;
	User user = empMapper.selectById(id);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值