【java后端】Spring集成MyBatis实现对数据库的增删改查

1,226 阅读6分钟

介绍

本项目通过对 SpringMyBatis 框架的整合,实现对数据库表格的增删改查,后续会继续分享SSMSpring+SpringMVC+Mybatis)项目环境的搭建。

需要完成的功能

  • 在数据库中创建足球队球员信息表来保存球员信息
  • 增删改查球员的信息(姓名,年龄,角色,球衣号码)

涉及技术

Java基础知识

框架:Spring, MyBatis, SpringMyBatis整合

数据库:MySQL

开发工具:IDEA, Maven

框架及工具介绍

1.Spring

Spring是一个开源框架,它由Rod Johnson创建。出现在2002左右,解决企业开发的难度。减轻对项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系。spring核心技术iocaop 能实现模块之间,类之间的解耦合。

2.MyBatis

MyBatis 是一个sql映射框架,提供了数据库的操作能力。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和普通的Java对象映射成数据库中的记录。

3.Maven

MavenApache软件基金会组织维护的一款自动化构建工具,专注服务于Java 平台的项目构建和 依赖管理。Maven 是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用。

准备工作

1.maven工具的安装

地址: maven.apache.org/ 从中下载 .zip文件。 我自己使用的 apache-maven-3.3.9-bin.zip

安装:

1.确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录

image.png

2.解压缩 apache-maven-3.3.9-bin.zip ,把解压后的文件放到一个目录中。 (我放到D盘根目录了)

目录的路径不要有中文, 不要有空格。

image.png

3.把maven安装目录中下的bin的路径添加到path

image.png

4.测试maven的安装。 在命令行执行 mvn -v

image.png

5.修改本地仓库位置

本地仓库的默认路径是你登录操作系统的账号的目录中/.m2/repository

修改本地仓库的位置:修改maven工具的配置文件(maven的安装路径\conf\setting.xml

步骤:

1)创建一个目录,作为仓库使用。 目录不要有中文和空格。

例如: D:\openrepository

2)修改setting.xml文件(在maven安装目录下conf文件夹),指定D:\openrepository这个目录

image.png

3)将本地仓库的资源拷贝到 D:/openrepository

6.配置阿里云镜像

image.png

2.在IDEA中集成Maven

idea中有一个自带的maven,通过一下设置让idea使用自己安装的maven

1)选择File- Settings ,在指定位置选择maven安装目录及settings文件目录

image.png

设置jdk信息,且在设置项位置填写:-DarchetypeCatalog=internal

image-20210817203925106.png 2) 如图所示,为新建或导入的项目配置maven信息:

image.png

设置与1)一致即可

至此就完成了maven环境的配置。

3.在数据库中创建表

本例以足球队球员信息表为操作对象,表名为football_team,如图所示:

image.png

Spring集成MyBatis环境搭建

1.新建maven项目

1)创建空Project,如图所示确保jdk信息无误

image-20210817205350353.png

2)创建新Module

如图所示,选择从模板创建

image.png

接着设置基本信息及坐标gav

image.png

点击Finish,完成项目创建。

image-20210817093322729.png

2.修改pom文件

pom文件中加入用到的maven依赖,并加入相关插件,具体内容如下:

<?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>com.bupt</groupId>
  <artifactId>my-spring-mybatis</artifactId>
  <version>1.0-SNAPSHOT</version>
​
​
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>13</maven.compiler.source>
    <maven.compiler.target>13</maven.compiler.target>
  </properties>
​
  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--spring核心ioc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--做spring事务用到的-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--mybatis和spring集成的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
    <!--阿里公司的数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>
  </dependencies>
​
  <build>
    <!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
    <!--指定jdk的版本-->
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>13</source>
          <target>13</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

注:依赖如果出现爆红的情况,可能是因为没有自动刷新,Reload一下就好了:

image.png

3.设置资源文件夹

设置资源文件夹,以便在此创建配置文件

image.png

4.创建实体类

在domain包下创建实体类

image.png

