前言:
本篇博客是为了记录自己在学习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 >= #{condition.startAge}
</if>
<if test="condition.endAge!= null ">
and age <= #{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(控制反转/依赖注入),加深自己对于这个概念的理解,顺便也记录一下学习路线。