整合Mybatis和Spring框架进行注解开发SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第十天)

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第十天)整合Mybatis和Spring框架进行注解开发

今天我们要实现Spring和Mybatis的整合,实现对数据库进行增删改查的操作,首先使用XML的方式

一、对数据库表Users进行新增处理

①先导入我们准备好的数据库文件mybatisandspring.sql,创建出数据库mybatisandspring

在这里插入图片描述

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]在这里插入图片描述


②使用idea的Maven构建工具,新建一个java项目为samTest。

在这里插入图片描述


③编写pom.xml引入我们所需要的依赖
<?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>samTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

    <dependencies>
        <!-- AOP 依赖 -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>

        <!-- AspectJ 依赖,用于AspectJ方式的AOP -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.9</version>
        </dependency>

        <!-- DBCP数据库连接池依赖 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- Commons Logging日志框架依赖 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Commons Logging日志框架依赖 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- 连接池依赖 -->
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.6</version>
        </dependency>

        <!-- Hamcrest测试框架依赖 -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>

        <!-- JavaEE API依赖 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>

        <!-- JSTL标签库依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- JUnit测试框架依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!-- Log4j日志框架依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- MyBatis ORM框架依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.2</version>
        </dependency>

        <!-- MyBatis Spring整合依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!-- MySQL连接驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

        <!-- Spring AOP依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring Aspects依赖,为AspectJ整合 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring Bean依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring Context依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring Core依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring Expression Language依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring JDBC依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring TX依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring MVC依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>

        <!-- Spring MVC依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
    </dependencies>


</project>

编写完成后要点击右上角的maven进行刷新,记得要联网才能下载导入依赖

在这里插入图片描述

进度条在下面的终端查看

在这里插入图片描述

状态栏变成绿色✔,然后下面的进度条没有了,就说明引入成功了

若是有爆红就根据报错来进行修改

在这里插入图片描述


④在resources资源文件夹下编写我们的配置文件,spring-config.xml和mybatis-config.xml文件还有db.properties、以及log4j.properties

1.spring-config.xml:这是Spring框架的配置文件。它包含了Spring容器的配置信息,用于定义和配置Spring的bean、数据源、事务管理等。通常也会在这里配置扫描注解、AOP等Spring相关的功能。

2.mybatis-config.xml:这是MyBatis框架的配置文件。它包含了MyBatis的全局配置信息,如数据库连接池、映射器(Mapper)的位置、类型别名等。在这个文件中,可以用来配置MyBatis的全局属性,以及指定映射器接口的位置。

3.db.properties:这是一个属性文件,通常用于存储数据库连接的配置信息,如数据库URL、用户名、密码等。这些配置可以在spring-config.xmlmybatis-config.xml中通过占位符的方式引用,以便在不同环境下进行配置切换

4.log4j.properties(log4j日志框架配置文件):这是用于配置日志框架(例如Log4j)的文件。它定义了日志的输出方式、日志级别、日志文件的位置等。在应用程序中,我们可以使用日志框架来记录应用的运行日志,以便排查问题和监控应用状态。

这里就不附上代码了,配置文件可以在文章附带的资源包中下载

⑤创建pojo包,包下创建于数据库表结构相同一 一对应的实体类User

这里可以使用前面我们讲的,链接database自动生成pojo类

在这里插入图片描述

在这里插入图片描述

可以看到自动生成的pojo类如上,记得生成后要自己检查一下是否出错,映射关系是否正确无误。

