在myBatis与Spring整合之前,使用myBatis:
1)手动加载MyBatis的核心配置文件,在核心配置文件中使用映射器加载Sql映射文件
2)需要手动创建SqlSessionFactory
3)手动创建SqlSession对象,或者获取动态代理对象进行操作。
myBatis与Spring整合,要考虑哪些问题?
1)SqlSessionFactory对象应该放到Spring容器中,以单例的形式存在,由Spring帮助我们创建对象,然后通过set注入对属性进行赋值。
2)数据库连接、数据库连接池以及事务,都应该交给Spring容器来进行管理。
3)Mapper代理形式中,应该从Spring容器中,直接获取mapper的动态代理对象(接口的实现类)。
//传统的dao开发宗,应该从Spring容器中获得SqlSession对象。
整合需要的jar包:
Spring的jar包; Mybatis的jar包; Mysql的数据库驱动jar包;数据库连接池的jar包;Spring+mybatis的整合包(整合包里面有很多可以直接拿来用的类)。
1) Spring整合Mybatis之原始Dao开发
2) Spring整合Mybatis之Mapper动态代理开发
3) Spring整合Mybatis之Mapper动态代理扫描开发(核心)
配置文件
1.spring的配置文件
2.mybatisS的配置文件sqlmapConfig.xml
applicationContext.xml
对于spring来说,mybatis是另外一个架构,需要整合jar包。SqlSessionFactoryBean属于mybatis-spring这个jar包.
代码规范:在src下创建一个config文件夹,专门用于放配置文件。
SqlSessionFactoryBean对象的两个属性:注入数据源和注入核心配置文件
MapperScannerConfigurer:扫描要指定基本包以及子包,基本包里面是所有的mapping接口文件
修改SqlMapConfig.xml配置文件。Mapper映射器只保留包扫描的方式。
pojo:简单java对象。
myBatis:核心配置文件和SQL映射文件
输入映射和输出映射:输入参数映射,返回值映射(自动映射和手动映射)
动态Sql:if标签 where标签 sql片段 Foreach标签
关联查询:一对一关联 一对多关联
实体模型之间的继承关系
Spring配置文件:
<?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">
<!-- Spring核心配置文件 -->
<!-- 属性文件所在的位置 -->
<!-- 通过属性文件的形式配置数据源 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据源和数据库连接池 -->
<!-- EL表达式:表示变量名称 -->
<!-- BasicDataSource数据库连接池类,需要设置参数才能获取到连接,几乎所有的数据库连接池都是这样的 -->
<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>
<!-- SqlSessionFactory交给Spring容器来进行管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--1、注入数据源和数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!--2、核心配置文件的位置 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml" />
</bean>
<!-- 三种开发方式 -->
<!-- 1、整合原始dao开发 -->
<bean id="userDao" class="com.spring.cn.dao.UserDaoImpl">
<!-- 主要用于获取session对象 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 2、mapper动态接口开发 :MapperFactoryBean工厂 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="com.spring.cn.mapper.UserMapper"></property>
</bean>
<!-- 3、Mapper动态代理扫描开发-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 自动寻找session工厂 -->
<property name="basePackage" value="com.spring.cn.mapper.UserMapper"/>
</bean>
</beans>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.227:3306/***?characterEncoding=utf-8
jdbc.username=root
jdbc.password=mysql123
sqlMapConfig.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>
<!--核心配置文件 -->
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="UserMap.xml"/>
</mappers>
</configuration>
测试代码:
package com.spring.cn.junit;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.cn.dao.UserDaoImpl;
import com.spring.cn.entity.User;
import com.spring.cn.mapper.UserMapper;
public class TestDao {
/**
* 传统dao开发,插入用户
*/
@Test
public void testInsertUser() {
//加载Spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//让Spring容器为我们创建对象
UserDaoImpl userDaoImpl = (UserDaoImpl) ac.getBean("userDao");
//调用对象中的方法
userDaoImpl.insertUser();
}
/**
* mapper动态接口开发
*/
@Test
public void testFindUserById(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = (UserMapper) ac.getBean("userMapper");
User user = userMapper.findUserById(4);
System.out.println(user.toString());
}
/*
* 工作中最常用的开发:mapper动态接口扫描开发
*/
@Test
public void testScannerMapper(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = ac.getBean(UserMapper.class);
User user = userMapper.findUserById(4);
System.out.println(user.toString());
}
}
package com.spring.cn.dao;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import com.spring.cn.entity.User;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
// extends SqlSessionDaoSupport 主要是为了获取SqlSession对象
public void insertUser() {
SqlSession sqlSession = this.getSqlSession();
User user = new User();
user.setAge(100);
user.setName("天涯海角!");
sqlSession.insert("insertNewUser", user);
}
}
sql映射文件:
<?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.spring.cn.dao.UserDaoImpl">
<!-- 使用dao进行开发插入新用户 -->
<insert id="insertNewUser" parameterType="com.spring.cn.entity.User">
insert into user(age,name) values(#{age},#{name});
</insert>
</mapper>