今天我们来学习Spring整合Mybatis。
开发环境:Ide:MyEclipse 2017 CI
JDK:1.8
首先我们简单的认识下这两个框架
1、Mybatis
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
入门:1.所需Jar包
2、数据库搭建
1 DROP TABLE IF EXISTS `smbms_user`; 2 CREATE TABLE `smbms_user` ( 3 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 4 `userCode` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户编码', 5 `userName` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名称', 6 `userPassword` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码', 7 `gender` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)', 8 `birthday` date DEFAULT NULL COMMENT '出生日期', 9 `phone` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',10 `address` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',11 `userRole` bigint(20) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',12 `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',13 `creationDate` datetime(0) DEFAULT NULL COMMENT '创建时间',14 `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',15 `modifyDate` datetime(0) DEFAULT NULL COMMENT '更新时间',16 PRIMARY KEY (`id`) USING BTREE17 ) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;18 19 -- ----------------------------20 -- Records of smbms_user21 -- ----------------------------22 INSERT INTO `smbms_user` VALUES (1, 'admin', '系统管理员', '1234567', 1, '1983-10-10', '13688889999', '北京市海淀区成府路207号', 1, 1, '2013-03-21 16:52:07', NULL, NULL);23 INSERT INTO `smbms_user` VALUES (2, 'liming', '李明', '0000000', 2, '1983-12-10', '13688884457', '北京市东城区前门东大街9号', 2, 2, '2014-12-31 19:52:09', NULL, NULL);24 INSERT INTO `smbms_user` VALUES (5, 'hanlubiao', '韩路彪', '0000000', 2, '1984-06-05', '18567542321', '北京市朝阳区北辰中心12号', 2, 3, '2014-12-31 19:52:09', NULL, NULL);25 INSERT INTO `smbms_user` VALUES (6, 'zhanghua', '张华', '0000000', 2, '1983-06-15', '13544561111', '北京市海淀区学院路61号', 3, NULL, '2013-02-11 10:51:17', NULL, NULL);26 INSERT INTO `smbms_user` VALUES (7, 'wangyang', '王洋', '0000000', 2, '1982-12-31', '13444561124', '北京市海淀区西二旗辉煌国际16层', 3, NULL, '2014-06-11 19:09:07', NULL, NULL);27 INSERT INTO `smbms_user` VALUES (8, 'zhaoyan', '赵燕', '0000000', 2, '1986-03-07', '18098764545', '北京市海淀区回龙观小区10号楼', 3, NULL, '2016-04-21 13:54:07', NULL, NULL);28 INSERT INTO `smbms_user` VALUES (10, 'sunlei', '孙磊', '0000000', 3, '1981-01-04', '13387676765', '北京市朝阳区管庄新月小区12楼', 3, NULL, '2015-05-06 10:52:07', NULL, NULL);29 INSERT INTO `smbms_user` VALUES (11, 'sunxing', '孙兴', '0000000', 3, '1978-03-12', '13367890900', '北京市朝阳区建国门南大街10号', 3, NULL, '2016-11-09 16:51:17', NULL, NULL);30 INSERT INTO `smbms_user` VALUES (12, 'zhangchen', '张晨', '0000000', 3, '1986-03-28', '18098765434', '朝阳区管庄路口北柏林爱乐三期13号楼', 3, NULL, '2016-08-09 05:52:37', 1, '2016-04-14 14:15:36');31 INSERT INTO `smbms_user` VALUES (13, 'dengchao', '系邓超', '0000000', 1, '1981-11-04', '13689674534', '北京市海淀区北航家属院10号楼', 3, NULL, '2016-07-11 08:02:47', NULL, NULL);32 INSERT INTO `smbms_user` VALUES (14, 'yangguo', '系杨过', '0000000', 1, '1980-01-01', '13388886623', '北京市朝阳区北苑家园茉莉园20号楼', 3, NULL, '2015-02-01 03:52:07', NULL, NULL);33 INSERT INTO `smbms_user` VALUES (15, 'zhaomin', '系赵敏', '0000000', 1, '1987-12-04', '18099897657', '北京市昌平区天通苑3区12号楼', 2, NULL, '2015-09-12 12:02:12', NULL, NULL);
3、导入Log4j配置
log4j.rootLogger=debug, stdout,logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=jbit.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}%l %F %p %m%n
4、导入Jdbc配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.uri=jdbc\:mysql\://localhost\:3306/smbms?useUnicode\=true&characterEncoding\=utf8 jdbc.name=root jdbc.pwd=1234
项目目录:
Mybatis是一个开源的持久化框架,用于优化项目中的Dao的Impl,替代Dao的为Mapper的接口,具体实现一样,只是名字不一,便于区分
我们在对应的Mapper中写入具体需要执行的操作,并且建立对应相同名字的Xml文件
类:UserMapper.java
package com.mapper;import java.util.List;import com.entuty.User;public interface UserMapper { /* * 查询所有的用户 */ List<User> Cxall(); }
UserMapper.xml配置
1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >3 4 <mapper namespace="com.mapper.UserMapper">5 <select id="Cxall" resultType="User">6 select * from smbms_user7 </select>8 </mapper>
注意上述4行 需要引入Mapper命名空间,如果在整合Spring时使用的是Mapper 代理的方式需要注意 Id必须和UserMapper中的方法名保持一致。
创建SqlMapperConfig.xml(Mybatis核心配置文件)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" > 3 <configuration> 4 <properties resource="Jdbc.properties"></properties> 5 <typeAliases> 给当前包中的所有类取别名,别名为类名 6 <package name="com.entuty" /> 7 </typeAliases> 8 <environments default="development"> 配置数据源 9 <environment id="development">10 <transactionManager type="JDBC"></transactionManager>11 <dataSource type="POOLED">12 <property name="driver" value="${jdbc.driver}" />13 <property name="url" value="${jdbc.uri}" />14 <property name="username" value="${jdbc.name}" />15 <property name="password" value="${jdbc.pwd}" />16 </dataSource>17 </environment>18 </environments>19 <mappers> 配置映射的Mapper20 <mapper resource="com/mapper/UserMapper.xml"/>21 </mappers>22 </configuration>
Mybatis环境搭建完毕。
2、Spring
导入Spring Jar包 其中的核心包是
创建业务层和业务层的实现类
创建Spring核心配置文件 applicationContext.xml
在Spring发布的时候并未想到和Mybatis整合,而后也没为了mybatis发布版本,所以是由Mybtais 提供的整合。
1、优化数据源 将数据源转交给Spring容器管理,那么Mybatis配置中的原有配置数据源以及 对应实现类的Mapper.xml都交于Spring容器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" > 3 <configuration> 5 <typeAliases> 给当前包中的所有类取别名,别名为类名 6 <package name="com.entuty" /> 7 </typeAliases> 8 </configuration>
2.applicationContext.xml
将jdbc配置也使用Spring获取 同时使用Dbcp数据源创建JDBc链接<?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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- DBCP/C3p0 --> <context:property-placeholder location="jdbc.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.uri}"></property> <property name="username" value="${jdbc.name}"></property> <property name="password" value="${jdbc.pwd}"></property> </bean> 在Mybatis中 用户执行一个操作的顺序是 首先获取Sqlsessionfactoey 然后由Selsessionfactory创建 Sqlsession 之后确认是Mapper代理还是 原生的Steamnemet 在Spring中配置SqlsessionFactoryBean <!-- 会话工厂通过Spring获取 --> <!-- 配置org.mybatis.spring.SqlSessionFactoryBean 将会话工厂交给Spring --> <bean id="SqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定Mybatis核心配置文件位置 --> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> <!-- 指定数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 加载映射文件 --> <property name="mapperLocations"> <list> <value>com/mapper/*.xml</value> </list> </property> </bean> </beans>
Userserviceimpl.Java
package com.service.impl;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.support.SqlSessionDaoSupport;import com.entuty.User;import com.mapper.UserMapper;import com.service.Userservice;public class Userserviceimpl implements Userservice { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } @Override public List<User> Cxall() { return userMapper.Cxall(); } }
对 private UserMapper userMapper; 进行注入
同时使Spring容器来扫描对应的Mapper
<bean id="map" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mapper"></property> </bean> <!-- 配置工厂 --> <bean id="sqlFactory" class="com.service.impl.Userserviceimpl"> <property name="userMapper" ref="userMapper" /> </bean>
测试:
package com.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.mybatis.spring.SqlSessionFactoryBean;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.entuty.User;import com.mapper.UserMapper;import com.service.Userservice;import com.service.impl.Userserviceimpl;public class Test { public static void main(String[] args) { ApplicationContext ap=new ClassPathXmlApplicationContext("applicationContext.xml"); Userservice us=(Userservice) ap.getBean("sqlFactory"); List<User> arr=us.Cxall(); for (User user : arr) { System.out.println(user.getUsername()); } } }
结果:
DEBUG - Fetching JDBC Connection from DataSource DEBUG - JDBC Connection [1606286799, URL=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8, UserName=root@localhost, MySQL-AB JDBC Driver] will not be managed by SpringDEBUG - ==> Preparing: select * from smbms_user DEBUG - ==> Parameters: DEBUG - <== Total: 22DEBUG - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@757277dc] DEBUG - Returning JDBC Connection to DataSource 系统管理员 李明 韩路彪 张华 王洋 赵燕 孙磊 孙兴 张晨 系邓超 系杨过 系赵敏 admin 张三 张三 张三啊 张三啊 张三啊 张三啊 张三啊 张三啊 张三啊
感谢大家,如有问题,敬请大牛指正!
共同学习,写下你的评论
评论加载中...
作者其他优质文章