⑥创建dao层,包内再创建user包,user包中新建一个UserMapper.xml的映射文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.steveDash.dao.user.UserMapper">

    <!-- 用户表中添加记录-->
    <insert id="saveUser" parameterType="Userss">
        insert into users(uname,uage)values(#{uname},#{uage})
    </insert>
</mapper>

这里的参数类型可以填User,是因为我们在mybatis-config中填入了别名包pojo

在这里插入图片描述

⑦再在dao.user中创建出该映射文件的接口文件UserMapper,这里要跟我们的映射文件同名用来绑定

UserMapper接口文件中编写saveUser(),以及对User表的其他方法。

接口中的方法必须与SQL映射文件(就是mapper文件)中的SQL语句的ID 一 一 对应

在这里插入图片描述

因此上面的UserMapper.xml的映射文件我已经修改好了,写代码就是这样,要边写,便检查自己是否有写错,不要等到最后再进行检查,这样很容易找不到问题。

⑧新建Service层,因为我们已经学过了三层架构的思想,那么在com.steveDash下创建service包

这里的com.steveDash是公司域名的倒序写法,也可以用个人名等,这样不容易报错,也容易定位出问题。

包内新建一个user包,user包下新建一个UserService的接口,用于定义添加用户的方法

package com.steveDash.service.user;

import com.steveDash.pojo.Users;

public interface UserService {
    public int addUser(Users users);
}

然后创建该接口的实例UserServiceImpl

package com.steveDash.service.user;

import com.steveDash.dao.user.UserMapper;
import com.steveDash.pojo.Users;
import org.apache.log4j.Logger;

public class UserServiceImpl implements UserService {
    private Logger logger = Logger.getLogger(UserServiceImpl.class);
    private UserMapper userMapper;

    public UserMapper getUserMapper() {
        return userMapper;
    }

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public int addUser(Users users) {
        if(!users.equals("")&&!users.equals("null")) {
            int result=userMapper.saveUser(users);
            if(result>0) {
                logger.info("输出插入成功");
                return result;
            }
        }
        logger.info("输出插入失败");
       return 0;
    }
}

⑨创建测试类:在test-jave下创建test包,用于创建测试类供我们测试程序是否正常运行

package test;

import com.steveDash.pojo.Users;
import com.steveDash.service.user.UserService;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {
    private Logger logger=Logger.getLogger(UserTest.class);

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = (UserService) context.getBean("userService");
        Users user = new Users();
        user.setUname("steveDash");
        user.setUage(22);
        userService.addUser(user);
    }
}

在这里插入图片描述

在这里插入图片描述

前面bean id 说明的是实体类的唯一id,autowire="byName"的意思是根据Name来进行自动装配

也可以看出程序提示,插入成功,我们会过去数据库进行查看

在这里插入图片描述

可以看到数据库中插入了数据,但是存在同名的情况,我们查看一下数据库表设计

在这里插入图片描述

如下图:

在这里插入图片描述

那就很明显了,但是同个班也是有可能会出现学生同名的这种情况,所以就不做限制了,具体需求具体分析。


二、对数据库表Users进行模糊查询处理

就是输入根据姓名进行查询,这里涉及到一个精准匹配和模糊查询。

一般来说都是模糊查询更为受用。因为用户输入姓名时可能会有误差,出现拼写错误等不一致情况,使用精准查询没办法搜索到用户。或者用户重名的情况下,在全栈开发的情况下还要考虑一手网络安全,防止注入攻击等。

因此对比起来,模糊查询姓名可以提供更灵活的搜索体验