具体代码如下,使用alt+insert快捷键创建getsettoString方法

package com.bupt.domain;
​
public class Player {
    //属性名和数据库表的列名一致
    private String name;
    private Integer age;
    private String role;
    private Integer num;
​
    public Player() {
    }
​
    public Player(String name, Integer age, String role, Integer num) {
        this.name = name;
        this.age = age;
        this.role = role;
        this.num = num;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public void setAge(Integer age) {
        this.age = age;
    }
​
    public void setRole(String role) {
        this.role = role;
    }
​
    public void setNum(Integer num) {
        this.num = num;
    }
​
    public String getName() {
        return name;
    }
​
    public Integer getAge() {
        return age;
    }
​
    public String getRole() {
        return role;
    }
​
    public Integer getNum() {
        return num;
    }
​
    @Override
    public String toString() {
        return "Player{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", role='" + role + ''' +
                ", num=" + num +
                '}';
    }
}

5.创建dao接口和mapper文件

image-20210817102800481.png

PlayerDao接口内容如下:

package com.bupt.dao;
​
import com.bupt.domain.Player;
​
import java.util.List;
​
public interface PlayerDao {
    int insertPlayer(Player player);
    List<Player> selectPlayers();
    int updatePlayer(Player player);
    int deletePlayer(int num);
}

mapper文件内容如下:

<?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.bupt.dao.PlayerDao">
​
    <select id="selectPlayers" resultType="com.bupt.domain.Player">
        select name,age,role,num from football_team order by num desc
    </select>
​
    <insert id="insertPlayer">
        insert into football_team values(#{name},#{age},#{role},#{num})
    </insert>
​
    <update id="updatePlayer">
        update football_team set name = #{name},age = #{age},role = #{role} where num = #{num}
    </update>
​
    <delete id="deletePlayer">
        delete from football_team where num=#{num}
    </delete>
</mapper>

6.创建mybatis主配置文件

如图所示创建主配置文件:

image-20210817103607187.png MyBatis主配置文件mybatis.xml内容如下:

<?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>
​
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
​
    <!--设置别名-->
    <typeAliases>
        <!--name:实体类所在的包名-->
        <package name="com.bupt.domain"/>
    </typeAliases>
​
​
    <!-- sql mapper(sql映射文件)的位置-->
    <mappers>
        <!--
          name:是包名, 这个包中的所有mapper.xml一次都能加载
        -->
        <package name="com.bupt.dao"/>
    </mappers>
</configuration>

7.创建Service接口和实现类

如图所示创建Service接口和实现类:

image.png

PlayerService接口内容如下:

package com.bupt.service;
​
import com.bupt.domain.Player;
​
import java.util.List;
​
public interface PlayerService {
​
    int addPlayer(Player player);
    List<Player> queryPlayers();
    int upPlayer(Player player);
    int delPlayer(int num);
}

实现类内容如下:

package com.bupt.service.impl;
​
import com.bupt.dao.PlayerDao;
import com.bupt.domain.Player;
import com.bupt.service.PlayerService;
​
import java.util.List;
​
public class PlayerServiceImpl implements PlayerService {
​
    private PlayerDao playerDao;
​
    public PlayerServiceImpl() {
    }
​
    public PlayerServiceImpl(PlayerDao playerDao) {
        this.playerDao = playerDao;
    }
​
    public PlayerDao getPlayerDao() {
        return playerDao;
    }
​
    public void setPlayerDao(PlayerDao playerDao) {
        this.playerDao = playerDao;
    }
​
    @Override
    public int addPlayer(Player player) {
        int res = playerDao.insertPlayer(player);
        return res;
    }
​
    @Override
    public List<Player> queryPlayers() {
        List<Player> players = playerDao.selectPlayers();
        return players;
    }
​
    @Override
    public int upPlayer(Player player) {
        int res = playerDao.updatePlayer(player);
        return res;
    }
​
    @Override
    public int delPlayer(int num) {
        int res = playerDao.deletePlayer(num);
        return res;
    }
}

8.创建spring的配置文件

如图所示创建spring的配置文件:

image-20210817120028613.png

创建好spring的配置文件后,可能会出现以下提示:

image-20210817120226781.png

解决办法:

image.png

配置文件主要包括的对象:

1)数据源DataSource

使用阿里的Druid连接池,可在github.com/alibaba/dru…查看说明文档

2)SqlSessionFactory

