zoukankan      html  css  js  c++  java
  • Java -- Spring学习笔记6、Spring集成MyBatis

    1、Spring集成MyBatis

    在使用MyBatis开发时、创建SqlSessionFactory对象需要自己手动创建、也就是使用SqlSessionFactoryBuilder.build()、而在spring框架中、对象统一交由容器管理、所以、spring集成mybatis主要解决的问题就是将SqlSessionFactory对象交由Spring来管理。只需要将SqlSessionFactory的对象生成器 SqlSessionFactoryBean注册在Spring容器中,再将其注入给Dao的实现类即可完成整合。

    实现Spring与MyBatis的整合常用的方式:扫描的Mapper动态代理。

    2、具体实现步骤

    • 添加maven依赖和插件、如下:
    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.5.RELEASE</version>
        </dependency>
        <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>
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.1</version>
        </dependency>
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.1</version>
        </dependency>
        <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>
        <resources>
          <resource>
            <directory>src/main/java</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
    • 创建实体类、如下:
    public class UserInfo
    {
        private int id;
        private String name;
        private int age;
        //getter setter toString()...
    }
    
    • 在dao层创建接口、如下:
    public interface UserInfoDao
    {
        int insertUser(UserInfo userInfo);
    
        int updateUser(UserInfo userInfo);
    
        int deleteUser(int id);
    
        UserInfo selectUser(int id);
    
        List<UserInfo> selectUserAll();
    }
    
    • 创建对应的mapper文件、如下:
    <mapper namespace="com.rg.dao.UserInfoDao">
        <insert id="insertUser" parameterType="UserInfo">
            insert into UserInfo(Age,Name) values(#{name},#{age})
        </insert>
        <update id="updateUser" parameterType="UserInfo">
            update UserInfo set Name=#{name},Age=#{age} where id=#{id}
        </update>
        <delete id="deleteUser" parameterType="int">
            delete from UserInfo where id=#{id}
        </delete>
        <select id="selectUser" resultType="UserInfo" parameterType="int">
            select Name,Age from UserInfo where id=#{id}
        </select>
        <select id="selectUserAll" resultType="UserInfo">
            select Name,Age from UserInfo
        </select>
    </mapper>
    
    • 在service层创建接口、如下:
    public interface UserInfoService
    {
        int addUser(UserInfo userInfo);
    
        int modifyUser(UserInfo userInfo);
    
        int deleteUser(int id);
    
        UserInfo selectUser(int id);
    
        List<UserInfo> selectUserAll();
    }
    
    • 实现类如下:
    public class UserInfoServiceImpl implements UserInfoService
    {
        private UserInfoDao userInfoDao;
    
        public void setUserInfoDao(UserInfoDao userInfoDao)
        {
            this.userInfoDao = userInfoDao;
        }
    
        @Override
        public int addUser(UserInfo userInfo)
        {
            return userInfoDao.insertUser(userInfo);
        }
    
        @Override
        public int modifyUser(UserInfo userInfo)
        {
            return userInfoDao.updateUser(userInfo);
        }
    
        @Override
        public int deleteUser(int id)
        {
            return userInfoDao.deleteUser(id);
        }
    
        @Override
        public UserInfo selectUser(int id)
        {
            return userInfoDao.selectUser(id);
        }
    
        @Override
        public List<UserInfo> selectUserAll()
        {
            return userInfoDao.selectUserAll();
        }
    }
    

    在resources目录下创建三个文件夹、里边存放properties文件、mybatis.xml、applicationContext.xml(spring配置文件)

    • jdbc文件夹下的属性文件存放数据库信息:
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/StudentManage?characterEncoding=utf-8&useSSL=false
    jdbc.username=root
    jdbc.password=root
    
    • mybatis文件夹下的mybatis配置文件、如下:
    <configuration>
        <settings>
            <!--设置mybatis输出日志-->
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
        <typeAliases>
            <package name="com.rg.entity"/>
        </typeAliases>
        <!--SQL映射文件的位置-->
        <mappers>
            <package name="com.rg.dao"/>
        </mappers>
    </configuration>
    

    需注意、主配置文件中不再需要数据源的配置了。因为数据源要交给Spring容器来管理了

    • spring文件夹下的applicationContext.xml配置文件、如下:
    <!--
            Druid:阿里的开源数据库连接池、这里不需要driver、可以根据url检测出驱动
            每个属性值都从属性文件中读取、这里需要注意:name的值最好不要和属性文件中key的值相同、如果相同可能会出现错误
        -->
        <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
        <!--
            Spring若想要读取配置文,其必须在配置文件中进行注册。使用<context>标签、如下:
        -->
        <context:property-placeholder location="classpath:jdbc/jdbc.properties"/>
    
        <!--
             注册SqlSessionFactoryBean
             在使用mybatis创建sqlSessionFactory对象时候、也是需要读取mybatis.xml文件和文件中的数据源
             而在spring中、这里bean标签里有两个property、里边的值就是数据源和mybatis.xml文件
        -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="myDataSource"/>
            <property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
        </bean>
    
        <!--
            Mapper扫描配置器MapperScannerConfigurer:会自动生成指定的基本包中mapper的代
            理对象。该Bean无需设置id属性。basePackage使用分号或逗号设置多个包。
    
            在mybatis框架中、创建代理对象、需要通过sqlSessionFactory获取SqlSession,然后调用getMapper()
            该方法的参数为指定Dao接口类的class值。
    
            这里bean标签里也有两个property、里边的内容分别是sqlSessionFactory和Dao接口中所有类
            只不过、获取代理对象交由spring来做
        -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <property name="basePackage" value="com.rg.dao"/>
        </bean>
        <!-- 
            这里的ref="userInfoDao"中的userInfoDao就是上方Mapper扫描配置器扫描完成后、spring创建的代理对象。
            由于通过Mapper扫描配置器MapperScannerConfigurer生成的Mapper代理对象没有名称。
            所以在向Service注入Mapper代理时,无法通过名称注入。
            但可通过接口的简单类名注入,因为生成的是这个 Dao 接口的对象
         -->
        <bean id="userInfoService" class="com.rg.service.impl.UserInfoServiceImpl">
            <property name="userInfoDao" ref="userInfoDao"/>
        </bean>
    
    • 测试方法:
    @Test
        public void test01()
        {
            String config = "spring/applicationContext.xml";
            ApplicationContext atx = new ClassPathXmlApplicationContext(config);
            UserInfoService userInfoService = (UserInfoService) atx.getBean("userInfoService");
            List<UserInfo> userInfoList = userInfoService.selectUserAll();
            System.out.println(userInfoList);
        }
    

    概括来讲、使用spring集成mybatis就是在原先使用mybatis框架时候、需要在Java代码里创建的对象、统一交由spring来完成,内部原理还是一样的。比如、创建数据源、从属性文件中读取数据、创建sqlSessionFactory对象、要使用到数据源和mybatis.xml文件等等。

  • 相关阅读:
    原创:vsphere概念深入系列二:vSphere交换机命令行查看排错
    原创:vsphere概念深入系列一:关于vsphere虚拟交换机的端口的数量限制。
    SQL Server 2012安装step by step
    iCloud无法导入vCard问题。fix the error when import vcard/vcf to icloud.
    微软补丁安装工具wusa报错。
    windows server 2012 浏览器IE10无法下载。
    VMware vSphere ESX* 5.x iSCSI Boot with VLAN Support: Guide
    How to configure ESXi to boot via Software iSCSI?
    光纤通道
    不错的介绍:存储基础知识。
  • 原文地址:https://www.cnblogs.com/dcy521/p/14771175.html
Copyright © 2011-2022 走看看