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.xml
和mybatis-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分