终极版:Mybatis整合Spring配置
第一部分:配置 Spring 框架
配置 SpringMVC 的步骤:
配置流程图:
SpringMVC 配置
1. 导入包(那些包,基本包 5 个,1 个日志依赖包,2 个 webmvc 支持包)
<!-- jsp --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- spring mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.16.RELEASE</version> </dependency>
2. 构建一个请求
<form action="${pageContext.request.contextPath }/admin/addAdmin" method="post"> 管理员名称:<input name="admin_name" type="text"><input type="submit" value="增加管理员"> </form>
3. 编辑 web.xml 配置核心控制器
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd "> <!-- 编码支持过滤器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定配置类的位置,指定包名会加载该包下的所有配置类 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>cn.mgy.config</param-value> </init-param> <!-- 修改支持配置类的Spring容器 --> <init-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4. 编写业务控制器
package cn.mgy.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.annotation.SessionScope; @Controller @SessionScope @RequestMapping(value="/admin") public class AdminController { @RequestMapping(value="/addAdmin") public String addAdmin() { System.out.println("-增加管理员-"); return "/add.jsp"; } }
5. 编写配置类
-- 容器配置类
@Configuration @ComponentScan(basePackages="cn.gzsxt") public class ContextConfig { }
--SpringMVC 配置类
package cn.mgy.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc //<mvc:annotation-driver> public class MvcConfig extends WebMvcConfigurerAdapter { //<mvc:default-servlet-handler>,放开静态资源访问 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
6. 编写返回的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>增加学生成功的界面</title> </head> <body> <h3>增加学生成功</h3> </body> </html>
第二部分:配置 Mybatis 框架
Mybatis 配置流程图:
配置步骤说明:
1. 导入包(JDBC 驱动包,Mybatis 框架包,junit)
<!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2. 创建一个总配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <configuration> <environments default="rbac"> <environment id="rbac"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/rbac" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> </configuration>
3. 创建一个帮助类获得会话对象
package cn.mgy.utils; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtils { public static final SqlSessionFactory SESSION_FACTORY=MybatisUtils.createSqlSessionFactory(); private static SqlSessionFactory createSqlSessionFactory() { try { //读取配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //创建会话工厂构建类对象 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); //返回会话工厂 return builder.build(reader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static SqlSession getSqlSession() { return SESSION_FACTORY.openSession(); } public static void main(String[] args) { System.out.println(MybatisUtils.getSqlSession()); } }
4. 创建一个映射接口(包括操作 SQL 语句的)
package cn.mgy.mapper; import java.util.Map; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; /** * 管理员映射接口,用于操作tb_admin表 * * @author ranger * */ public interface AdminMapper { /** * 增加管理员记录 * * @param admin * @return */ @Insert("INSERT INTO tb_admin(admin_name, admin_account, admin_pwd, admin_status, admin_create_date, role_id) VALUES (#{admin_name}, #{admin_account}, #{admin_pwd}, #{admin_status}, #{admin_create_date}, #{role_id})") @Options(useGeneratedKeys = true, keyProperty = "admin_id") int insert(Map<String, Object> admin); }
5. 在总配置文件加载该映射接口
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <configuration> <environments default="rbac"> <environment id="rbac"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/rbac" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper class="cn.mgy.mapper.AdminMapper"/> </mappers> </configuration>
6. 编写一个测试类,测试插入数据
package cn.mgy.test.mapper; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import cn.mgy.mapper.AdminMapper; import cn.mgy.utils.MybatisUtils; public class AdminMapperTest { @Test public void insert() { SqlSession session = MybatisUtils.getSqlSession(); AdminMapper adminMapper = session.getMapper(AdminMapper.class); Map<String, Object> admin=new HashMap<String, Object>(); admin.put("admin_name", "admin"); admin.put("admin_create_date", new Date()); adminMapper.insert(admin); System.out.println(admin.get("admin_id")); session.commit(); session.close(); } }
第三部分:整合这连个框架
配置步骤:
1. 导入包(那些包)
(1)Mybatis-Spring 整合包
(2)第三方数据源包(DBCP2)
(3)SpringJdbc+SpringTx(事务的支持)
<!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.16.RELEASE</version> </dependency> <!-- dbcp2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.2.0</version> </dependency> <!-- spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.16.RELEASE</version> <scope>test</scope> </dependency>
2. 创建数据源
@Value("${db.driverClassName}") private String driverClassName; @Value("${db.url}") private String url; @Value("${db.username}") private String username; @Value("${db.password}") private String password; //第一步:创建一个数据源 @Bean public DataSource getDataSource() { BasicDataSource dataSource=new BasicDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; }
3. 创建支持 Spring 数据源的会话工厂
//第二步:获得会话工厂 @Bean(name="sqlSessionFactory") public SqlSessionFactory getSessionFactory() { SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean(); //指定使用的数据源 factoryBean.setDataSource(this.getDataSource()); try { factoryBean.afterPropertiesSet(); return factoryBean.getObject(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
4. 扫描映射接口的动态对象到 Spring 容器里面
//扫描映射接口的动态对象到Spring容器 @MapperScan(basePackages="cn.gzsxt.mapper",annotationClass=Mapper.class)
5. 配置事务代理
@EnableTransactionManagement //<tx:annotation-driver> // ② //第四步:配置事务代理 @Bean // ① public DataSourceTransactionManager getDataSourceTransactionManager() { DataSourceTransactionManager dstm=new DataSourceTransactionManager(); //指定需要事务代理的数据源 dstm.setDataSource(this.getDataSource()); return dstm; }
6. 删除之前 Mybatis 帮助类以及配置文件。因为 Mybatis 配置好整合以后,已经交由 Spring 管理了。所以不需要原来的配置文件以及帮助类了!!
7. 修改映射接口增加 @Mapper 注解
package cn.mgy.mapper; import java.util.Map; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; /** * 管理员映射接口,用于操作tb_admin表 * * @author ranger * */ @Mapper //增加扫描注解!!! public interface AdminMapper { /** * 增加管理员记录 * * @param admin * @return */ @Insert("INSERT INTO tb_admin(admin_name, admin_account, admin_pwd, admin_status, admin_create_date, role_id) VALUES (#{admin_name}, #{admin_account}, #{admin_pwd}, #{admin_status}, #{admin_create_date}, #{role_id})") @Options(useGeneratedKeys = true, keyProperty = "admin_id") int insert(Map<String, Object> admin); }
8. 编写一个测试类测试
package cn.mgy.test.mapper; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import cn.mgy.config.ContextConfig; import cn.mgy.config.DataConfig; import cn.mgy.mapper.AdminMapper; @RunWith(value=SpringJUnit4ClassRunner.class) @ContextConfiguration(classes= {ContextConfig.class,DataConfig.class}) @WebAppConfiguration //声明该单元测试在SpringMVC项目里面的 public class AdminMapperTest { @Autowired private AdminMapper adminMapper; @Test public void insert() { Map<String, Object> admin=new HashMap<String, Object>(); admin.put("admin_name", "ranger"); admin.put("admin_create_date", new Date()); adminMapper.insert(admin); System.out.println(admin.get("admin_id")); } }