zoukankan      html  css  js  c++  java
  • Spring整合MyBatis

    环境搭建

    1、新建Spring项目,添加所需的jar包

    • spring-core.jar
    • spring-beans.jar
    • spring-context.jar
    • spring-expression.jar
    • spring-aop.jar   (使用spring的注解)
    • spring-jdbc.jar  (spring-tx.jar依赖spring-jdbc,如果要使用spring的事务管理,需添加此包。就算不使用spring的事务管理,mybatis-spring.jar依赖此包,也必须添加此包)
    • spring-tx.jar  (事务一般是用spring的事务管理,如果要使用spring的事务管理,需要添加此包)

      (如果要整合AspectJ)

    • spring-aspects.jar
    • aopalliance.jar
    • aspectjweaver.jar
    • mybatis.jar
    • log4j.jar
    • commons-logging.jar
    • mybatis-spring.jar   (这个是spring整合mybatis需要的包,需要自行下载添加,官方提倡使用maven,在github上也只提供源码,jar只能到maven仓库去下载)
    • 数据库驱动
    • dbcp的jar包 (也可以使用其它连接池)

    2、src下新建db.properties

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
    jdbc.username=chy
    jdbc.password=abcd
    jdbc.initialSize=5
    jdbc.maxTotal=30
    jdbc.maxIdle=10

    3、src下新建log4j.properties

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout,D
    
    
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE 
    
    
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    # log4j.appender.stdout.Threshold = ERROR
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    
    
    # File output...
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    #如果是web项目,会输出到tomcat的logs文件夹下的指定文件中
    log4j.appender.D.File = ../logs/error.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = ERROR
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    log4j.appender.D.encoding=UTF-8

    spring默认会读取资源根目录下名为log4j.properties的文件来作为log4j的配置,所以无需在配置中指定log4j的配置文件名。

    4、src下新建mybatis-config.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>
        <!--配置别名-->
        <typeAliases>
            <package name="com.chy.model"/>
        </typeAliases>
    
        <!--指定映射文件的位置-->
        <mappers>
            <package name="com.chy.mapper"/>
        </mappers>
    
    </configuration>

    很多配置,比如数据源、SqlSessionFactory的配置,都放到Spring的配置文件中去了,因为要作为bean由spring容器管理。mybatis本身的配置就减少了很多。

    (5)src下新建spring-config.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"
           xmlns:tx="http://www.springframework.org/schema/tx"
           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">
    
        <!--引入数据库连接信息db.properties-->
        <context:property-placeholder location="db.properties" />
    
        <!--配置dbcp数据源-->
        <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="initialSize" value="${jdbc.initialSize}" />
            <property name="maxTotal" value="${jdbc.maxTotal}" />
            <property name="maxIdle" value="${jdbc.maxIdle}" />
        </bean>
    
        <!--配置MyBatis的SqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--注入数据源-->
            <property name="dataSource" ref="dataSource" />
            <!--指定mybatis配置文件的位置-->
            <property name="configLocation" value="mybatis-config.xml" />
        </bean>
    
        <!--配置事务管理器-->
        <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
        <!--    &lt;!&ndash;注入数据源&ndash;&gt;-->
        <!--    <property name="dataSource" ref="dataSource" />-->
        <!--</bean>-->
    
        <!--开启事务注解,指定要使用的事务管理器-->
        <!--<tx:annotation-driven transaction-manager="transactionManager" />-->
    
    </beans>

    要使用事务的话,将注释去掉。

    (6)新建包com.chy.model,编写实体类

    @Component("user")
    public class User {
        private int id;
        private String username;
        private String password;
        private double money;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public double getMoney() {
            return money;
        }
    
        public void setMoney(double money) {
            this.money = money;
        }
    }

    (7)新建包com.chy.mapper,编写映射文件

    <?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.chy.mapper.UserMapper">
        <select id="queryMoneyById" parameterType="integer" resultType="double">
            select money from user_tb where id=#{id}
        </select>
        <update id="updateMoney" parameterType="map">
            <!--传入map,直接通过key来引用-->
            update user_tb set money=#{money} where id=#{id}
        </update>
    </mapper>

    至此,环境搭建完毕。


    Spring整合MyBatis有2种整合方式:

    • 传统dao方式的整合
    • Mapper接口方式的整合。可细分为2种:基于MapperFactoryBean的整合、基于MapperScannerConfigurer的整合。

    传统dao方式的整合

    (1)新建包com.chy.dao,编写dao层接口、实现类:

    public interface UserDao {
        public Double queryMoneyById(int id);
        public void updateMoney(@Param("id") int id, @Param("money") double money);
    }
    //需继承SqlSessionDaoSupport类,主要是为了继承getSqlSession()方法,获取SqlSession的实例
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
        @Override
        public Double queryMoneyById(int id) {
            //传入映射文件中sql语句的id、实参,this可缺省
            return this.getSqlSession().selectOne("com.chy.mapper.UserMapper.queryMoneyById", id);
        }
    
        @Override
        public void updateMoney(int id, double money) {
            Map<String, Object> map = new HashMap<>(2);
            map.put("id", id);
            map.put("money", money);
            getSqlSession().update("com.chy.mapper.UserMapper.updateMoney",map);
        }
    }

    (2)在spring配置文件中配置实现类

        <!--配置dao层的bean-->
        <bean id="userDao" class="com.chy.dao.UserDaoImpl">
            <!--注入之前配置的SqlSessionFactory实例-->
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean>

    在业务层使用这个bean(dao)来处理业务。

    每个dao层的实现类都要搞这三处,十分麻烦,不推荐。


    基于MapperFactoryBean的整合

    (1)在com.chy.mapper包下,编写映射文件对应的mapper接口

    public interface UserMapper {
        public double queryMoneyById(int id);
        public void updateMoney(@Param("id") int id, @Param("money") double money);
    }

    (2)在spring配置文件中配置mapper

        <!--配置mapper-->
        <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
            <!--指定Mapper接口-->
            <property name="mapperInterface" value="com.chy.mapper.UserMapper" />
            <!--注入之前配置的SqlSessionFactory-->
            <property name="sqlSessionFactory" ref="sqlSessionFactory" />
        </bean>

    把mapper作为dao层,直接在业务层获取这个bean的实例(Mapper接口类型)来操作数据库,可使用mapper接口的方法来操作数据库。

    比起传统dao方式的整合,可以少写一处,但每个mapper都要配置<bean>,还是有点麻烦。


    基于MapperScannerConfigurer的整合(推荐)

    (1)在com.chy.mapper包下,编写映射文件对应的Mapper接口

    (2)在Spring的配置文件中配置mapper代理

        <!--配置mapper代理-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--会自动扫描指定包下的Mapper接口,为其创建映射器。多个包用逗号或分号分隔-->
            <property name="basePackage" value="com.chy.mapper" />
        </bean>

    指定了mapper代理后,无需在mybatis配置文件中指定映射文件的路径。

    只需配置一个<bean>,无需配置每个mapper,省事儿,推荐。


    使用Spring的事务管理

    (1)新建包com.chy.service,事务要加在业务层

    public interface UserService {
        public void transfer(int to, int from, double amount);
    }
    @Service("userService")
    public class UserServiceImpl implements UserService{
    
        private UserMapper userMapper;
    
        //自动装配mapper
        @Autowired
        public void setUserMapper(UserMapper userMapper) {
            this.userMapper = userMapper;
        }
    
        @Override
        @Transactional
        public void transfer(int from, int to, double amount) {
            double fromMoney = userMapper.queryMoneyById(from);
            if (fromMoney-amount>=0){
                double toMoney = userMapper.queryMoneyById(to);
                userMapper.updateMoney(from,fromMoney-amount);
                userMapper.updateMoney(to,toMoney+amount);
            }
        }
    }

    (2)在spring配置文件中配置事务(取消注释)

        <!--配置事务管理器-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--注入数据源-->
            <property name="dataSource" ref="dataSource" />
        </bean>
    
        <!--开启事务注解,指定要使用的事务管理器-->
        <tx:annotation-driven transaction-manager="transactionManager" />

    注意:IDEA自动导入的事务的约束往往不对,需要修改。


    说明

    随着包、注解越来越多,要在spring配置文件中使用包扫描,并注意把新建的包加进去,

    否则可能会出现“NoSuchBeanDefinitionException: No bean named 'xxx' available”的错误。

    基于Mapper接口方式的整合,以mapper包作为dao层,所以命名有一些变化:

    mapper的包命名为dao,XxxMapper命名为XxxDao。

    接口、实现类越来越多,可以把新建一个子包impl,来单独放实现类。

    比如service层,把接口直接放在service下面,在service下新建一个子包impl,来放实现类。

  • 相关阅读:
    VitrualBox无法创建64位虚拟机
    SharePoint2010安装全过程
    SharePoint 2010 集成Window Live 认证遇到的问题 part1
    sharepoint 2007 page
    解决sharepoint 2010浏览器在线浏览Word出错
    http://newoinc.wordpress.com/2010/07/09/webpartpropertypaneokcancelapplybuttonsdisplayissue/
    jquery ajax 实现从service读取数据,done
    刚好理解:TreeView设置checkbox事件__doPostBack()
    ASPAJAXExtSetup 安装说明(转)
    一个简单登陆框的变化+更新了如何连接sql数据库,获得数据集,比较两种方法(数据集和读数据)
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12258227.html
Copyright © 2011-2022 走看看