使用spring来整合mybatis

前言:

        本篇博客是为了记录自己在学习spring中收获以及spring与mybatis进行整合。

1. 项目准备

        1.1 导入依赖
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>spring-maybatis01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>spring-maybatis01 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.2.15.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--配置mysql驱动,这里使用的是8版本的-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
    </dependency>
    <!--使用第三方连接池-->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>
    <!--spring-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--spring整合mybatis -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--mybatis与spring整合的jar-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.7</version>
    </dependency>

    <!--servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>

    <!--jsp-api-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>

    <!--log4j-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.36</version>
    </dependency>

    <!--junit单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
    </dependency>
  </dependencies>
</project>
        1.2 项目结构

1.3 配置文件

applicationContext-mybatis.xml

<!--加载Properties文件-->
        <context:property-placeholder location="classpath:db.properties" file-encoding="UTF-8"/>
        <!--配置数据源-->
        <bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="${jdbc.driverClass}"/>
                <property name="jdbcUrl" value="${jdbc.url}"/>
                <property name="user" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>

                <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
                <property name="minPoolSize" value="${jdbc.minPoolSize}"/>
                <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
                <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>
        </bean>


        <!--SqlSessionFactoryBean-->
        <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="dataSource"/>
                <!--配置类型别名-->
                <property name="typeAliasesPackage" value="com.fs.entity"/>
                <!--mybatis的主配置文件-->
                <property name="configLocation" value="classpath:mybatis-config.xml"/>
                <!--mapper映射文件  一个一个映射文件加载-->
               <!-- <property name="mapperLocations" value="classpath:mapper/UserMapper.xml,classpath:mapper/LoginMapper.xml"/>-->
                <!--支持通配符方式-->
                <property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"/>
        </bean>


        <!--配置mapper扫描器: 扫描Mapper接口, 生成代理对象, 交给Spring管理-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                <!--指定mapper接口所在的包-->
                <property name="basePackage" value="com.fs.mapper"/>
                <!--注入SqlSessionFactoryBean-->
                <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        </bean>

日志文件log4.properties

log4j.rootCategory=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

2. 编写实体类

因为每个表中都有一个id属性,所以可以创建一个父类,包含每一个子类都有的属性。

BaseEntity

package com.fs.entity;

public abstract class BaseEntity {
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

这里只使用UserInfo这个表用来进行测试。

UserInfo

package com.fs.entity;

/**
 * @author xwx
 * @create 2023-10-19 15:34
 * 与数据库相对应的类是叫JavaBean
 * 该类与数据库中userinfo相对应
 */
public class UserInfo extends BaseEntity {
    private String name;
    private String gender;
    private Integer age;
    private String address;
    private String email;
    private String qq;
    //添加一个新字段
    private String photo;

    public UserInfo(String name, String gender, Integer age, String address, String email, String qq) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.address = address;
        this.email = email;
        this.qq = qq;
    }

    public UserInfo() {
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getQq() {
        return qq;
    }

    public void setQq(String qq) {
        this.qq = qq;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", email='" + email + '\'' +
                ", qq='" + qq + '\'' +
                '}';
    }
}

3. 编写mapper层接口

UserInfoMapper

package com.fs.mapper;


import com.fs.entity.User;
import com.fs.entity.UserCondition;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {
    /**
     * 分页查询
     * @return
     */
    List<User> selectPage(@Param("condition") UserCondition userCondition);

    /**
     * 查询总记录数
     * @return
     */
    long count(@Param("condition") UserCondition userCondition);

    /**
     * 根据id查询
     * @param id
     * @return
     */
    User selectById(int id);

    /**
     * 根据id修改用户
     * @param user
     */
    void updateById(User user);
    /**
     * 根据id删除用户
     */
    void deleteById(int id);

    /**
     * 插入记录
     * @param user
     */
    void insert(User user);
}

4. 编写sql映射文件

UserInfoMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fs.mapper.UserMapper">
    <select id="selectPage" parameterType="UserCondition" resultType="User">
        select * from tb_userinfo
        <include refid="where_sql"/>
        <if test="condition != null">
            <if test="condition.startNo != null and condition.pageSize != null">
                limit #{condition.startNo},#{condition.pageSize}
            </if>
        </if>
    </select>

    <select id="count" parameterType="UserCondition" resultType="long">
        select count(1) from tb_userinfo  <include refid="where_sql"/>
    </select>

    <select id="selectById" parameterType="int" resultType="User">
        select * from tb_userinfo where id = #{id}
    </select>

    <update id="updateById" parameterType="User">
        update tb_userinfo set name=#{name}, age=#{age},gender=#{gender},address=#{address},
        email=#{email},qq=#{qq}  where id =#{id}
    </update>

    <delete id="deleteById" parameterType="int">
        delete from tb_userinfo  where id = #{id}
    </delete>

    <insert id="insert" parameterType="User">
        insert into tb_userinfo(name,gender,age,address,email,qq,photo) values(#{name},#{gender},#{age},#{address},#{email},#{qq},#{photo})
    </insert>


    <sql id="where_sql">
        <where>
            <if test="condition!=null">
                <if test="condition.name!= null and condition.name !=''">
                    and  name like '%${condition.name}%'
                </if>
                <if test="condition.address!= null and condition.address !=''">
                    and  address like '%${condition.address}%'
                </if>
                <if test="condition.startAge!= null">
                    and  age &gt;= #{condition.startAge}
                </if>
                <if test="condition.endAge!= null ">
                    and  age  &lt;= #{condition.endAge}
                </if>
            </if>
        </where>
    </sql>
</mapper>

5. 编写测试类

UserMapper

package com.fs.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

/**
 * @author xwx
 * @create 2023-11-16 15:52
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserMapperTest {

    @Autowired
    private  UserMapper userMapper;
    @Test
    public void selectById() {
        System.out.println(userMapper.selectById(17));
    }
}

 这里介绍一下使用的三个注解

@RunWith

在Spring框架中,@RunWith注解也有特殊的使用方式。@RunWith注解可以和SpringJUnit4ClassRunner类一起使用,以便在测试开始的时候自动创建Spring的应用上下文。这对于在Spring环境中进行测试非常有用。

@ContextConfiguration("classpath:applicationContext.xml")

@ContextConfiguration是Spring框架中用于配置测试用例的注解。它允许在测试类中通过注解的方式定义需要加载的Spring配置文件或配置类,以便在测试过程中创建Spring应用上下文。

@ContextConfiguration注解可以与@RunWith注解联合使用,用于在Spring环境中进行测试。当一个测试类被标记为@RunWith(SpringJUnit4ClassRunner.class)时,可以使用@ContextConfiguration注解来指定加载哪个配置类或配置文件。

@Autowired

@Autowired是一种注解,它是Spring框架中的一个注释,用于自动装配bean。通过@Autowired注解,Spring容器可以在运行时自动将符合条件的bean注入到相应的属性、构造函数或方法中。

6. 日志打印结果

总结:

        本博客是简单介绍了一下,spring与mybatis进行整合,其中用到了spring核心概念,IOC/DI(控制反转/依赖注入),加深自己对于这个概念的理解,顺便也记录一下学习路线。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值