3)Dao对象

4)声明自定义的service实现类对象

具体内容如下:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
​
    <!--
       把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
       spring知道jdbc.properties文件的位置
    -->
    <context:property-placeholder location="classpath:jdbc.properties" />
​
    <!--声明数据源DataSource, 作用是连接数据库的-->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <!--set注入给DruidDataSource提供连接数据库信息 -->
        <!--    使用属性配置文件中的数据,语法 ${key} -->
        <property name="url" value="${jdbc.url}" /><!--setUrl()-->
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.passwd}" />
        <property name="maxActive" value="${jdbc.max}" />
    </bean>
​
    <!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的
        SqlSessionFactory  sqlSessionFactory = new ..
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--set注入,把数据库连接池付给了dataSource属性-->
        <property name="dataSource" ref="myDataSource" />
        <!--mybatis主配置文件的位置
           configLocation属性是Resource类型,读取配置文件
           它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置
        -->
        <property name="configLocation" value="classpath:mybatis.xml" />
    </bean>
​
    <!--创建dao对象,使用SqlSession的getMapper(StudentDao.class)
        MapperScannerConfigurer:在内部调用getMapper()生成每个dao接口的代理对象。
​
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定SqlSessionFactory对象的id-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!--指定包名, 包名是dao接口所在的包名。
            MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行
            一次getMapper()方法,得到每个接口的dao对象。
            创建好的dao对象放入到spring的容器中的。 dao对象的默认名称是 接口名首字母小写
        -->
        <property name="basePackage" value="com.bupt.dao"/>
    </bean>
​
    <!--声明service-->
    <bean id="playerService" class="com.bupt.service.impl.PlayerServiceImpl">
        <property name="playerDao" ref="playerDao" />
    </bean>
</beans>

至此就完成了所需对象的创建工作,可以调用对象实现对数据库的操作了。

通过测试代码实现对数据库进行增删改查

1.创建测试类,获取Service对象,通过service调用dao完成数据库的访问

image.png

2.具体代码如下,分别运行四个测试方法即可完成对数据库的增删改查

package com.bupt;
​
import com.bupt.domain.Player;
import com.bupt.service.PlayerService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
import java.util.List;
​
public class MyTest {
​
    //测试插入数据功能
    @Test
    public void testServiceInsert(){
​
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //获取spring容器中的dao对象
        PlayerService service = (PlayerService) ctx.getBean("playerService");
        Player player  = new Player("里奥.梅西",21,"前锋",10);
        int nums = service.addPlayer(player);
        //spring和mybatis整合在一起使用,事务是自动提交的。 无需执行SqlSession.commit();
        System.out.println("nums="+nums);
    }
​
    //测试查询功能
    @Test
    public void testServiceSelect(){
​
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //获取spring容器中的dao对象
        PlayerService service = (PlayerService) ctx.getBean("playerService");
        List<Player> players = service.queryPlayers();
        for (Player player:players){
            System.out.println(player);
        }
    }
​
    //测试更新数据功能
    @Test
    public void testServiceUpdate(){
​
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //获取spring容器中的dao对象
        PlayerService service = (PlayerService) ctx.getBean("playerService");
        Player player  = new Player("约翰.特里",30,"中卫",26);
        int nums = service.upPlayer(player);
        System.out.println("nums="+nums);
    }
​
    //测试删除数据功能
    @Test
    public void testServiceDelete(){
​
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //获取spring容器中的dao对象
        PlayerService service = (PlayerService) ctx.getBean("playerService");
        int num = 10;
        int nums = service.delPlayer(num);
        System.out.println("nums="+nums);
    }
}