①在UserMapper.xml映射文件中,添加好查询的SQL语句
<!--根据姓名查询用户表中的记录-->
<select id="findUsersByName" parameterType="String" resultType="Users">
    select * from users where uname like concat('%',#{uanem},'%')
</select>
②在dao.user.UserMapper接口中添加我们刚刚写入的查询方法
package com.steveDash.dao.user;

import com.steveDash.pojo.Users;

import java.util.List;

public interface UserMapper {
    public int saveUser(Users users);
    public List<Users> findUsersByName(String uname);

}

③在Service层中的UserService中同样也添加方法,这里命名为getUsersList,也可以采用都保持一致的写法,都是没有问题的
package com.steveDash.service.user;

import com.steveDash.pojo.Users;

import java.util.List;

public interface UserService {
    public int addUser(Users users);
    public List<Users> getUsersList(String uname);
}

④在UserServicelImpl也就是UserService的实现类中实现getUsersList方法
package com.steveDash.service.user;

import com.steveDash.dao.user.UserMapper;
import com.steveDash.pojo.Users;
import org.apache.log4j.Logger;

import java.util.List;

public class UserServiceImpl implements UserService {
    private Logger logger = Logger.getLogger(UserServiceImpl.class);
    private UserMapper userMapper;

    public UserMapper getUserMapper() {
        return userMapper;
    }

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public int addUser(Users users) {
        if(!users.equals("")&&!users.equals("null")) {
            int result=userMapper.saveUser(users);
            if(result>0) {
                logger.info("输出插入成功");
                return result;
            }
        }
        logger.info("输出插入失败");
       return 0;
    }

    public List<Users> getUsersList(String uname){
        try {
            return userMapper.findUsersByName(uname);
        }catch (RuntimeException e){
            e.printStackTrace();
            throw e;
        }
    }
}

⑤编写测试类查看方法是否满足需求?新增test1()进行测试
package test;

import com.steveDash.pojo.Users;
import com.steveDash.service.user.UserService;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class UserTest {
    private Logger logger=Logger.getLogger(UserTest.class);

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = (UserService) context.getBean("userService");
        Users user = new Users();
        user.setUname("steveDash");
        user.setUage(22);
        userService.addUser(user);
    }


    @Test
    public void test1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = (UserService) context.getBean("userService");
        String uname="王";
        List<Users> list=userService.getUsersList(uname);
        for(Users user:list){
            logger.info("id:"+user.getUid()+", 姓名:"+user.getUname()+", 年龄:"+user.getUage());
        }
    }


}

输出结果如下:与数据库中记录的完全一致,![外链图片转存失败,源站可能有在这里插入图片描述

在这里插入图片描述


三、若想使用注解方式运行

①在SPring-config.xml中添加头部份
<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       
   xmlns:context="http://www.springframework.org/schema/context"
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd">
②再在我们的配置文件中spring-config.xml中的配置业务Bean这部分注释掉

在这里插入图片描述

修改为如下代码:记得这里的包路径需要根据自己的实际项目进行修改

<context:component-scan base-package="com.steveDash.service"/>

在这里插入图片描述

③打开UserServicelmpl类,添加上我们的注解

在这里插入图片描述

@Service标明是一个service层的组件Bean。若是不声明的的话 那么测试类中的bean获取名就得修改为userServiceImpl

@Resource是依赖的自动注入,默认是按照名称注入,也就是对应我们dao包下的UserMapper接口,这里也可以用@Autowried,不过是默认按类型注入。

在这里插入图片描述

相比于@Autowired,@Resource自动注入主要有以下特点:
  • @Autowired默认按类型注入,@Resource默认按名称注入。
  • @Resource支持JDK自带版本和Spring版本,功能一致但使用略有不同。
  • @Resource可以自定义探查策略,如优先byName然后byType。
  • @Autowired要配合@Qualifier使用来指定注入Bean。
  • @Resource直接在name属性指定要注入的Bean名称。

总结

​ 今天初步学习了Spring和Mybatis的整合方法,并且对数据库表Users进行了链接操作。整个项目的架构采用的是三层架构,是为了熟悉后面引入的SpringMVC做铺垫,也温习了前面文章讲解到的Mybatis核心内容和Spring的核心内容,分别使用了XML方式和注解方式进行开发,不过只完成了新增用户和模糊搜索用户俩个功能,其他的删除和更新功能

PS:测试题,可以下载后通过对tb_person进行如下增删改查操作,来巩固完善知识点,学会SPring与mybatis整合的方法

1.添加新的人员数据:对tb_person新增一条记录

2.查询:请查询并显示所有sex是“男“或者”女“的记录

3.修改:请把jack的性别修改为”女“

4.在完成上面的几步之后,可以尝试使用SpringAOP方法,添加一个功能,在添加tb_person表记录的时候,向日志中写入新增人员信息成功,在修改tb_person表数据成功是,向日志中写入”修改人员信息成功“

各位读者想要跟着学习的,数据库文件也会在文章的资源附件中携带,各位可以自行下载学习使用。另外我的md文件也会发上去,项目文件会上传可以自己跟着学习一下

作者:Stevedash

发表于:2023年9月11日 15点17分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stevedash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值