Java Spring整合Mybatis

Spring整合mybatis

文档: MyBatis-Spring文档地址

在这里插入图片描述

pom.xml //pom依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lyh</groupId>
    <artifactId>MySpringTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MySpringTest</name>
    <description>MySpringTest</description>
    <properties>
        <java.version>11</java.version>
    </properties>


    <dependencies>

        <!-- spring 相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <!--   aspectJ AOP 织入器     -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!--        mybatis-spring整合包 【重点】-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>

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

    </dependencies>

    <!--  配置Maven静态资源过滤  -->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>


</project>

dao 数据访问层

UserMapper //接口

package com.lyh.dao;

import com.lyh.domain.UserTrue;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional(propagation = Propagation.REQUIRED)
public interface UserMapper {

    // 查询所有用户
    public List<UserTrue> findAllUser();

    //添加用户
    public boolean addUser(UserTrue userTrue);

    //根据id删除用户
    public boolean deleteUser(int id);

}

UserMapperImpl 实现类

package com.lyh.dao;

import com.lyh.domain.UserTrue;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;


import java.util.List;

@Transactional(propagation = Propagation.REQUIRED)
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {

    @Override
    public List<UserTrue> findAllUser() {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        return mapper.findAllUser();
    }

    //    新增
    @Override
    public boolean addUser(UserTrue userTrue) {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        return mapper.addUser(userTrue);
    }

    //删除
    @Override
    public boolean deleteUser(int id) {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
//        int i = 1 / 0;
        return mapper.deleteUser(id);
    }
}

domain 实体类

Hello //测试Set注入

package com.lyh.domain;

public class Hello {
    //测试Set注入方式  属性注入
    private String name;

    public String getName() {
        return name;
    }

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

    public void show() {
        System.out.println("Hello" + name);
    }
}

User // 测试构造注入

package com.lyh.domain;

public class User {
//    测试构造注入

    private String name;
    private String gender;
    private Integer age;

    public User() {
    }

