zoukankan      html  css  js  c++  java
  • 深入浅出Mybatis(十)Mybatis和Spring整合

    整合过程

    整合思路

     1. 创建新的java Project

          2. 导入整合所需要的jar包(包括mybatis、spring、整合jar、数据库连接等),下载点击这里。

          3. 建立配置文件,包括spring和mybatis的核心配置文件,log4j日志文件。

          4. 把逆向工程生成的类和映射文件拷贝进来。为了方便测试,小编就只拷贝了User的相关文件。

          5.测试

    建立新的java Project

          新建项目,输入项目名称,命名为mybatis-spring。建立完成后,添加一个名字为lib的文件夹,用于存放相应的jar包。

     然后我们把这些jar包,add to build path, 关于关于jar包add to build path与放入lib下的区别

    建立配置文件

          我们要建立的文件包括:

        spring核心配置文件:applicationContext.xml

        mybatis核心配置文件:SqlMapConfig.xml

        数据库连接池配置文件:db.properties

        log4j日志配置文件:log4j.properties

          其中比较固定的有,log4j文件:

    # Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

      db.properties文件,您只需修改自己数据库对应的字段:

    jdbc.driver = com.mysql.jdbc.Driver
     jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
     jdbc.username = root jdbc.password=123456
    

     spring配置文件中可以加载数据库配置文件,所以将数据库连接池托付给spring管理。通过context:property-placeholder标签。

          spring通过单例的方式管理SqlSessionFactory。spring和Mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。当创建sqlsession的时候需要传入mybatis的配置文件,所以要在其中加载mybatis的全局配置文件。

     applicationContext文件(未添加mapper映射):

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    
    	<context:property-placeholder location="classpath:db.properties"/>
    	
    	<!-- 数据库连接池 -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    		destroy-method="close">
    		<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="maxActive" value="10" />
    		<property name="maxIdle" value="5" />
    	</bean>
    	
    	<!-- Mybatis的工厂 -->
    	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="dataSource"/>
    		<!-- 核心配置文件的位置 -->
    		<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
    	</bean>
    	
    	<!-- Dao原始Dao -->
    	<bean id="userDao" class="com.dtt.mybatis.dao.UserDaoImpl">
    		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    	</bean>
    	<!-- Mapper动态代理开发 -->
    	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    		<property name="mapperInterface" value="com.dtt.mybatis.mapper.UserMapper"/>
    	</bean>
    	
    	<!-- Mapper动态代理开发   扫描 -->
    	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<!-- 基本包 -->
    		<property name="basePackage" value="com.dtt.mybatis.mapper"/>
    	</bean>
    </beans>
    

     添加了spring,mybatis的配置文件也有改变这个里面的内容也得根据在spring中的映射方式来修改mybatis的配置文件。mybatis的配置文件具体的操作看下文测试。

          下面给出一个SqlMapConfig.xml的原始框架,这里要注意的是前面的xml文件的头文件:

    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis3-config.dtd">
     <configuration> 
    <mappers>
     </mappers> 
    </configuration>
    

     加入逆向工程生成的类和映射文件

    整合测试

          这里使用的是mapper代理方法的测试。

    3.1 建立测试类和方法

          建立新的包,小编命名为com.dtt.mybatis.junt;,在这个包内建立一个测试类“JuntTest.java”,写下面的代码:

    package com.dtt.mybatis.junit;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.dtt.mybatis.mapper.UserMapper;
    import com.dtt.mybatis.pojo.User;
    
    public class JunitTest {
    
    	
    	@Test
    	public void testMapper() throws Exception {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserMapper mapper = ac.getBean(UserMapper.class);
    //		UserMapper mapper = (UserMapper) ac.getBean("userMapper");
    		User user = mapper.findUserById(10);
    		System.out.println(user);
    	}
    }
    

     Spring配置文件和mybatis配置文件


          下面是比较重要的地方了,要在Spring配置文件和mybatis中配置。这里要分情况了:

    方法一 通过MapperScannerConfigurer进行mapper扫描(建议使用)

          只需要配置spring就可以了,不用配置mybatis的SqlMapConfig.xml文件。mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册。
    规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,自动扫描出来的mapper的bean的id为mapper类名(手写字母小写)。
     比如在测试方法中写的(UserMapper)applicationContext.getBean(“userMapper”);这里用到的就是userMapper,如果我们要查询items表的,就写成(UserMapper)applicationContext.getBean(“itemsMapper”);

          在spring的applicationContext.xml配置文件中添加下面的代码:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <!-- 指定扫描的包名 
            如果扫描多个包,每个包中间使用半角逗号分隔 -->
     <property name="basePackage" value="com.dtt.mybatis.mapper"/> 
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
     </bean>
    

     db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=123
    

    1.1.1.1. log4j.properties

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

    1.1. Dao的开发

    两种dao的实现方式:

    1、原始dao的开发方式

    2、使用Mapper代理形式开发方式

    a)        直接配置Mapper代理

    b)        使用扫描包配置Mapper代理

    需求:

    1. 实现根据用户id查询

    2. 实现根据用户名模糊查询

    3. 添加用户

     创建pojo

    public class User implements Serializable {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private Integer id;
    	private String username;// 用户姓名
    	private String sex;// 性别
    	private Date birthday;// 生日
    	private String address;// 地址
    	
    	//附加对象List
    	private List<Orders> ordersList;
    	
    	
    	
    
    
    	public List<Orders> getOrdersList() {
    		return ordersList;
    	}
    	public void setOrdersList(List<Orders> ordersList) {
    		this.ordersList = ordersList;
    	}
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public Date getBirthday() {
    		return birthday;
    	}
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", username=" + username + ", sex=" + sex
    				+ ", birthday=" + birthday + ", address=" + address + "]";
    	}
    
    	
    	
    
    }
    

    传统dao的开发方式

    原始的DAO开发接口+实现类来完成。

    需要dao实现类需要继承SqlsessionDaoSupport类

     实现Mapper.xml

    编写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="queryUserById" parameterType="int" resultType="user">
    		select * from user where id = #{id}
    	</select>
    
    	<!-- 根据用户名模糊查询用户 -->
    	<select id="queryUserByUsername" parameterType="string"
    		resultType="user">
    		select * from user where username like '%${value}%'
    	</select>
    
    	<!-- 添加用户 -->
    	<insert id="saveUser" parameterType="user">
    		<selectKey keyProperty="id" keyColumn="id" order="AFTER"
    			resultType="int">
    			select last_insert_id()
    		</selectKey>
    		insert into user
    		(username,birthday,sex,address)
    		values
    		(#{username},#{birthday},#{sex},#{address})
    	</insert>
    
    </mapper>
    

     加载Mapper.xml

    在SqlMapConfig如下图进行配置:

    <configuration>
    	<!-- 设置别名 -->
    	<typeAliases>
    		<!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->
    		<package name="com.dtt.mybatis.pojo" />
    	</typeAliases>
    	
    	<mappers>
    		<package name="com.dtt.mybatis.mapper"/>
    	</mappers>
    
    </configuration>
    

     实现UserDao接口

    public interface UserDao {
    	/**
    	 * 根据id查询用户
    	 * 
    	 * @param id
    	 * @return
    	 */
    	User queryUserById(int id);
    
    	/**
    	 * 根据用户名模糊查询用户列表
    	 * 
    	 * @param username
    	 * @return
    	 */
    	List<User> queryUserByUsername(String username);
    
    	/**
    	 * 保存
    	 * 
    	 * @param user
    	 */
    	void saveUser(User user);
    
    }
    

     实现UserDaoImpl实现类

    编写DAO实现类,实现类必须集成SqlSessionDaoSupport

    SqlSessionDaoSupport提供getSqlSession()方法来获取SqlSession

    package com.itheima.mybatis.mapper;

    import com.itheima.mybatis.pojo.User;
    import com.itheima.mybatis.pojo.UserExample;
    import java.util.List;
    import org.apache.ibatis.annotations.Param;

    public interface UserMapper {
        int countByExample(UserExample example);

        int deleteByExample(UserExample example);

        int deleteByPrimaryKey(Integer id);

        int insert(User record);

        int insertSelective(User record);

        List<User> selectByExample(UserExample example);

        User selectByPrimaryKey(Integer id);

        int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);

        int updateByExample(@Param("record") User record, @Param("example") UserExample example);

        int updateByPrimaryKeySelective(User record);

        int updateByPrimaryKey(User record);
    }

     配置dao

    把dao实现类配置到spring容器中,如下图

    <!-- Dao原始Dao -->
    	<bean id="userDao" class="com.itheima.mybatis.dao.UserDaoImpl">
    		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    	</bean>
    

    测试方法

    创建测试方法,可以直接创建测试Junit用例。

    public class JunitTest {
    
    	
    	@Test
    	public void testMapper() throws Exception {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserMapper mapper = ac.getBean(UserMapper.class);
    //		UserMapper mapper = (UserMapper) ac.getBean("userMapper");
    		User user = mapper.findUserById(10);
    		System.out.println(user);
    	}
    }
    

    Mapper代理形式开发dao

    编写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 namespace="com.dtt.mybatis.mapper.UserMapper">
    
    
    	<!-- 通过ID查询一个用户 -->
    	<select id="findUserById" parameterType="Integer" resultType="User">
    		select * from user where id = #{id}
    	</select>

    <!-- 根据用户名模糊查询用户 -->

        <select id="queryUserByUsername" parameterType="string"

           resultType="user">

           select * from user where username like '%${value}%'

        </select>

     

        <!-- 添加用户 -->

        <insert id="saveUser" parameterType="user">

           <selectKey keyProperty="id" keyColumn="id" order="AFTER"

               resultType="int">

               select last_insert_id()

           </selectKey>

           insert into user

           (username,birthday,sex,address) values

           (#{username},#{birthday},#{sex},#{address})

        </insert>

    </mapper>
    

    实现UserMapper接口

    public interface UserMapper {
    	/**
    	 * 根据用户id查询
    	 * 
    	 * @param id
    	 * @return
    	 */
    	User queryUserById(int id);
    
    	/**
    	 * 根据用户名模糊查询用户
    	 * 
    	 * @param username
    	 * @return
    	 */
    	List<User> queryUserByUsername(String username);
    
    	/**
    	 * 添加用户
    	 * 
    	 * @param user
    	 */
    	void saveUser(User user);
    }
    
  • 相关阅读:
    Java编程思想:第8章 多态
    Java编程思想:第7章 复用类
    Java编程思想:第6章 访问权限控制
    Java编程思想:第5章 初始化与清理
    Java编程思想:第4章 控制执行流程
    Java编程思想:第3章 操作符
    sqoop常用命令记录
    sqoop从hive导出到mysql报错: failed with state FAILED due to: Task failed
    flink-sql解析canal-json实现实时同步
    hive爬坑
  • 原文地址:https://www.cnblogs.com/mtime2004/p/9898525.html
Copyright © 2011-2022 走看看