• Spring 14: Spring + MyBatis初步整合开发


    SM整合步骤

    预期项目结构

    image

    新建数据库和数据表

    • springuser.sql脚本如下
    create database ssm;
    
    use ssm;
    
    create table users(
      userid int primary key,
      uname varchar(20),
      upass varchar(20)
    );
    
    create table accounts(
     aid  int primary key,
     aname varchar(20),
     acontent varchar(50)
    );
    

    新建项目

    • 新建maven项目
    • 选择quickstart模板
    • 修改项目目录,删除自动生成的类和对应测试类

    修改pom.xml文件

    • 添加相关依赖
    
    
    <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.0modelVersion>
    
      <groupId>com.examplegroupId>
      <artifactId>ch09-spring-smartifactId>
      <version>1.0.0version>
    
      <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
      properties>
    
      <dependencies>
        
        <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.13.2version>
          <scope>testscope>
        dependency>
    
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-contextartifactId>
          <version>5.3.22version>
        dependency>
    
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-aspectsartifactId>
          <version>5.3.22version>
        dependency>
    
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-txartifactId>
          <version>5.3.22version>
        dependency>
    
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-jdbcartifactId>
          <version>5.3.22version>
        dependency>
    
        
        <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatisartifactId>
          <version>3.5.10version>
        dependency>
    
        
        <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>8.0.30version>
        dependency>
    
        
        <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatis-springartifactId>
          <version>2.0.7version>
        dependency>
    
        
        <dependency>
          <groupId>com.alibabagroupId>
          <artifactId>druidartifactId>
          <version>1.2.11version>
        dependency>
      dependencies>
    
      <build>
        
        <resources>
          <resource>
            <directory>src/main/javadirectory>
            <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
            includes>
            <filtering>falsefiltering>
          resource>
          <resource>
            <directory>src/main/resourcesdirectory>
            <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
            includes>
            <filtering>falsefiltering>
          resource>
        resources>
      build>
    project>
    

    添加模板文件

    分别添加MyBatis相应配置文件的模板(SqlMapConfig.xml和XXXXMapper.xml文件,方便以后使用)

    • 如何添加模板文件

    image

    • SqlMapConfig.xml模板配置文件
     configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <properties resource="db.properties">properties>
        
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        settings>
        
        <typeAliases>
            <package name="com.example.pojo">package>
        typeAliases>
        
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url"
                              value="jdbc:mysql://ip:port/dataBaseName?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
                    <property name="username" value="userName"/>
                    <property name="password" value="passWord"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <package name="">package>
        mappers>
    configuration>
    
    • XXXXMapper.xml模板配置文件
     mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="">
    
    mapper>
    

    jdbc.properties

    • 添加jdbc.properties文件至src/main/resources目录下
    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://自己的服务器ip或localhost:3306/要连接的数据库名称?useUnicode=true&characterEncoding=utf8
    jdbc.username=XXXX
    jdbc.password=YYYY
    

    SqlMapConfig.xml

    • 添加SqlMapConfig.xml文件至src/main/resources目录下:选择我们自己添加的模板文件(该状态下idea无法电脑截图,手机拍摄,包涵包涵)

    image

    Spring核心配置文件

    • 由于分层开发,需要添加两个配置文件:applicationContext_mapper.xml和applicationContext_service.xml。添加操作见下

    image

    • applicationContext_mapper.xml
    
    <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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        
        <context:property-placeholder location="jdbc.properties"/>
    
        
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        bean>
    
        
        <bean class="org.mybatis.spring.SqlSessionFactoryBean">
            
            <property name="dataSource" ref="dataSource"/>
            
            <property name="configLocation" value="SqlMapConfig.xml"/>
            
            <property name="typeAliasesPackage" value="com.example.pojo"/>
        bean>
    
        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.example.mapper"/>
        bean>
    beans>
    
    • applicationContext_service.xml
    
    <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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        
        <import resource="applicationContext_mapper.xml"/>
    
        
        <context:component-scan base-package="com.example.service.impl"/>
    
        
        
    beans>
    

    添加实体类

    • 依据users数据表的字段,创建User实体类
    package com.example.pojo;
    
    public class User {
        private Integer userid;
        private String uname;
        private String upass;
    
        @Override
        public String toString() {
            return "User{" +
                    "userid=" + userid +
                    ", uname='" + uname + '\'' +
                    ", upass='" + upass + '\'' +
                    '}';
        }
    
        public Integer getUserid() {
            return userid;
        }
    
        public void setUserid(Integer userid) {
            this.userid = userid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public String getUpass() {
            return upass;
        }
    
        public void setUpass(String upass) {
            this.upass = upass;
        }
    
        public User(String uname, String upass) {
            this.uname = uname;
            this.upass = upass;
        }
    
        public User(Integer userid, String uname, String upass) {
            this.userid = userid;
            this.uname = uname;
            this.upass = upass;
        }
    
        public User() {
        }
    }
    

    数据访问层

    • 添加UserMapper接口
    package com.example.mapper;
    
    
    import com.example.pojo.User;
    
    /**
     * 数据访问层的接口
     */
    public interface UserMapper {
        int insert(User user);
    }
    
    • 添加UserMapper.xml,先选择我们自己添加的XXXMapper.xml模板文件,再进一步配置该文件
     mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.mapper.UserMapper">
    
        
        <insert id="insert" parameterType="user">
            insert into users values (#{userid}, #{uname}, #{upass})
        insert>
    mapper>
    

    业务逻辑层

    • 添加UserService接口
    package com.example.service;
    
    import com.example.pojo.User;
    
    /**
     * 业务逻辑层接口
     */
    public interface UserService {
        int insert(User user);
    }
    
    • 添加UserServiceImpl实现类
    package com.example.service.impl;
    
    import com.example.mapper.UserMapper;
    import com.example.pojo.User;
    import com.example.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * 业务实现类
     */
    @Service
    public class UserServiceImpl implements UserService {
        //业务逻辑层实现类持有数据访问层的接口类型的变量
        @Autowired
        UserMapper userMapper;
    
        @Override
        public int insert(User user) {
            return userMapper.insert(user);
        }
    }
    

    测试

    package com.example.test;
    
    import com.example.pojo.User;
    import com.example.service.UserService;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestUserInsert {
    
        //测试用户信息导入
        @Test
        public void testUserInsert(){
            //创建Spring容器并启动
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext_service.xml");
            //获取业务逻辑实现类的对象
            UserService userService = (UserService) ac.getBean("userServiceImpl");
            //调用业务功能
            int num = userService.insert(new User(1, "王小涵", "hanzhanghan"));
            if(num == 1){
                System.out.println("用户信息导入成功!");
            }else{
                System.out.println("用户信息导入失败!");
            }
        }
    }
    

    测试输出

    • 控制台输出
    Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
    Creating a new SqlSession
    SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@475835b1] was not registered for synchronization because synchronization is not active
    Aug 28, 2022 10:31:31 AM com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
    INFO: {dataSource-1} inited
    JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4d4d8fcf] will not be managed by Spring
    ==>  Preparing: insert into users values (?, ?, ?)
    ==> Parameters: 1(Integer), 王小涵(String), hanzhanghan(String)
    <==    Updates: 1
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@475835b1]
    用户信息导入成功!
    
    Process finished with exit code 0
    
    • 数据表变化

    image

  • 相关阅读:
    打开 Chrome 的 「内存节省程序」开关和关闭硬件加速
    计算机毕业设计Java花田音乐网站(源码+系统+mysql数据库+lw文档)
    会声会影2024有哪些新功能?好不好用
    C++友元函数
    【Powershell 】(Windows下)常用命令 | 命令别名 | 运行Windows命令行工具 | 运行用户程序(vim、gcc、gdb)
    cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法
    HTML Component Library for Delphi
    cookie、session、token的关系及测试
    6.SSM-SpringBoot
    fastjson 1.2.80 漏洞浅析及利用payload
  • 原文地址:https://www.cnblogs.com/nefu-wangxun/p/16632510.html