Spring整合Mybatis附加实现案例

前言

本文围绕Spring整合Mybatis,实现用户的登陆验证java

1、环境搭建

1.使用环境

JDK 11
MySQL 8
Maven 3.6.3

2.pom.xml配置(所需依赖,资源导入)

<dependencies>
       <!--单元测试-->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
       </dependency>
       <!--包含 spring 核心包-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>5.2.8.RELEASE</version>
       </dependency>
       <!--c3p0-->
       <dependency>
           <groupId>com.mchange</groupId>
           <artifactId>c3p0</artifactId>
           <version>0.9.5.5</version>
       </dependency>
       <!--mysql驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.19</version>
       </dependency>
       <!--mybatis-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.2</version>
       </dependency>
       <!-- mybatis与spring整合的jar包-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis-spring</artifactId>
           <version>2.0.3</version>
       </dependency>
       <!--日志-->
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.17</version>
       </dependency>
       <!--aop-->
       <dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjweaver</artifactId>
           <version>1.8.9</version>
       </dependency>
       <!--jdk11以上版本javax.annotation.Resource不存在,须要手动引入后才能使用@Resource注解-->
       <dependency>
           <groupId>javax.annotation</groupId>
           <artifactId>javax.annotation-api</artifactId>
           <version>1.2</version>
       </dependency>
       <!--spring-jdbc-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jdbc</artifactId>
           <version>5.2.8.RELEASE</version>
       </dependency>
       <!--lombok-->
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>1.18.10</version>
       </dependency>
   </dependencies>

   <build>
       <!--资源导入问题-->
       <resources>
           <resource>
               <directory>src/main/resources</directory>
           </resource>
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.xml</include>
                   <include>**/*.properties</include>
                   <include>**/*.tld</include>
               </includes>
               <filtering>false</filtering>
           </resource>
       </resources>
   </build>

3.properties文件

db.properties
注:MySQL 8 须要添加时区设置mysql

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=root
jdbc.password=125803

log4j.propertiesweb

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/test.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

t_user表结构
spring

4.spring配置(含aop,tx配置)

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--自动装配,扫描包的范围-->
    <context:component-scan base-package="com.wang"/>
    <!--加载properties配置文件-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--aop-->
    <aop:aspectj-autoproxy/>
    <!--配置c3p0数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--配置事务管理器-->
    <bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--设置事务加强-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <!--aop切面-->
    <aop:config>
        <aop:pointcut id="servicePointcut" expression="execution(* com.wang.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
    </aop:config>
    <!--配置sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/wang/dao/*.xml"/>
    </bean>
    <!--配置扫描器-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描全部映射接口类-->
        <property name="basePackage" value="com.wang.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>

5.mybatis配置

<?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>
    <!--log4j,驼峰命名转换-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--定义别名-->
    <typeAliases>
        <package name="com.wang.pojo"/>
    </typeAliases>
</configuration>

6.测试

(1).实体类(pojo)sql

import lombok.Data;
@Data
public class User {
    private int userId;
    private String userName;
    private String userPassword;
}

(2).持久层(dao)express

import com.wang.pojo.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper {
    @Select("select user_name as userName,user_password as userPassword from mybatis.t_user")
    List<User> getUserList();
}

(3).业务层(service)apache

import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService {
    @Resource
    private UserMapper mapper;
    public List<User> getUserList(){
        return mapper.getUserList();
    }
}

(4).控制层(controller)api

import javax.annotation.Resource;
import java.util.List;
@Controller
public class UserController {
    @Resource
    private UserService service;
    public List<User> getUserList(){
        return service.getUserList();
    }
}

(5).运行测试mybatis

public class Start {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = (UserController) context.getBean("userController");
        List<User> userList = userController.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

(6).测试结果:可以查询并输出,说明整合完成
mvc

2、使用Spring,Mybatis实现用户登陆验证

1.持久层(dao)

功能说明:
  查询用户使用用户名是否存在,密码是否正确
userMapper

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
    User queryUserByName(@Param("userName") String name);
}

userMapper.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.wang.dao.UserMapper">
    <sql id="query-user">
        <if test="userName != null">
            user_name = #{userName}
        </if>
    </sql>
    <select id="queryUserByName" resultType="user">
        select * from mybatis.t_user
        <where>
            <include refid="query-user"></include>
        </where>
    </select>
</mapper>

2.新建实体类

该实体类将最后的结果输出显示给用户

import lombok.Data;

@Data
public class ResultCode {
    private int code;
    private String msg;
}

3.业务层(service)

功能说明:
  1.获取用户输入的用户名和密码
  2.判断输入是否为空
  3.判断输入用户名是否存在
  3.若用户存在,判断密码是否正确
  3.若用户存在,密码正确,登陆成功!

import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class UserService {
    @Resource
    private UserMapper mapper;
    public ResultCode login(String name, String pwd){
        ResultCode res = new ResultCode();
        User user = mapper.queryUserByName(name);
        if (name == "" || pwd == ""){
            res.setCode(500);
            res.setMsg("用户名或密码为空,请从新输入!");
            return res;
        }
        if (user == null){
            res.setCode(500);
            res.setMsg("用户不存在!");
            return res;
        }
        if (!pwd.equals(user.getUserPassword())){
            res.setCode(500);
            res.setMsg("密码错误!");
            return res;
        }
        res.setCode(200);
        res.setMsg("登陆成功!");
        return res;
    }
}

4.控制层(controller)

功能介绍
  调用业务层功能

import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController {
    @Resource
    private UserService service;
    public ResultCode login(String name, String pwd){
        return service.login(name, pwd);
    }
}

5.登陆测试

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Start {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = (UserController) context.getBean("userController");
        ResultCode res = userController.login("admin", "123456");
        System.out.println(res);
    }
}

总结

道阻且长,行则将至!