Java--Spring和MyBatis集成

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--Spring和MyBatis集成相关的知识,希望对你有一定的参考价值。

Spring集成Mybatis主要使用的spring的IOC技术

创建项目步骤:

1、新建普通的maven项目

 2、加入maven的依赖

(1)spring依赖

(2)mybatis依赖

(3)mysql驱动

(4)spring的事务依赖

(5)mybatis和spring集成依赖

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

        <!-- spring和mybatis集成依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.1</version>
        </dependency>

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

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

    </dependencies>

3、创建实体类(使用mysql数据库建一张User用户表)

4、创建dao接口和mapper文件

UserDao.java

public interface UserDao 
    /**
     * 插入一条user记录
     * @param user
     * @return
     */
    int insertUser(User user);

    /**
     * 查询所有用户
     * @param user
     * @return
     */
    List<User> selectUsers(User user);

UserDao.xml

<?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.mycompany.dao.UserDao">

    <insert id="insertUser">
        insert into user values(#userId,#userName,#email,#age)
    </insert>

    <select id="selectUsers" resultType="User">
        select user_id,user_name,email,age
        from user
        order by user_id desc
  </select>
</mapper>

5、创建mybatis主配置文件  mybatis-config.xml

(1)主配置文件中不再需要数据源的配置了;数据源要交给 Spring 容器管理

(2) mapper 映射文件的注册,使用<package/>标签,即只需给出 mapper 映射文件所在的包即可

<?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>
        <!-- 第一种方式
            指定一个类型为一个自定义别名
            type:自定义类型的全限定名称
            alias:别名
         -->
<!--        <typeAlias type="com.mycompany.domain.User" alias="user" />-->

        <!-- 第二种方式
             <package>
             name:包名,这个包中所有的类,类名就是别名(不区分大小写)
         -->
        <package name="com.mycompany.domain" />
    </typeAliases>


    <!--
        数据源DataSource 放在spring配置文件中
    -->
    <!--<environments default="development">
        <environment id="online">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
                <property name="username" value="root"/>
                <property name="password" value="admin123456"/>
            </dataSource>
        </environment>
    </environments>-->


    <!-- sql mapper(SQL映射文件)的位置 -->
    <mappers>
        <!-- 第一种方式:指定多个mapper文件
            一个mapper标签指定一个文件位置
                从类路径开始(target/classes)
        -->
<!--        <mapper resource="com/mycompany/dao/UserDao.xml" />-->

        <!-- 第二种方式:使用包名
            name:xml(mapper)文件所在的包名,这个包中所有xml文件一次都能加载给mybatis
            使用package要求:
            (1)mapper文件名称需要和接口名称一样(区分大小写)
            (2)mapper文件和dao接口需要在同一目录
        -->
        <package name="com.mycompany.dao" />

    </mappers>

</configuration>

6、创建service接口和实现类,属性是dao

public interface UserService 
    //插入一条user记录
    int insertUser(User user);

    //查询所有用户
    List<User> selectUsers(User user);



public class UserServiceImpl implements UserService 

    private UserDao userDao;

    public void setUserDao(UserDao userDao) 
        this.userDao = userDao;
    

    @Override
    public int insertUser(User user) 
        int nums = userDao.insertUser(user);
        return nums;
    

    @Override
    public List<User> selectUsers(User user) 
        List<User> userList = userDao.selectUsers(user);
        return userList;
    

7、创建spring的配置文件:声明mybatis对象交给spring创建  

(1)数据源DataSource

这里使用阿里的Druid数据库连接池

Druid官网:https://github.com/alibaba/druid

DruidDataSource配置:

https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE

其中Druid通用配置示例:

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <property name="url" value="$jdbc_url" />
     <property name="username" value="$jdbc_user" />
     <property name="password" value="$jdbc_password" />

     <property name="filters" value="stat" />

     <property name="maxActive" value="20" />
     <property name="initialSize" value="1" />
     <property name="maxWait" value="6000" />
     <property name="minIdle" value="1" />

     <property name="timeBetweenEvictionRunsMillis" value="60000" />
     <property name="minEvictableIdleTimeMillis" value="300000" />

     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />

     <property name="poolPreparedStatements" value="true" />
     <property name="maxOpenPreparedStatements" value="20" />

     <property name="asyncInit" value="true" />
 </bean>

在上面的配置中,通常你需要配置url、username、password,maxActive这三项。

Druid会自动跟url识别驱动类名,如果连接的数据库非常见数据库,配置属性driverClassName 

<!--
        spring加载数据库的属性配置文件
    -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!--1、声明数据源DataSource,作用:连接数据库
        将mybatis主配置文件 configuration 下的environments 标签内容移到了这里
        Druid官网:https://github.com/alibaba/druid
        DruidDataSource配置:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE
     -->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
            init-method="init" destroy-method="close">
        <!-- set注入给DruidDataSource提供数据库连接信息 -->
        <!-- 使用属性配置文件中的数据,语法 $key -->
        <property name="url" value="$jdbc.url" />
        <property name="username" value="$jdbc.user" />
        <property name="password" value="$jdbc.password" />
        <property name="maxActive" value="$jdbc.maxActive" />
    </bean>

(2)SqlSessionFactory

<!--2、声明mybatis中提供的SqlSessionFactoryBean类 -->
    <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-config.xml" />
    </bean>

(3)Dao对象

Mapper 扫描配置器 MapperScannerConfigurer 会自动生成指定的基本包中 mapper 的代理对象。该 Bean 无需设置 id 属性。basePackage 使用分号或逗号设置多个包

<!--3、创建dao对象,使用SqlSession的getMapper(xxDao.class)
        MapperScannerConfigurer:内部调用getMapper()方法生成每个dao接口的代理对象
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定SqlSession对象的id -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

        <!-- 指定包名,dao接口所在的包名
            MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次getMapper()方法,
            得到每个接口的dao对象
            创建好的dao对象放入到spring容器中;dao对象的默认名称是 接口名首字母小写!!!
        -->
        <property name="basePackage" value="com.mycompany.dao" />
    </bean>

(4)声明自定义的service

<!--4、声明service -->
    <bean id="userService" class="com.mycompany.service.impl.UserServiceImpl">
        <!-- 通过MapperScannerConfigurer 扫描包;dao对象的默认名称是 接口名首字母小写!!! -->
        <property name="userDao" ref="userDao" />
    </bean>

jdbc.properties;数据库属性配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.user=root
jdbc.password=123456
jdbc.maxActive=20

applicationContext.xml

<?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加载数据库的属性配置文件
    -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!--1、声明数据源DataSource,作用:连接数据库
        将mybatis主配置文件 configuration 下的environments 标签内容移到了这里
        Druid官网:https://github.com/alibaba/druid
        DruidDataSource配置:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE
     -->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
            init-method="init" destroy-method="close">
        <!-- set注入给DruidDataSource提供数据库连接信息 -->
        <!-- 使用属性配置文件中的数据,语法 $key -->
        <property name="url" value="$jdbc.url" />
        <property name="username" value="$jdbc.user" />
        <property name="password" value="$jdbc.password" />
        <property name="maxActive" value="$jdbc.maxActive" />
    </bean>

    <!--2、声明mybatis中提供的SqlSessionFactoryBean类 -->
    <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-config.xml" />
    </bean>

    <!--3、创建dao对象,使用SqlSession的getMapper(xxDao.class)
        MapperScannerConfigurer:内部调用getMapper()方法生成每个dao接口的代理对象
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定SqlSession对象的id -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

        <!-- 指定包名,dao接口所在的包名
            MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次getMapper()方法,
            得到每个接口的dao对象
            创建好的dao对象放入到spring容器中;dao对象的默认名称是 接口名首字母小写!!!
        -->
        <property name="basePackage" value="com.mycompany.dao" />
    </bean>

    <!--4、声明service -->
    <bean id="userService" class="com.mycompany.service.impl.UserServiceImpl">
        <!-- 通过MapperScannerConfigurer 扫描包;dao对象的默认名称是 接口名首字母小写!!! -->
        <property name="userDao" ref="userDao" />
    </bean>

</beans>

8、创建测试类

public class TestSpringMybatis 
    @Test
    public void testSpringMybatis()
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //获取容器中所有对象名
        String names[] = ac.getBeanDefinitionNames();
        for (String name:names)
            System.out.println("容器中对象名称:" + name + "    " + ac.getBean(name));
        
    

    @Test
    public void testDaoInsertUser()
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //获取容器中的Dao对象
        UserDao userDao = (UserDao) ac.getBean("userDao");

        User user = new User();
        user.setUserName("admin11");
        user.setEmail("admin@123.com");
        user.setAge(16);

        //spring和mybatis整合在一起使用,事务是自动提交的。 无需执行SqlSession.commit();
        int nums = userDao.insertUser(user);
        System.out.println("nums=" + nums);
    


    @Test
    public void testServiceInsertUser()
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //获取容器中的Dao对象
        UserService userService = (UserService) ac.getBean("userService");

        User user = new User();
        user.setUserName("admin22");
        user.setEmail("admin21332@123.com");
        user.setAge(28);
        int nums = userService.insertUser(user);
        System.out.println("nums=" + nums);
    

    @Test
    public void testSelect()
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //获取容器中的Dao对象
        UserService userService = (UserService) ac.getBean("userService");

        List<User> userList = userService.selectUsers(null);
        for (User user:userList)
            System.out.println("user:" + user);
        
    

容器中输出对象

以上是关于Java--Spring和MyBatis集成的主要内容,如果未能解决你的问题,请参考以下文章

推荐学java——Spring集成MyBatis

推荐学java——Spring集成MyBatis

推荐学java——Spring集成MyBatis

推荐学java——Spring集成MyBatis

Java--Spring应用在Web项目

spring 集成 mybatis 和 redis 的配置文件