第一章、 搭建整合环境
1.1 ssm整合说明
1.2 搭建整合ssm环境
- 注:数据库中name字段需要调整字符集
1.3 ssm整合之编写Spring框架
- 最后测试中@Test执行后会有红字(log4j的警告:不影响执行)
- 在resources中引入log4j.properties即可
1.4.1 ssm整合之编写SpringMVC框架
- web.xml中配置前端控制器以及中文乱码过滤器
- resources中创建springmvc.xml
- 然后就可以发请求,去访问Controller中的方法。
- 编写index.jsp来模仿一个请求
- 编写Contorller类及方法
- 向控制层指定多的页面跳转
1.4.2 ssm整合之Spring整合SpringMVC框架
* 注:该监听器是Spring已经提供好的
- 配置监听器需要在pom.xml导入包:spring-web
- 用到里面的ContextLoaderListener
- web.xml中配置spring的监听器
- 配置Spring监听器及解决加载问题
<!-- 配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件--> <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>
- 注:默认只加载WEB-INF目录下的applicationContext.xml配置文件
- 解决方法一:复制一份到WEB-INF目录下【不建议】
- 解决方法二:将配置文件在resources下做一个统一管理【建议】
- 表明加载类路径下的配置文件,ContextLoaderListener监听器就知道去找类路径下的文件。
<!-- 设置配置文件的路径--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
- web.xml中三大组件齐全了【Servlet(SpringMVC的前端控制器),过滤器(中文乱码),监听器(Spring的)】
- 这时候启动服务器,就将Spring配置文件,SpringMVC配置文件都加载了–>Service和Controller两个类都放到了容器当中
- 这时候就可以用依赖注入了。
- 编辑AccountController类,调用Service方法
- 能调用其中的方法,表示整合成功。
@Controller @RequestMapping("/account") public class AccountController { //该注解表示按类型自动注入 @Autowired private AccountService accountService; @RequestMapping("/findAll") public String findAll(){ System.out.println("表现层:查询所有账户。。。"); //调用Service方法(如果上面能注入成功) accountService.findAll(); return "list"; } }
1.5.1 ssm整合之搭建和测试Mybatis环境
- 在AccountDao类中的方法上加注解
- 比如查询所有信息
- 保存账户信息
public interface AccountDao { //查询所有账户信息 @Select("select * form account") public List<Account> findAll(); //保存账户信息(注解中#{}表达式:表示从account表中取值(对应的属性)) @Insert("insert into account(name, money) values(#{name}, #{money})") public void saveAccount(Account account); }
- 编写核心配置文件
- 创建一个xml文档(new一个file文件,将xml后缀名写上即可)
- 创建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">
- 创建SqlMapConfig.xml编写跟标签:内容
<configuration> <!-- 配置环境 --> <environments default="mysql"> <environment id="mysql"> <!-- 表示事务类型--> <transactionManager type="JDBC"/> <!-- 表示应用连接池:如果不用前面加UN--> <dataSource type="POOLED"> <!-- 里面配置呢几个属性--> <!-- 配置驱动--> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 是请求的连接--> <property name="url" value="jdbc:mysql:///ssm"/> <!-- 用户名--> <property name="username" value="root"/> <!-- 密码--> <property name="password" value="1234"/> </dataSource> </environment> </environments> <!-- 引入映射配置文件:如果没有就将AccountDao接口路径传入--> <mappers> <!-- 1. 本来用resource属性 里面写的是dao文件中配置好的xml文件(如:cn.blood.dao.xxx.xml) 2. 这里没有该xml文件,所以用class属性 里面写接口类的全路径--> <!-- <mapper class="cn.blood.dao.AccountDao"/> --> <!-- 【重点】下面与上面区别:以后再dao包中加任何接口,都可以扫描到(范围问题)--> <package name="cn.blood.dao"/> </mappers> </configuration>
- 编写测试类:TsetMybatis
- 加载配置文件
- Resource导入的是import org.apache.ibatis.io.Resources;包下的
- 调用getResourceAsStream方法,将配置文件全名复制进来
- 将异常抛出(Exception)
- 会返回一个InputStream输入流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
- 有了输入流,创建SqlSessionFactory对象(工厂对象)
- new一个SqlSessionFactoryBuilder
new SqlSessionFactoryBuilder().build(is); * 注:build方法选择inputStream流的
- 会返回一个SqlSessionFactory工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
- 有了工厂对象,使用工厂对象创建SqlSession对象
- 使用openSession();方法来拿到SqlSession返回值
SqlSession session = factory.openSession();
- 用SqlSession对象获取–>代理对象
AccountDao dao = session.getMapper(AccountDao.class);
- 代理拿到就可以查询所有数据(并遍历显示出来)
- 因为输出account,所以需要给Account类中加toString()方法
List<Account> list = dao.findAll(); for(Account account : list){ System.out.println(account); }
- 关闭资源
session.close(); is.close();
- 加载配置文件
- 执行后的运行结果:
- 注: ssm整合之编写Mybatis框架测试保存方法
TestMybatis测试类中 /* 测试保存 */ @Test public void run2() throws Exception { Account account = new Account(); account.setName("熊大"); account.setMoney(400d); //1. 加载配置文件(Mybatis的配置文件) InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 有了输入流,创建SqlSessionFactory对象(工厂对象) SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //3. 有了工厂对象,使用工厂对象创建SqlSession对象 SqlSession session = factory.openSession(); //4. 用SqlSession对象获取-->代理对象 AccountDao dao = session.getMapper(AccountDao.class); //5. 保存 dao.saveAccount(account); //6. 提交事务 session.commit(); //6. 关闭资源 session.close(); is.close(); }
1.5.2 ssm整合之Spring整合Mybatis框架
- 在applicationContext.xml中配置:其实就是将刚才Mybatis配置文件中的东西转移到Spring配置中(让Spring来帮忙创建,代理,存到IOC的容器当中)
<!-- Spring整合MyBatis框架--> <!-- 配置连接池(c3p0)--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///ssm"/> <property name="user" value="root"/> <property name="password" value="1234"/> </bean> <!-- 配置SqlSessionFactory工厂--> <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.blood.dao"/> </bean>
- 当补充完applicationContext.xml,由于和SqlMapConfig.xml功能一样,就将SqlMapConfig.xml直接删除即可(删完测试类TestMybatis用不了了)
- 在AccountDao接口上加,,repository注解
- 在AccountServiceImple中注入accountDao接口
//写个这个注解相当于:把这个类交给IOC的容器进行了管理 @Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; public List<Account> findAll() { System.out.println("业务层:查询所有账户..."); return accountDao.findAll(); } public void saveAccount(Account account) { System.out.println("业务层:保存所有账户..."); accountDao.saveAccount(account); } }
- 全部讲完,整合一边(这时候保存的方法用不了)
- AccountController的补充
/** * 账户web */ @Controller @RequestMapping("/account") public class AccountController { //该注解表示按类型自动注入 @Autowired private AccountService accountService; @RequestMapping("/findAll") public String findAll(Model model){ //想要存值用Model对象 System.out.println("表现层:查询所有账户。。。"); //调用Service方法(如果上面能注入成功) List<Account> list = accountService.findAll(); model.addAttribute("list", list); return "list"; } }
- list.jsp的补充
<%-- Created by IntelliJ IDEA. User: WarGod Date: 2020/9/3 Time: 0:12 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <!-- 下面的是引入的jstl标签库--> <%@ 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="acount"> ${acount.name} </c:forEach> </body> </html>
1.5.3 ssm整合之Spring整合Mybatis框架配置事务
- 没写保存的原因–>因为保存需要手动来写事务的管理。
- 在Spring中学过一个声明式事务管理
- 在applicationContext.xml中进行配置
<!-- 配置Spring框架声明式事务管理--> <!-- 配置事务管理器(是Mybatis框架用到的事务管理器,是一个实现类)--> <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> <!-- public可以省略--> <aop:advisor advice-ref="txAdvice" pointcut="execution(public * cn.blood.service.impl.*ServiceImpl.*(..))"/> </aop:config>
- 这时说明已经对Service中的方法已经进行了事务管理
- 编写index.jsp做测试
<h3>测试包</h3> <form action="account/save" method="post"> 姓名:<input type="text" name="name"><br/> 金额:<input type="text" name="money"><br/> <input type="submit" value="保存"><br/> </form>
- 编写AccountController
/** * 用来保存l * @return */ @RequestMapping("/save") public void save(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException { //response就可以实现重定向了 accountService.saveAccount(account); //表示:保存走完了直接做一个重定向-->定向到findAll这个方法 response.sendRedirect(request.getContextPath()+"/account/findAll"); return ; }
- 重点:当从前端传入的中文乱码时候
- 编辑application.xml配置文件,将里面(Spring整合MyBatis框架)中JDBC参数配置中jdbcUrl进行修改。
修改前 <property name="jdbcUrl" value="jdbc:mysql:///ssm"/> 修改后 <property name="jdbcUrl" value="jdbc:mysql:///ssm?useUnicode=true&characterEncoding=utf-8"/>
- 详细看连接->>
数据库插入中文变成问号问题