先保证每个框架都能使用,再保证Spring能够整合
Spring整合MVC框架
- 服务器启动的时候,就把Spring的配置文件路径放进mvc配置文件当中
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
可以在controller里注入service类
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping("/findall")
public String findAll(){
System.out.println("表现层:查询所有账户信息");
//调用spring里的service的方法
accountService.findall();
return "list";
}
}
SqlMapConfig的配置
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="cn.itcast.dao"/>
</mappers>
</configuration>
接口配置Sql语句
public interface AccountDao {
@Select("select*from account")
public List<Account> findall();
@Insert("insert into account (name,money) values (#{name},#{money})")
public void saveAccount(Account account);
}
测试类
- findall接收数据并展示
public class TestMyBatis {
@Test
public void run1() throws IOException {
InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
AccountDao dao=session.getMapper(AccountDao.class);
List<Account> list=dao.findall();
for(Account account:list)
{
System.out.println(account);
}
session.close();
in.close();
}
}
Spring整合MyBatis
- 把Sql的信息放进applicationContext中,可以去掉SqlMapConfig文件
主页的处理方法
- 主页调用业务层的方法
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping("/findall")
public String findAll(Model model){
System.out.println("表现层:查询所有账户信息");
//调用spring里的service的方法
List<Account> list=accountService.findall();
model.addAttribute("list",list);
return "list";
}
}
业务层调用持久层的方法
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public List<Account> findall() {
System.out.println("业务层:查询所有账户");
return accountDao.findall();
}
@Override
public void saveAccount(Account account) {
System.out.println("业务层:保存账户");
accountDao.saveAccount(account);
}
}
Spring配置文件
- 添加MyBatis的配置内容
<!--开启注解的扫描,希望处理service和dao,controller不需要Spring框架去处理-->
<context:component-scan base-package="cn.itcast" >
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--Spring整合MyBatis-->
<!--配置连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置SqlSessionFactoryg工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置AccountDao接口所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itcast.dao"/>
</bean>
</beans>
持久层
- 只需要写接口,不需要写实现类
@Repository
public interface AccountDao {
@Select("select*from account")
public List<Account> findall();
@Insert("insert into account (name,money) values (#{name},#{money})")
public void saveAccount(Account account);
}
展示结果页面
- 使用遍历的语法
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%--遍历--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>查询所有账户信息</h3>
<c:forEach items="${list}" var="account">
${account.name}
${account.money}
</c:forEach>
</body>
</html>
保存方法
- 需要进行事务管理
事务管理的配置
<!--配置声明式事务管理-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find" read-only="true"/>
<tx:method name="*" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!--配置AOP增强-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.service.impl.*ServiceImpl.*(..))"/>
</aop:config>
主页设置表单
<head>
<title>Title</title>
</head>
<body>
<a href="account/findall">测试</a>
<h3>测试包</h3>
<form action="account/save" method="post">
姓名:<input type="text" name="name"/><br/>
金额:<input type="text" name="money"/><br/>
<input type="submit" value="保存"/>
</form>
</body>
</html>
表单处理
@RequestMapping("/save")
public void Save(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("save");
accountService.saveAccount(account);
//重定向
response.sendRedirect(request.getContextPath()+"/account/findall");
return;
}