Mybatis&Spring入门实例(IDEA)

Mybatis入门实例(集成spring)

参考 “山丘i” 博文 —— spring集成mybatis

结果

首先po一下文件目录和结果

文件目录:

image

单元测试结果:

image

数据库结果:

image

接下来我们来复盘一下整个mybatis构建过程

Mybatis构建主要流程

  1. 建立数据库及新表
  2. maven配置pom.xml
  3. 创建实体类
  4. 创建dao接口
  5. 定义映射文件mapper
  6. 创建mybatis主配置文件
  7. 创建Service接口和实现类,属性为dao
  8. 创建spring的配置文件
  9. 创建测试类

1. 建立数据库及新表

image

2. maven依赖pom.xml

主要包含以下内容

  • build构建(为了能够扫描到并构建dao的xml配置文件)
  • spring依赖
  • mybatis依赖
  • mysql驱动
  • spring的事务依赖
  • mybatis和spring集成的依赖
<?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>AlphaManagement</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

    <dependencies>
        <!-- Junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- MyBatis核心Jar包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

        <!-- MySql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!-- Lombok工具 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>




        <!-- Spring核心 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.3</version>
        </dependency>

        <!-- Spring-test测试 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.3</version>
            <scope>test</scope>
        </dependency>

        <!-- slf4j日志包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>


        <!-- druid阿里的数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>


        <!-- Spring整合ORM -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.3</version>
        </dependency>

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

    </dependencies>

</project>

3. 创建实体类

package entity;

public class Student {
    // 属性名和列名一样
    private Integer id;
    private String name;
    private String email;
    private Integer age;
    
    public Student() {
    }

    public Student(Integer id, String name, String email, Integer age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

4. 创建dao接口

package dao;

import entity.Student;

import java.util.List;

public interface StudentDao {
    int insertStudent(Student student);

    List<Student> selectStudents();
}

5. 定义映射文件mapper

mapper文件和dao在同一目录下,同等级,名称和dao接口的一样为StudentDao.xml

mapper中的namespace取值为Dao接口的全限定性名

<?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="dao.StudentDao">

    <insert id="insertStudent">
        insert into student values(#{id},#{name},#{email},#{age})
    </insert>

    <select id="selectStudents" resultType="entity.Student">
        select id,name,email,age from student
    </select>

</mapper>

6. 创建mybatis主配置文件

在src/main/resources下创建mybatis的主配置文件,命名为mybatis.xml

Attention:

  • 主配置文件中无需数据源的配置,数据源交给spring容器来管理了
  • 这里对mapper映射文件注册使用了标签,只需给出xml文件的包,优点是若有多个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全局行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--设置别名-->
    <typeAliases>
        <!--
			package:把包下面的所有类名作为别名
			name:实体类所在的包名-->
        <package name="entity"/>
    </typeAliases>

    <!-- sql映射文件的位置 -->
    <mappers>
        <!--name是包名,这个包中所有mapper.xml一次加载-->
        <package name="dao"/>
<!--        <mapper resource="xml文件的全限定名称"/>-->
    </mappers>
</configuration>

7. 创建Service接口和实现类

Service接口

package service;

import entity.Student;

import java.util.List;

public interface StudentService {
    int addStudent(Student student);
    List<Student> queryStudent();
}

实现类

package service.impl;

import dao.StudentDao;
import entity.Student;
import service.StudentService;

import java.util.List;

public class StudentServiceImpl implements StudentService {
    private StudentDao studentDao;

    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public int addStudent(Student student) {
        return studentDao.insertStudent(student);
    }

    @Override
    public List<Student> queryStudent() {
        return studentDao.selectStudents();
    }
}

8. 创建spring配置文件

在src/main/resources下定义Spring的主要配置文件applicationContext.xml

声明mybatis的对象交给spring创建

1. 数据源DataSource

使用JDBC模板,首先需要配置好数据源,数据源直接以Bean的形式配置在Spring配置文件中。根据数据源的不同,其配置方式不同

这里使用的Druid,Druid 是阿里的开源数据库连接池。是 Java 语言中最好的数据库连接池。Druid 能够提供强大的监控和扩展功能

Druid的github仓库:Druid

在spring配置文件中

<!--引用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注入提供连接数据库信息-->
<!--<property name="url" value="jdbc:mysql://localhost:3306/ssm" />-->
<!--<property name="username" value="root" />-->
<!--<property name="password" value="123456" />-->
<!--<property name="maxActive" value="20" />-->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="${jdbc.maxActive}" />

</bean>

为了方便维护,在resources下创建属性文件jdbc.properties

jdbc.url=jdbc:mysql://localhost:3306/alphalab
jdbc.username=root
jdbc.password=123456
jdbc.maxActive=20

2. 注册sqlSessionFactoryBean

<!--SqlSessionFactory-->
<!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory-->
<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>

3. 定义Mapper扫描配置器MapperScannerConfigurer

即创建dao对象

<!--创建 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="dao"/>
<!--多个包-->
<!--<property name="basePackage" value="com.md.dao,com.md.dao2"/>-->
</bean>

4. 向Service注入接口名

<!--上面的这个是一个模板,只有最后dao对象的这个包名的value的值是根据自己创建写的-->
<!--下面的就是自己定义的service-->
<!--声明service-->
<bean id="studentService" class="service.impl.StudentServiceImpl">
<!--就是上面通过创建的dao对象-->
<property name="studentDao" ref="studentDao"/>
</bean>

整体配置文件如下

<?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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.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注入提供连接数据库信息-->
        <!--<property name="url" value="jdbc:mysql://localhost:3306/ssm" />-->
        <!--<property name="username" value="root" />-->
        <!--<property name="password" value="123456" />-->
        <!--<property name="maxActive" value="20" />-->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="${jdbc.maxActive}" />

    </bean>

    <!--SqlSessionFactory-->
    <!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory-->
    <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="dao"/>
        <!--多个包-->
        <!--<property name="basePackage" value="com.md.dao,com.md.dao2"/>-->
    </bean>


    <!--上面的这个是一个模板,只有最后dao对象的这个包名的value的值是根据自己创建写的-->
    <!--下面的就是自己定义的service-->
    <!--声明service-->
    <bean id="studentService" class="service.impl.StudentServiceImpl">
        <!--就是上面通过创建的dao对象-->
        <property name="studentDao" ref="studentDao"/>
    </bean>

</beans>

9. 创建测试类

@Test
public void test01() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    StudentService studentService = (StudentService) context.getBean("studentService");
    studentService.addStudent(new Student(4, "Johnson", "liuhangming246@gmail.com", 21));

    //spring和mybatis整合在一起使用,事务自动提交
    List<Student> studentList = studentService.queryStudent();
    studentList.forEach(student -> System.out.println(student));
}

入门内容如上所示,希望你的程序不要报错=)

posted @ 2022-11-02 15:38  JohnsonLiu  阅读(74)  评论(0)    收藏  举报