Mybatis和Spring整合
一、dao接口+实现类的方式
1、先创建好整合工程结构
2、对于Spring和Mybatis 整合,我们先从数据库开始,即先创建一张简单的数据表,Sql如下
CREATE TABLE `t_user` (`id` INT(10) NOT NULL AUTO_INCREMENT,`username` VARCHAR(100) DEFAULT NULL,`password` VARCHAR(100) DEFAULT NULL,`address` VARCHAR(100) DEFAULT NULL,`sex` VARCHAR(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8复制代码
然后根据从上面的数据表创建对应的实体类
1 package cn.test.ssm.po;2 3 import java.io.Serializable;4 5 public class User implements Serializable {6 private int id;7 private String username;8 private String password;9 private String address;
10 private String sex;
11
12 public int getId() {
13 return id;
14 }
15
16 public String getUsername() {
17 return username;
18 }
19
20 public String getPassword() {
21 return password;
22 }
23
24 public String getAddress() {
25 return address;
26 }
27
28 public String getSex() {
29 return sex;
30 }
31
32 public void setId(int id) {
33 this.id = id;
34 }
35
36 public void setUsername(String username) {
37 this.username = username;
38 }
39
40 public void setPassword(String password) {
41 this.password = password;
42 }
43
44 public void setAddress(String address) {
45 this.address = address;
46 }
47
48 public void setSex(String sex) {
49 this.sex = sex;
50 }
51
52 public User(String username, String password, String address, String sex) {
53 this.username = username;
54 this.password = password;
55 this.address = address;
56 this.sex = sex;
57 }
58
59 public User() {
60 }
61
62 @Override
63 public String toString() {
64 return "User{" +
65 "id=" + id +
66 ", username='" + username + '\'' +
67 ", password='" + password + '\'' +
68 ", address='" + address + '\'' +
69 ", sex='" + sex + '\'' +
70 '}';
71 }
72 }复制代码
3、然后我们开始配置Mybatis的相关配置文件,具体有Mybatis的核心配置文件SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE configuration3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"4 "http://mybatis.org/dtd/mybatis-3-config.dtd">5 <configuration>6 7 <typeAliases>8 <!--批量别名定义:Mybatis在定义别名的时候会自动扫描包中的po类,自动的将别名定义为类名(首字母大写或者小写都可以)-->9 <package name="cn.test.ssm.po"></package>
10 </typeAliases>
11
12 <!--配置一个SQL语句和映射的配置文件-->
13 <mappers>
14 <mapper resource="sqlmap/UserMapper.xml" />
15 </mappers>
16
17 </configuration>复制代码
然后就是配置UserMapper.xml映射文件,由于只是测试Spring和Mybatis的整合,所以可以只是实现相对简单的功能,这样的话,UserMapper配置文件也就比较简单
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">5 <!--mapper为根元素,namespace指定了命名空间-->6 <mapper namespace="test">7 8 <select id="findUserById" parameterType="int" resultType="cn.test.ssm.po.User">9 SELECT * FROM t_user WHERE id = #{id}
10 </select>
11
12 </mapper>复制代码
4、下来就是根据UserMapper中的statment实现的功能,写dao接口文件
1 package cn.test.ssm.dao;
2
3 import cn.test.ssm.po.User;
4
5 public interface UserDao {
6
7 public User findUserById(int id) throws Exception;
8 }复制代码
5、我们编写dao接口的实现类。在dao接口的实现类过程中,我们需要知道,由于Spring整合Mybatis的原因,Spring需要管理SqlSessionFactory,而实现类方法中需要得到这个SqlSessionFactory,这里我们可以继承SqlSessionDaoSupport这个类,我们看一下这个类中的方法
6、下来我们就具体的配置applicationContext配置文件,其中需要配置数据库信息,加载其他的配置文件,管理配置SqlSessionFactory(要加载Mybatis核心配置文件),然后我们管理UserDao接口的bean,同上面分析的,就需要配置SqlSessionFactory这个属性
1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xmlns:context="http://www.springframework.org/schema/context"5 xmlns:aop="http://www.springframework.org/schema/aop"6 xmlns:tx="http://www.springframework.org/schema/tx"7 xsi:schemaLocation="8 http://www.springframework.org/schema/beans9 http://www.springframework.org/schema/beans/spring-beans.xsd
10 http://www.springframework.org/schema/aop
11 http://www.springframework.org/schema/aop/spring-aop.xsd
12 http://www.springframework.org/schema/context
13 http://www.springframework.org/schema/context/spring-context.xsd
14 http://www.springframework.org/schema/tx
15 http://www.springframework.org/schema/tx/spring-tx.xsd">
16
17
18 <!--加载数据库信息的配置文件-->
19 <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
20
21 <!--配置数据源-->
22 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
23 <property name="driverClass" value="${jdbc.driver}" />
24 <property name="jdbcUrl" value="${jdbc.url}" />
25 <property name="user" value="${jdbc.username}" />
26 <property name="password" value="${jdbc.password}" />
27 </bean>
28
29 <!--配置SqlSessionFactory-->
30 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
31 <!--加载Mybatis的配置文件-->
32 <property name="configLocation" value="mybatis/SqlMapConfig.xml"></property>
33 <!--配置数据源-->
34 <property name="dataSource" ref="dataSource"></property>
35 </bean>
36
37 <!--配置Dao接口-->
38 <bean id="userDao" class="cn.test.ssm.dao.UserDaoImpl">
39 <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
40 </bean>
41 </beans>复制代码
7、编写好applicationContext之后,就开始实现UserDao这个接口,也是如同上面的分析,实现SqlSessionDaoSupport这个抽象类,从而得到SqlSessionFactory,在方法体内获取SqlSession
1 package cn.test.ssm.dao;2 3 import cn.test.ssm.po.User;4 import org.apache.ibatis.session.SqlSession;5 import org.mybatis.spring.support.SqlSessionDaoSupport;6 7 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{8 9 // SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) 方法
10
11 @Override
12 public User findUserById(int id) throws Exception {
13 SqlSession sqlSession = getSqlSession(); //SqlSessionDaoSupport中有private SqlSession sqlSession;这个属性和方法
14 User user = sqlSession.selectOne("test.findUserById",1);
15 //使用spring来记性管理,在方法结束的时候就会自己关闭SqlSession
16 return user;
17 }
18 }复制代码
8、编写相应的Junit进行测试
1 package cn.test.ssm.dao;2 3 import cn.test.ssm.po.User;4 import org.apache.ibatis.session.SqlSession;5 import org.mybatis.spring.support.SqlSessionDaoSupport;6 7 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{8 9 // SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) 方法
10
11 @Override
12 public User findUserById(int id) throws Exception {
13 SqlSession sqlSession = getSqlSession(); //SqlSessionDaoSupport中有private SqlSession sqlSession;这个属性和方法
14 User user = sqlSession.selectOne("test.findUserById",1);
15 //使用spring来记性管理,在方法结束的时候就会自己关闭SqlSession
16 return user;
17 }
18 }复制代码
通过上面的测试程序得到结果
二、通过mapper代理方式
1、mapper代理的方式进行整合,实际上比较重要的就是mapper接口和mapper配置文件在同一包下,且文件名相同即可,下面是使用mapper代理的方式的结构
2、然后我么来配置UserMapper配置文件,需要注意的就是这个配置文件中需要将namespace设置为Mapper接口的路径
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">5 <!--mapper为根元素,namespace指定了命名空间-->6 <mapper namespace="cn.test.ssm.mapper.UserMapper">7 8 <select id="findUserById" parameterType="int" resultType="cn.test.ssm.po.User">9 SELECT * FROM t_user WHERE id = #{id}
10 </select>
11
12 </mapper>复制代码
3、然后我们配置applicationContext配置文件,这里介绍两种配置,一种是单个Mapper的配置,一种的进行包扫描的配置
①单个Mapper的配置
a)其中需要配置的就是MapperInterface接口和SqlSessionFactory两个属性,MapperInterface作用就是扫描指定的Mapper接口文件
<!--配置mapper通过MapperFactoryBean来进行配置,该类能够根据mapper接口生成代理对象--><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><!--配置mapper接口--><property name="mapperInterface" value="cn.test.ssm.mapper.UserMapper"></property><!--配置SqlSessionFactory--><property name="sqlSessionFactory" ref="sqlSessionFactory"></property></bean>复制代码
b)使用测试程序进行测试
1 package test;2 3 import cn.test.ssm.dao.UserDao;4 import cn.test.ssm.mapper.UserMapper;5 import cn.test.ssm.po.User;6 import org.junit.Before;7 import org.junit.Test;8 import org.springframework.context.ApplicationContext;9 import org.springframework.context.support.ClassPathXmlApplicationContext;
10
11 import static org.junit.Assert.*;
12
13 public class UserMapperTest {
14 private ApplicationContext applicationContext;
15
16 @Before
17 public void setUp() throws Exception {
18 //得到spring的容器
19 applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
20 }
21
22 @Test
23 public void findUserById() throws Exception{
24 UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
25
26 User user = userMapper.findUserById(1);
27
28 System.out.println(user);
29 }
30 }复制代码
c)通过观察日志分析结果如下:
②通过扫描mapper包的方式进行配置
a)其中basePackage就是设置扫描的包,当有多个包需要扫描的时候,使用逗号隔开
1 <!--通过配置扫描器的方式解决上面配置存在的不足:当我们的Mapper接口比较多的时候,上面单个配置Mapper显然会比较繁琐,
2 所以我们可以使用扫描器的方式进行配置,将mapper包下面的所有接口同时进行扫描配置,显然,mapper接口的文件名和Mapper
3 配置文件的文件名应该相同
4 -->
5 <!--通过下面的这种配置:可以自动创建对象并且向spring容器中注入-->
6 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
7 <property name="basePackage" value="cn.test.ssm.mapper"></property>
8 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
9 </bean>复制代码
b)测试程序和上面的测试程序相同,我们来运行测试程序,但是发现运行出了下面的异常
c)通过查询资料,发现是由于Spring版本和Jdk版本不支持的原因,因为本次测试使用的Spring版本是3.2.x,然后该版本不支持jdk1.8,所以就需要修改jdk版本为1.7,如下图所示
然后再次运行项目即可
转载于:https://juejin.im/post/5cdfed6ef265da1b6720dcaf
Mybatis和Spring整合相关推荐
- Mybatis与Spring整合之配置文件方式
Mybatis与Spring整合之配置文件 案例制作步骤--基础准备工作 ⚫ 环境准备 导入Spring坐标,MyBatis坐标,MySQL坐标,Druid坐标 ⚫ 业务类与接口准备 创建数据库表,并 ...
- mybatis和spring整合时这个报错,应该这样解决!
01 问题描述 今天在写mybatis和spring整合的时候,出现了个问题,其实也没有多难,就是自己没有仔细看,特此记录一下. 报错问题如下: org.springframework.beans.f ...
- 【MyBatis框架】mybatis和spring整合
spring和mybatis整合 1.整合思路 需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用SqlSessionFactor ...
- Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合
1.整合思路 需要Spring通过单例方式管理SqlSessionFactory. Spring和MyBatis整合生成代理对象,使用SqlSessionFactory创建SqlSession.(Sp ...
- Mybatis 与Spring整合及原理
Mybatis 与Spring原理分析 http://www.mybatis.org/spring/zh/index.html 这里我们以传统的Spring 为例,因为配置更直观,在Spring 中使 ...
- MyBatis - 6.Spring整合MyBatis
1.查看不同MyBatis版本整合Spring时使用的适配包: http://www.mybatis.org/spring/ 2.下载整合适配包 https://github.com/mybatis/ ...
- spring boot mybatis 整合_MyBatis学习:MyBatis和Spring整合
1. 整合的工程结构 首先我们来看下整合之后的工程结构是什么样的. 2. 配置文件 在于spring整合之前,mybatis都是自己管理数据源的,然后sqlSessionFactory是我们自己去注入 ...
- MyBatis与Spring整合
1. 使用Spring的数据源代替MyBatis的配置 <bean id="dataSource" class="org.springframework.jdbc. ...
- 【Spring】【MyBatis】Spring整合MyBatis01
这是一个Spring整合MyBatis的第一次尝试,对于文件的命名和存放位置,也许有些不太合理,请见谅 需要数据库的请查阅[Mybatis]学习笔记01:连接数据库,实现增删改 - 萌狼蓝天 本文档使 ...
最新文章
- html中sprite标签,Three.js模型标签
- 这应该是你见过的最全前端下载总结
- EasyUI中Datagride数据网格的简单使用
- 《大道至简》第七八章读后感
- [蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组
- React 篇 Search Bar and content Table
- 在使用代理的服务器上“curl: (6) Could not resolve host:“问题的解决方案
- android 模块混淆配置,使用android studio混淆多个模块
- AsciidocFX相关
- pn532跳坑小指南
- matlab xls转csv,使用python或Matlab将csv文件中的数据转换为csv文件
- 【HTML】HTML浏览器打印自定义页眉页脚
- 利用几何布朗运动模型预测股票价格_20200514_
- thinkphp 实现图片中的二维码识别
- dell笔记本驱动安装失败,Dell Vostro 5470 在安装读卡器驱动时失败
- 双语美文|治愈系英文段子,你对人生过敏吗
- python kivy 控件(小部件)的属性集合
- 对接阿里云opensearch
- 福建省计算机二级登录入口,福建省教育考试院官网登录入口
- 半桥BUCK电路—记录篇