zoukankan      html  css  js  c++  java
  • mybatis和spring的整合

    一、搭建环境

    spring和mybatis不同的厂家. 如果要进行整合需要有一个整合包 spring-mybatis的整合包.

    整合包中就给了的工厂对象SqlSessionFactoryBean .

    实现的步骤:

    1.导入jar

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.itheima.day25_spring_mybatis</groupId>
        <artifactId>day25_spring_mybatis</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!--配置包括spring很多依赖包-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <!--配置JdbcTemplate-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <!--spring的AOP的扩展-->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.7</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>
            <!--mybatis核心依赖-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
            <!--Spring和MyBatis的整合包,要进行整合,就要这个包-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.0</version>
            </dependency>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.2.4.RELEASE</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.6</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.10</version>
            </dependency>
        </dependencies>
    </project>

    2.引入配置文件

    • db.properties (复制修改)

    • log4j.properties (复制)

    • SqlMapConfig.xml (我们要改动 空文件)

    • xxxMapper.xml (我要改动)

    • applicationContext.xml (我们要改动)

    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" 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 http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--1.spring加载外部数据源-->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!--2.配置数据源-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--需要注入连接池对象-->
            <property name="dataSource" ref="dataSource"/>
            <!--加载SqlMapConfig.xml-->
            <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
            <!--配置别名-->
            <property name="typeAliasesPackage" value="com.itheima.pojo"/>
            <!--配置加载映射文件-->
            <property name="mapperLocations" value="classpath:User.xml"/>
        </bean>
    
        <!--扫描所有类,创建对象-->
        <context:component-scan base-package="com.itheima"/>
    
        <!--
         配置事务
         -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--配置增强-->
        <tx:advice id="txAdivce" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
            <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
        </aop:config>
    
    
        <!--
            如果使用远程的dao
        -->
    
    
        <!--
            如果使用Mapper动态代理如何做
        -->
    </beans>

    3.创建包结构

    com.itheima.dao

    com.itheima.pojo

    4.数据库的创建

     CREATE TABLE USER (
    	id INT(11) PRIMARY KEY AUTO_INCREMENT,
    	username VARCHAR(32) NOT NULL COMMENT '用户名称',
    	birthday DATE DEFAULT NULL COMMENT '生日',
    	sex CHAR(1) DEFAULT NULL COMMENT '性别',
    	address VARCHAR(256) DEFAULT NULL COMMENT '地址'
    
     );
     
    INSERT INTO `user` VALUES (NULL, '王五', '2015-05-10', '2', NULL);
    INSERT INTO `user` VALUES (NULL, '张三', '2014-07-10', '1', '北京市');
    INSERT INTO `user` VALUES (NULL, '张小明', '2018-11-11', '1', '郑州');
    INSERT INTO `user` VALUES (NULL, '陈小明', '2019-07-20', '1', '广州');
    INSERT INTO `user` VALUES (NULL, '张三丰', '2011-04-11', '1', '西安');
    INSERT INTO `user` VALUES (NULL, '陈小明', '2019-09-10', '2', '杭州');
    INSERT INTO `user` VALUES (NULL, '王五', '2014-07-07', NULL, NULL);

    二、使用原始的dao进行整合

    需求:

    1.根据id查询用户信息

    2.根据name模糊查询用户信息

    3.添加用户信息

    编写了UserDao

    package com.itheima.dao;
    
    import com.itheima.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
    
        //根据id查询User
        public User findUserById(int id);
    
        //根据name模糊查询user
        public List<User>  queryUserByName(String name);
    
        //添加用户
        public void addUser(User user);
    }
    

    编写UserDaoImpl实现类

    package com.itheima.dao;
    
    import com.itheima.pojo.User;
    import org.apache.ibatis.session.SqlSession;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    /**
     * SqlSessionFactory
     * sqlSession  (selectOne   selectList   insert  update   delete 方法)
     *
     * 因为我们需要一个SqlSession会话对象来进行数据的查询和增加.
     * spirng提供了一个类 SqlSessionDaoSupport  ,继承该类,就可以或货到sqlSession.
     *
     * 可以在方法中 super.getSqlSession() 获取sqlSession对象 (获取到的该对象不能直接使用)
     * 我们需要给SqlSessionDaoSupport设置一个工厂对象.
     *
     */
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    
        public User findUserById(int id) {
            SqlSession sqlSession = super.getSqlSession();
            //selectOne("namespace的id值.sql的id值",实际的参数)
            User user = sqlSession.selectOne("test.findUserById", id);
            return user;
        }
    
        public List<User> queryUserByName(String name) {
            SqlSession sqlSession = super.getSqlSession();
            List<User> list = sqlSession.selectList("test.findUserByName", name);
            return list;
        }
    
        public void addUser(User user) {
            SqlSession sqlSession = super.getSqlSession();
            sqlSession.insert("test.addUser",user);
        }
    }
    

    修改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" 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 http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--1.spring加载外部数据源-->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!--2.配置数据源-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--需要注入连接池对象-->
            <property name="dataSource" ref="dataSource"/>
            <!--加载SqlMapConfig.xml-->
            <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
            <!--配置别名-->
            <property name="typeAliasesPackage" value="com.itheima.pojo"/>
            <!--配置加载映射文件-->
            <property name="mapperLocations" value="classpath:User.xml"/>
        </bean>
    
        <!--扫描所有类,创建对象-->
        <context:component-scan base-package="com.itheima.dao"/>
    
        <!--
         配置事务
         -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--配置增强-->
        <tx:advice id="txAdivce" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
            <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
        </aop:config>
    
    
        <!--
            如果使用原生的dao
        -->
        <bean id="userDao" class="com.itheima.dao.UserDaoImpl">
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean>
    
    
        <!--
            如果使用Mapper动态代理如何做
        -->
    </beans>

    User.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="test">
    
        <!--根据id查询-->
        <select id="findUserById" resultType="user">
            select * from user where id = #{id}
        </select>
    
        <!--根据name模糊查询-->
        <select id="findUserByName" resultType="user">
            select * from user where username like '%${value}%'
        </select>
    
        <!--添加用户-->
        <insert id="addUser" >
            insert into user values(null,#{username},#{birthday},#{sex},#{address});
        </insert>
    </mapper>
    

    测试Dao

    package com.itheima.dao;
    
    import com.itheima.pojo.User;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.Date;
    import java.util.List;
    
    import static org.junit.Assert.*;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class UserDaoTest {
    
        @Autowired
        private UserDao userDao;
    
        @Test
        public void findUserByIdTest() {
            User user = userDao.findUserById(5);
            System.out.println(user);
        }
    
        @Test
        public void queryUserByNameTest() {
            List<User> list = userDao.queryUserByName("张");
            for (User user : list) {
                System.out.println(user);
            }
        }
    
        @Test
        public void addUserTest() {
            User user = new User();
            user.setUsername("柳岩");
            user.setSex("2");
            user.setBirthday(new Date());
            user.setAddress("北京");
            userDao.addUser(user);
    
        }
    }

    三、mapper动态代理的方式整合 (重点)

    需求:

    1.根据id查询用户信息

    2.根据name模糊查询用户信息

    3.添加用户信息

    1)新建一个com.itheima.mapper包 -- 存放的是接口

    public interface UserMapper {
    
        //根据id查询User
        public User findUserById(int id);
    
        //根据name模糊查询user
        public List<User> queryUserByName(String name);
    
        //添加用户
        public void addUser(User user);
    }
    

    2) resources目录下创建一个和mapper接口目录已经的配置文件名字: UserMapper.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动态代理四个规则:
        1.namespace和接口的完全路径名一致
        2.sql的id和接口中方法的名称一致
        3.sql中的返回值类型和接口的方法返回值类型一致
        4.sql中的参数类型和接口中方法的参数类型一致
    -->
    
    <mapper namespace="com.itheima.mapper.UserMapper">
    
        <!--根据id查询-->
        <select id="findUserById" resultType="user" parameterType="int">
            select * from user where id = #{id}
        </select>
    
        <!--根据name模糊查询-->
        <select id="queryUserByName" resultType="user" parameterType="string">
            select * from user where username like '%${value}%'
        </select>
    
        <!--添加用户-->
        <insert id="addUser" parameterType="user">
            insert into user values(null,#{username},#{birthday},#{sex},#{address});
        </insert>
    </mapper>
    

    applicationContext2.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"
           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 http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--1.spring加载外部数据源-->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!--2.配置数据源-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--需要注入连接池对象-->
            <property name="dataSource" ref="dataSource"/>
            <!--加载SqlMapConfig.xml-->
            <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
            <!--配置别名-->
            <property name="typeAliasesPackage" value="com.itheima.pojo"/>
        </bean>
    
        <!--扫描所有类,创建对象-->
        <context:component-scan base-package="com.itheima.dao"/>
    
        <!--
         配置事务
         -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--配置增强-->
        <tx:advice id="txAdivce" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
            <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
        </aop:config>
    
    
        <!--
            如果使用Mapper动态代理如何做
            MapperScannerConfigurer  整合包中提供的一个扫描类
            需要配置basePackage , spring就会扫描该包
            1.加载该包下的映射文件  UserMapper.xml
            2.创建给包下的所有接口的代理对象
        -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.itheima.mapper"/>
        </bean>
    </beans>

    测试Dao

    package com.itheima.mapper;
    
    import com.itheima.pojo.User;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.Date;
    import java.util.List;
    
    import static org.junit.Assert.*;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext2.xml")
    public class UserMapperTest {
    
        @Autowired
        private UserMapper mapper;
    
        @Test
        public void findUserById() {
            User user = mapper.findUserById(8);
            System.out.println(user);
        }
    
        @Test
        public void queryUserByName() {
            List<User> list = mapper.queryUserByName("丰");
            System.out.println(list);
        }
    
        @Test
        public void addUser() {
            User user = new User();
            user.setUsername("柯镇恶");
            user.setSex("1");
            user.setBirthday(new Date());
            user.setAddress("桃花岛");
            mapper.addUser(user);
        }
    }
  • 相关阅读:
    hadoop 异常及处理总结-02(小马哥精品)
    Linux环境变量(小马哥推荐)
    Apache Tomcat 8.5 安全配置与高并发优化
    深入理解分布式系统中的缓存架构(上)
    Redis的n种妙用,不仅仅是缓存
    springBoot整合ecache缓存
    Spark Streaming实时处理应用
    Spark 实践
    spark性能调优
    Spark调优
  • 原文地址:https://www.cnblogs.com/haojia/p/12386230.html
Copyright © 2011-2022 走看看