要整合先做一个框架,具有简单的业务和对应的配置,然后再进一步将mybatis整合入
简单业务即查询和插入——插入页面输入信息存入数据库后跳转到查询全部信息的页面
步骤:
1.导入pom坐标
2.实体类account
3.dao层编写数据库交互的接口与对应的mapper.xml配置对应sql语句,以及sqlMapConfig.xml配置数据库
4.service层编写业务的接口与实现类,以及applicationContext.xml配置文件
5.controller层实现数据装入与页面转发,以及spring-mvc.xml配置文件
6.编写前端页面与配置web.xml文件
注意——上述所有xml文件除了mapper文件都放在resources包下【注意一下在resources包下创建包时的间隔符为. 与java包下创建包用的是 / 不然配置mapper.xml路径时候报错但又不知道是包名字有问题,把mapper.xml放到java里面去其实是之前我不知道是这种包名的问题。。。】
1.这里导入的坐标不包括整合所用的坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- servlet和jsp-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!-- mybatis相关-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
2.数据库建表account 写对应的java实体类
添加getter setter方法和 tostring方法即可
private Integer id;
private String name;
private double money;
3.dao层
接口方法
public void save(Account account);
public List<Account> findAll();
接口对应的xml文件,注意这个dtd的头
<?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.wzy.mapper.accountMapper.AccountMapper">
<insert id="save" parameterType="com.wzy.domain.Account">
insert into account values (#{id},#{name},#{money})
</insert>
<select id="findAll" resultType="com.wzy.domain.Account" >
select * from account
</select>
</mapper>
⭐注意:接口的方法名和xml文件中相应sql语句的id值必须相同。此外接口与xml文件最好同名然后放入同一个包里;或者xml文件放入resources包下,保证包路径与接口的路径一致(resources包创建路径用的分隔符——是/不是.)
配置完mapper接口与xml文件后需要在pom文件中导入一个build配置
⭐因为项目是maven项目,maven默认不编译xml文件,因此没有对应的xml文件,会报org.apache.ibatis.binding.BindingException异常
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名
jdbc.username=
jdbc.password=
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>
<!-- 插入properties文件-->
<properties resource="jdbc.properties"/>
<!-- 定义别名-->
<!-- <typeAliases>-->
<!-- <typeAlias type="类路径" alias="别名"/>-->
<!-- </typeAliases>-->
<!-- 插件配置-->
<!--<plugins>-->
<!-- <plugin interceptor=""></plugin>-->
<!--</plugins>-->
<!-- 定义数据库环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载mapper文件-->
<mappers>
<!-- <package name="mapper"/>-->
<mapper resource="mapper/AccountMapper.xml"/>
</mappers>
</configuration>
4.service层编写接口与方法
@Service("AccountService")
public class AccountServiceImpl implements AccountService {
public void save(Account account) {
try {
InputStream stream=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
SqlSession sqlSession = build.openSession(true);
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
mapper.save(account);
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public List<Account> findAll() {
InputStream resourceAsStream = null;
try {
InputStream stream= Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
SqlSession sqlSession = build.openSession(true);
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
List<Account> all = mapper.findAll();
sqlSession.close();
return all;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
注意记住要加上@service来将service对象的创建权交给spring
写applicationContext.xml的spring配置文件
即配置组件扫描
这里配置扫描就将controller排除在外,因为后面会有springmvc配置文件专门扫描接管这个controller层
每个部分管自己的就行
<!-- 组件扫描-->
<context:component-scan base-package="com.wzy">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
//
5.controller
编写controller类
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(value = "/save",produces = "text/html;charset=UTF-8")
public String save(Account account){
accountService.save(account);
return "redirect:/account/findAll";
}
@RequestMapping(value = "/findAll",produces = "text/html;charset=UTF-8")
public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
List<Account> all = accountService.findAll();
modelAndView.addObject("accountList",all);
modelAndView.setViewName("show");
return modelAndView;
}
}
再编写spring-mvc.xml配置文件
①组件扫描②配置mvc注解驱动③配置视图解析器(前后缀)④ 开放静态资源访问权限
<?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:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 组件扫描,扫描controller-->
<context:component-scan base-package="com.wzy.controller"/>
<!-- 配置mvc注解驱动-->
<mvc:annotation-driven/>
<!-- 内部资源视图解析器-->
<bean id="resourceResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开放静态资源访问权限-->
<mvc:default-servlet-handler/>
</beans>
6.前端页面
默认页面即index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加</title>
</head>
<body>
<h1>保存账户信息</h1>
<form name="accountForm" action="${pageContext.request.contextPath}/account/save" method="post">
用户名称<input type="text" placeholder="输入用户名称" name="name"><br/>
账户金额<input type="text" placeholder="输入账户金额" name="money"><br/>
<input type="submit" value="保存"><br/>
</form>
</body>
</html>
展示页面show.jsp放在web-inf包的pages包下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>展示数据</title>
</head>
<body>
<h1>展示账户数据列表</h1>
<table border="1">
<tr>
<th>用户id</th>
<th>用户名</th>
<th>账户余额</th>
</tr>
<c:forEach items="${accountList}" var="account">
<tr>
<th>${account.id}</th>
<th>${account.name}</th>
<th>${account.money}</th>
</tr>
</c:forEach>
</table>
</body>
</html>
配置web.xml
①配置spring监听器②配置springmvc的前端控制器③设置默认编码为utf-8
<!-- spring监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc的前端控制器-->
<servlet>
<servlet-name>dispatcherservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</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>
<!-- 设置编码-->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最终部署后初始页面如下
输入信息后
⭐上述的操作有哪些不足——在service层中,每次调用业务方法都要调用sqlmapconfig.xml文件来创建sqlsession对象,最终获取mapper对象,以及最后都需要手动关闭sqlsession对象
⭐⭐整合改进——将sqlsession对象的创建权交给spring管理,利用DI注入数据源对象与配置文件信息;再利用整合配置中提供的类,注入配置文件信息,交给spring来自动创建mapper对象,最后利用声明式事务控制来织入事务管理
一步步来
首先在pom中导入spring整合mybatis的依赖坐标
<!-- mybatis整合spring的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
1.移动数据源配置到spring配置中
2.配置sqlsessionfactory的bean并注入依赖
3.配置mapper扫描的bean并注入依赖
4.配置事务织入
1.删除sqlmapconfig中的数据源配置
在applicationcontext中配置
<!-- 1.加载jdbc.properties-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.配置数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
2.删除service层实现类中的方法实现代码
在applicationcontext文件中配置
⭐注意——这里注入的配置文件sqlMapConfig.xml,若没有用到插件或者别名配置等的话,文件到最后是空的,可以不用注入(注释掉)
<!--<!– 将sqlsession的创建权交给spring管理–>-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 加载xml配置-->
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>
3.在applicationcontext文件中配置
<!-- 扫描mapper.class文件所在的包,并自动为mapper创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wzy.mapper"/>
</bean>
配置完以上的东西后,spring容器中会自动创建相应的mapper对象,在service层的实现中自动注入即可
@Autowired
private AccountMapper accountMapper;
之后的方法中只需要利用mapper对象调用其中的方法即可
public void save(Account account) {
accountMapper.save(account);
}
findAll方法调用同上
4.在applicationcontext文件中配置声明式事务
<!-- 声明式事务控制-->
<!-- 平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务增强-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 事务的aop织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.wzy.service.impl.*.*(..))"></aop:advisor>
</aop:config>
至此大功告成