Mybatis05-Mybatis-Spring整合
1.项目目录结构
2.构建Maven普通工程:maven-archetype-quickstart
3.pom.xml中导入依赖
<!--mybatis架包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql架包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring-jdbc架包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--spring相关架包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--单元测试架包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--mybatis和sping整合架包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!--spring AOP织入架包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<build>
<!--
Maven 项目
如果源代码(src/main/java)存在xml properties tld 等文件 maven 默认不会自动编译该文件到输出目录
如果要编译源代码中xml properties tld 等文件 需要显式配置resources 标签
-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
4.在resources文件夹中添加配置文件 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc.user=root
jdbc.password=root
5.在resources文件夹中添加配置文件 mybatis.xml全局配置文件
注意:mybatis全局配置文件中的不需要配置数据源及后续用到的事务,都由spring全局配置文件中进行配置,进行统一管理和维护,让 mybatis.xml 配置文件配置简单化,一般只需要配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架头文件声明,类似 spring 环境,均需要加入头文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--
数据库字段(带有_字符的字段) 自动转换为驼峰命名
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置别名-->
<typeAliases>
<package name="com.mage.vo"/>
</typeAliases>
</configuration>
6…在resources文件夹中添加配置文件spring.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"
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">
<!--加载resource目录下的配置文件
properties 加载单个配置文件配置
classpath*:*.properties多文件加载配置,
-->
<context:property-placeholder location="db.properties"/>
<!--配置数据源使用Spring框架自带的的-->
<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.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--加载mybatis.xml全局配置文件-->
<property name="configLocation" value="classpath:mybatis.xml"/>
<!--加载当前包下所有mybatis的sql映射配置文件-->
<property name="mapperLocations" value="classpath:com/mage/mapper/*.xml"/>
</bean>
<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--注意:查看源码,只能用构造器注入-->
<constructor-arg name="sqlSessionFactory" ref="sessionFactory"/>
</bean>
<!--创建bean对象,后续测试会用到,提前写入,也可以用扫描包代替,这里只是测试,就直接写了-->
<bean id="userDao" class="com.mage.dao.impl.UserDaoImpl">
<constructor-arg name="sqlSessionTemplate" ref="sessionTemplate"/>
</bean>
</beans>
注意点:
1.在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建
2.SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession
3.SqlSessionTemplate 模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题
7.测试
1.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String userName;
private String userPwd;
private String flag;
private Date createtime;
}
2.接口
public interface UserDao {
//根据用户的id查询,返回用户信息
public User queryUserById(Integer userId);
}
3.接口实现类
public class UserDaoImpl implements UserDao {
//注意,没有使用注解,我们需要在spring.xml配置文件中配置相应的bean对象,全部交给spring容器创建和维护
private SqlSessionTemplate sqlSessionTemplate;
public UserDaoImpl(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public User queryUserById(Integer userId) {
UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
return userDao.queryUserById(userId);
}
}
4.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">
<!--
1.命名空间配置 namespace: 值全局唯一 包名+文件名(不包含后缀如:.xml),格式:com.mage.dao.UserMapper
2.配置 Mapped Statement
3.查询标签:select 又称为statement statement 配置
id 值声明 statement 唯一标识,同一命名空间(同一文件)下不可重复
parameterType 输入参数即占位符的数据类型 类型可以是 基本数据类型,字符串,javabean ,map,list,数组 等
resultType 输出结果 类型可以是基本数据类型,字符串,javabean,map等
标签体:statement 描述 即待执行的 sql语句
#{id} 占位符 变量名为 id/value 均可 ${value} 变量名必须为 value 如果是字符串拼接形式 无法避免sql注入
-->
<mapper namespace="com.mage.dao.UserDao">
<select id="queryUserById" parameterType="int" resultType="User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
</mapper>
5.测试代码
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
UserDao userDaoImpl = applicationContext.getBean("userDao", UserDaoImpl.class);
User user = userDaoImpl.queryUserById(83);
System.out.println(user);
}
}
学到这里,整个整合过程就完成了,但我总感觉有点麻烦,每次都需要用到接口的实现类和依赖注入SqlSessionTemplate来开启会话,能不能和上一篇博客mybatis讲到的基于接口来进行CRUD呢,话不多说,直接开干,只需要增加或者改动少量配置,为了看的的清晰一点,我们重新整合一次
2.构建Maven普通工程:maven-archetype-quickstart
3.pom.xml中导入依赖(新增了一个测试环境架包,其他不变)
<dependencies>
<!-- spring 测试环境 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.2.RELEASE</version>
<scope>test</scope>
</dependency>
<!--mybatis架包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql架包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring-jdbc架包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--spring相关架包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--单元测试架包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--mybatis和sping整合架包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!--spring AOP织入架包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
<build>
<!--
Maven 项目
如果源代码(src/main/java)存在xml properties tld 等文件 maven 默认不会自动编译该文件到输出目录
如果要编译源代码中xml properties tld 等文件 需要显式配置resources 标签
-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
4.在resources文件夹中添加配置文件 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc.user=root
jdbc.password=root
5.在resources文件夹中添加配置文件 mybatis.xml全局配置文件
注意:mybatis全局配置文件中的不需要配置数据源及后续用到的事务,都由spring全局配置文件中进行配置,进行统一管理和维护,让 mybatis.xml 配置文件配置简单化,一般只需要配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架头文件声明,类似 spring 环境,均需要加入头文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--
数据库字段(带有_字符的字段) 自动转换为驼峰命名
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置别名-->
<typeAliases>
<package name="com.mage.vo"/>
</typeAliases>
</configuration>
6…在resources文件夹中添加配置文件spring.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"
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">
<!--包扫描,自动装配和依赖注入都开启-->
<context:component-scan base-package="com.mage"/>
<!--加载resource目录下的配置文件
properties 加载单个配置文件配置
classpath*:*.properties多文件加载配置,
-->
<context:property-placeholder location="db.properties"/>
<!--配置数据源使用Spring框架自带的的-->
<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.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--加载mybatis.xml全局配置文件-->
<property name="configLocation" value="classpath:mybatis.xml"/>
<!--加载当前包下所有mybatis的sql映射配置文件-->
<property name="mapperLocations" value="classpath:com/mage/mapper/*.xml"/>
</bean>
<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<!--<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!–注意:查看源码,只能用构造器注入–>
<constructor-arg name="sqlSessionFactory" ref="sessionFactory"/>
</bean>-->
<!-- <bean id="userDao" class="com.mage.dao.impl.UserDaoImpl">
<constructor-arg name="sqlSessionTemplate" ref="sessionTemplate"/>
</bean>-->
<!--自动扫描将Mapper接口动态生成代理注入到Spring容器中,可以直接使用-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage 属性是为映射器接口包路径-->
<property name="basePackage" value="com.mage.dao"/>
<!--创建各自接口的动态代理类-->
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
</bean>
</beans>
注意点:
-
MapperScannerConfigurer支持由指定的创建接口或注解创建映射器
-
没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因为 MapperScannerConfigurer 将会创建MapperFactoryBean ,代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象(DAO)的代码,
-
MapperScannerConfigurer 将会查找类路径下的所有映射器接口并自动会创建一个MapperFactoryBean 实例,然后注入这个接口和 sqlSessionFactory ( mybatis 中提供的 SqlSessionFactory 接口,MapperFactoryBean 会使用SqlSessionFactory 创建 SqlSession ),之后想使用这个 Mapper 接口的话,直接通过 spring 注入这个bean,然后就可以直接使用了
-
如果你使用了一个以上的DataSource的情况下 ,你可以使用 sqlSessionFactoryBeanName。这就是它如何来配置的,注意 bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的ref。
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
7.测试
1.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String userName;
private String userPwd;
private String flag;
private Date createtime;
}
2.接口
public interface UserDao {
//根据用户的id查询,返回用户信息
public User queryUserById(Integer userId);
}
3.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">
<!--
1.命名空间配置 namespace: 值全局唯一 包名+文件名(不包含后缀如:.xml),格式:com.mage.dao.UserMapper
2.配置 Mapped Statement
3.查询标签:select 又称为statement statement 配置
id 值声明 statement 唯一标识,同一命名空间(同一文件)下不可重复
parameterType 输入参数即占位符的数据类型 类型可以是 基本数据类型,字符串,javabean ,map,list,数组 等
resultType 输出结果 类型可以是基本数据类型,字符串,javabean,map等
标签体:statement 描述 即待执行的 sql语句
#{id} 占位符 变量名为 id/value 均可 ${value} 变量名必须为 value 如果是字符串拼接形式 无法避免sql注入
-->
<mapper namespace="com.mage.dao.UserDao">
<select id="queryUserById" parameterType="int" resultType="User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
</mapper>
5.测试代码
//集成测试在Spring容器环境下执行
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class Mytest {
@Autowired
private UserDao userDao;
@Test
public void test01(){
User user = userDao.queryUserById(83);
System.out.println(user);
}
}
本片博客分享就到这,如果有什么小问题,希望你在评论区留言,如果本片博客对你有帮助的话,希望你能收藏,想要学习更多,就多多关注我,文章持续更新中,别忘了点赞哦!谢谢!
转载:https://blog.csdn.net/QZP51ZX/article/details/105913025