    public User(String name, String gender, Integer age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

Person //测试Qualifier和Autowired 自动装配

package com.lyh.domain;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Person {

    //Qualifier 存在多个bean时,不能自动装配,根据Qualifier byName自动装配
    @Autowired
    @Qualifier("user1")
    private User user;

    private String name;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getName() {
        return name;
    }

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

Student // @Value属性注入

package com.lyh.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("student")
// 相当于配置文件中 <bean id="student" class="当前注解的类"/>
public class Student {

    public String name = "StudentA";

    //    属性注入
    @Value("22")
    // 相当于配置文件中 <property name="age" value="22"/>
    public int age;

    public String gender;

    //如果提供了set方法,在set方法上添加@value("值");
    @Value("male")
    public void setGender(String gender) {
        this.gender = gender;
    }
}

UserTrue //纯实体类

package com.lyh.domain;

public class UserTrue {

    private int id;
    private String name;
    private String pwd;

    public UserTrue() {
    }

    public UserTrue(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "UserTrue{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

resource层

mybatisconfig.xml // spring配置后不需要mybatis配置文件

<?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>

    <typeAliases>
        <package name="com.lyh.domain"/>
    </typeAliases>

    <!--注册spring后 不再需要mybatisConfig连接-->
    <!--    <environments default="development">-->
    <!--        <environment id="development">-->
    <!--            <transactionManager type="JDBC"/>-->
    <!--            <dataSource type="POOLED">-->
    <!--                <property name="driver" value="com.mysql.jdbc.Driver"/>-->
    <!--                <property name="url" value="jdbc:mysql://localhost:3306/hadoop?serverTimezone=UTC"/>-->
    <!--                <property name="username" value="root"/>-->
    <!--                <property name="password" value="123456"/>-->
    <!--            </dataSource>-->
    <!--        </environment>-->
    <!--    </environments>-->


    <!--    <mappers>-->
    <!--        <mapper resource="UserMapper.xml"/>-->
    <!--        <package name="com.lyh.dao"/>-->
    <!--    </mappers>-->


</configuration>

springconfig.xml //spring配置文件

<?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"

       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd"

>

    <!-- 开启注解 -->
    <context:annotation-config/>
    <!--指定注解扫描包-->
    <context:component-scan base-package="com.lyh.domain"/>

    <!--bean就是java对象 , 由Spring创建和管理-->
    <!-- 一、 Set注入方式  需要Set方法  属性注入  -->
    <bean id="helloTest" class="com.lyh.domain.Hello">
        <property name="name" value="Spring"/>
    </bean>


    <!--  二、构造器注入方式  需要toString方法  -->
    <bean id="user1" class="com.lyh.domain.User">
        <constructor-arg value="Jam" index="0"/>
        <constructor-arg value="male" index="1"/>
        <constructor-arg value="22" index="2"/>
    </bean>

    <bean id="user2" class="com.lyh.domain.User">
        <constructor-arg index="0">
            <value><![CDATA[-kevin-]]></value>
        </constructor-arg>
        <constructor-arg value="male" index="1"/>
        <constructor-arg value="22" index="2"/>
    </bean>

    <!--    注解@Autowired自动转配-->
    <bean id="person1" class="com.lyh.domain.Person"/>


    <!-- mybaits-spring -->

    <!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/hadoop?serverTimezone=UTC&amp;useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--关联Mybatis-->
        <property name="configLocation" value="classpath:mybatisconfig.xml"/>
        <property name="mapperLocations" value="classpath*:*Mapper.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>


    <!--    事务相关   -->

    <!--基于注解的事务配置-->
    <bean id="userDao" class="com.lyh.dao.UserMapperImpl">
        <!--        配置事务声明-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>


    <!-- 定义事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="txManager"/>

    <!--基于XML的事务配置-->

    <!-- JDBC事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>

    </bean>

    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">

        <tx:attributes>
            <!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
            <tx:method name="addUser" propagation="REQUIRED"/>
            <tx:method name="deleteUser" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="search*" propagation="REQUIRED"/>
            <tx:method name="get" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--配置aop织入事务-->
    <aop:config>
        <aop:pointcut id="txPointcut" expression="execution(* com.lyh.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>


</beans>

UserMapper //接口映射

<?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.lyh.dao.UserMapper">

    <select id="findAllUser" resultType="com.lyh.domain.UserTrue">
        select *
        from hadoop.user;
    </select>


    <insert id="addUser" parameterType="com.lyh.domain.UserTrue">
        insert into hadoop.user
        values (#{id}, #{name}, #{pwd});
    </insert>

    <delete id="deleteUser" parameterType="int">
        # 测试事务原子性
        delete
        from hadoop.user
        where id =
              #{id};
    </delete>

</mapper>

test //单元测试

package com.lyh.myspringtest;

import com.lyh.dao.UserMapper;
import com.lyh.domain.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class test {

    //    测试Spring
    @Test
    public void springTest() {
        ApplicationContext Context = new ClassPathXmlApplicationContext("springconfig.xml");

        System.out.println("========================================");
        System.out.println("Set注入:");
        Hello helloTest = (Hello) Context.getBean("helloTest");
        helloTest.show();

        System.out.println("========================================");
        System.out.println("构造注入:constructor-arg");

        User user1 = (User) Context.getBean("user1");
        String s = user1.toString();
        System.out.println(s);

        User user2 = (User) Context.getBean("user1");
        String s2 = user1.toString();
        System.out.println(s2);

        System.out.println("========================================");
        System.out.println("使用注解注入:@Autowired");
        Person person1 = (Person) Context.getBean("person1");

        User user = person1.getUser();
        System.out.println(user.toString());

        System.out.println("========================================");
        System.out.println("使用注解开发:Component  Value");

        Student student = (Student) Context.getBean("student");
        System.out.println(student.name + " age: " + student.age + " gender: " + student.gender);


    }

    //    测试mybatis
    @Test
    public void mybatisTest() {

        SqlSessionFactory sqlSessionFactory;

        String resource = "mybatisconfig.xml";

        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<UserTrue> allUser = mapper.findAllUser();

            for (UserTrue user : allUser
            ) {
                System.out.println(user.getId() + " " + user.getName() + " " + user.getPwd());
            }

            sqlSession.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //    测试查询
    @Test
    public void mybatis_springTest() {
        ApplicationContext context = new ClassPathXmlApplicationContext("springconfig.xml");
        UserMapper mapper = (UserMapper) context.getBean("userDao");
        List<UserTrue> user = mapper.findAllUser();
        for (UserTrue u : user) {
            System.out.println(u.getId() + u.getName() + u.getPwd());
        }
    }

    //    测试事务
    @Test
    @Transactional(propagation = Propagation.REQUIRED)
    public void mybatis_tx() {
        ApplicationContext context = new ClassPathXmlApplicationContext("springconfig.xml");
        UserMapper mapper = (UserMapper) context.getBean("userDao");


        boolean i = mapper.addUser(new UserTrue(6, "tx", "txtxtx"));
        System.out.println("i" + i);
        boolean i1 = mapper.deleteUser(6);
        System.out.println("i1" + i1);


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值