zoukankan      html  css  js  c++  java
  • spring整合mybatisXML版

    引用的所有jar包,本demo是一个普通的java项目测试的:

    aopalliance.jar
    asm-3.3.1.jar
    aspectjweaver.jar
    cglib-2.2.2.jar
    commons-logging-1.1.1.jar
    javassist-3.17.1-GA.jar
    log4j-1.2.17.jar
    log4j-api-2.0-rc1.jar
    log4j-core-2.0-rc1.jar
    mybatis-3.2.7.jar
    mybatis-spring-1.2.3.jar
    mysql-connector-java-5.1.20-bin.jar
    slf4j-api-1.7.5.jar
    slf4j-log4j12-1.7.5.jar
    spring-aop-4.1.6.RELEASE.jar
    spring-aspects-4.1.6.RELEASE.jar
    spring-beans-4.1.6.RELEASE.jar
    spring-context-4.1.6.RELEASE.jar
    spring-context-support-4.1.6.RELEASE.jar
    spring-core-4.1.6.RELEASE.jar
    spring-expression-4.1.6.RELEASE.jar
    spring-jdbc-4.1.6.RELEASE.jar
    spring-orm-4.1.6.RELEASE.jar
    spring-tx-4.1.6.RELEASE.jar
    spring-web-4.1.6.RELEASE.jar
    spring-webmvc-4.1.6.RELEASE.jar

    spring整合mybatis可以将mybatis单独配置读取实体类的位置文件部分,其他的配置由spring自己单独管理如,需先创建好数据库中User表:

    <?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">
    <!-- 配置mybatis -->
    <configuration>
    
        <!-- 配置别名 -->
        <typeAliases>
            <package name="mr.li.entity"/>
        </typeAliases>
        
        <!-- 引入mr.li.entity包下的user.mapper.xml文件,意思为:将此xml文件配置到mybatis下,
        由mybatis框架最终执行,在mr.li.entity包下还可引入其他类的xml映射文件,最终都统一由mybatis执行 -->
        <mappers>
            <!-- 第一种:xml方式连接数据库 -->
            <mapper resource="mr/li/entity/user.mapper.xml"/>
        </mappers> 
    </configuration>

    在spring中的引用位置则是

    <!-- 配置sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
         <!-- 在处引用 --> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> </bean>

    好了,上面的都是套在下面的beans.xml中引用的,本文主要讲利用一个spring的beans.xml配置来完成spring继承mybatis,其中实体类(User)可以是user.mapper.xml的方式配置,也可以是@select...

    注解的方式配置。总之都是要写sql语句的。下面展示的代码中UserMapper是注解版的,而UserDao则是xml版的(只对于实体类的配置而言)。写的不标准,但是功能做到了,本应该用userService,但是为了方便看,所以尽可能的简单一点。

    1.userDao

    package mr.li.dao;
    
    import java.util.List;
    
    import mr.li.entity.User;
    
    public interface UserDao {
    
        /**
         * 获得一个User集合
         * @return
         */
        List<User> selectList();
    }

    2.userDaoImpl

    package mr.li.dao.impl;
    
    import java.util.List;
    
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    
    import mr.li.dao.UserDao;
    import mr.li.entity.User;
    /**
     * 在mybatis-spring-1.2.3jar中,不在需要注入sqlSessionTemplate类,而是直接继承SqlSessionDaoSupport
     * 类来实现利用mybatis操作数据库的功能,此类中还是通过封装了sqlSessionTemplate类来实现的,这样做的好处
     * 是能更好的支持数据库事务。
     * @author Administrator
     *
     */
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    
        @Override
        public List<User> selectList() {
            //此处引用user.mapper.xml文件中id为selectAll的标签
            return getSqlSession().selectList("mr.li.entity.user.mapper.selectAll");
        }
    }

    3.spring配置beans.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:aop="http://www.springframework.org/schema/aop"
        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/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
         <!-- 配置数据源:连接数据库 -->
        <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/test"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </bean>   
        
        <!-- 声明式事务配置 开始 -->
        <!-- 配置事务管理器 -->
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <!-- 配置事务通知 -->
        <tx:advice id="txAdvice" transaction-manager="txManager">
            <tx:attributes>
                <!-- 配置哪些方法使用什么样的事务,配置事务的传播特性:例如:REQUIRED是:在执行此配置的所有方法是先看看有没有事务开启(就是有没有其他此配置方法在执行),如果有那么在此方法执行完后等待此次整个事务
                中的其他方法执行完毕一起提交,如果中间有哪个方法抛出异常则全部数据回滚 -->
                <tx:method name="add" propagation="REQUIRED"/>
                <tx:method name="insert" propagation="REQUIRED"/>
                <tx:method name="update" propagation="REQUIRED"/>
                <tx:method name="delete" propagation="REQUIRED"/>
                <tx:method name="remove*" propagation="REQUIRED"/>
                <tx:method name="get" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>
        <aop:config>
            <!-- 以上配置的方法事事务在dao.impl中执行时会开启此次事务,一般正常配置应在service中配置,而不是dao中,此处仅用于测试 -->
            <aop:pointcut expression="execution(* mr.li.dao.impl.*.*(..))" id="pointcut"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
        </aop:config>
        <!-- 声明式事务配置 结束 -->    
        
        
        
        <!-- 创建连接数据库第一种方式:创建userDao实例开始 -->
        <!-- 配置sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <!-- 设置spring读取实体对象的配置类信息,在entity包下的所有.mapper.xml文件 -->
            <property name="mapperLocations" value="classpath:mr/li/entity/*.mapper.xml"/>
        </bean>
        <!-- 通过set方法创建一个userDao的实例 -->
        <bean id="userDao" class="mr.li.dao.impl.UserDaoImpl">
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean> 
        <!-- 创建userDao实例结束 -->
        
        <!-- 创建连接数据库第二种方式:采用注解的方式 -->
        <bean id="userMapper" class = "org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="mr.li.mapper.UserMapper"/>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean>
        
    </beans>        
            
            
            
    
            

    4.实体类的xml版,user.mapper.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="mr.li.entity.user.mapper">
    
        <!-- mybatis查询user集合,这只id为selectAll,其他地方如果引用就需要调用这个id
        resulType:这参数作用:返回类型:如果前面有指定包名则会加上前面的包名,如果没有设置则需要全名
        这里不能指定所以用的是全名 -->
        <select id="selectAll" resultType="mr.li.entity.User">
            select * from user
        </select>
    </mapper>

    5.实体类的注解版Mapper

    package mr.li.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Select;
    
    import mr.li.entity.User;
    
    public interface UserMapper {
    
        @Select("select * from user")
        List<User> selectList();
    }

    7.User实体类

    package mr.li.entity;
    
    public class User {
    
        private int id;
        
        private String name;
        
        private int age;
    
        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 int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public User(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
        
        public User() {
        }
    }

    8.测试类

    package mr.li.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import mr.li.dao.UserDao;
    import mr.li.entity.User;
    import mr.li.mapper.UserMapper;
    
    public class Test {
    
        public static void main(String[] args) {
            //第一种方式
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
            UserDao userDao = (UserDao)context.getBean("userDao");
            System.out.println(userDao.selectList().size());
            
            //第二种方式
            UserMapper userMapper = (UserMapper)context.getBean("userMapper");
            for(User user : userMapper.selectList()) {
                System.out.println(user.getName());
            }
        }
    }

    测试结果,此结果是mysql数据库中的user表信息:

    2
    王二小
    许三多

  • 相关阅读:
    扩展IList对象,实现深拷贝扩展方法
    Repeater 汇总某一列(序号,分页) 最简单方法
    Query siblings()
    C#中求两个日期相差的年月日时分秒
    SQL语句中的 "... like '%@strKeyword% ' "这样写查不出结果
    sql server 编辑前200行..编辑前N行配置..
    .Net读取Excle数据写入到数据库
    jquery设置元素的readonly和disabled
    页面有ScriptManager , UPdatepanel 有些错误不报错...的解决方法
    一次性删除数据库所有表和所有存储过程 SQL语句
  • 原文地址:https://www.cnblogs.com/li-yan-long/p/10665876.html
Copyright © 2011-2022 走看看