1.在eclipse中配置好“新建动态WEB”,准备好SPRINGMVC/Mybatis相关Jar。
主要代码:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>springmvcmybatis</display-name>
<servlet>
<servlet-name>springmvcmybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvcmybatis</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvcmybatis-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
springmvcmybatis-servlet.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.springmvcmybatis.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
springmvcmybatis-config.xml
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.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">
<context:component-scan base-package="com.springmvcmybatis.po"></context:component-scan>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/javadb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true" />
<property name="username" value="root" />
<property name="password" value="xxxxxxxxxxx" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven
transaction-manager="transactionManager" />
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:mybatis-config.xml" />
</bean>
<bean id="customerMapper"
class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.springmvcmybatis.mapper.CustomerMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean name="/home" class="com.springmvcmybatis.controller.HomeController"></bean>
</beans>
mybatis-config.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>
<!--配置别名 -->
<typeAliases>
<package name="com.springmvcmybatis.po" />
</typeAliases>
<!--配置Mapper的位置 -->
<mappers>
<!-- <mapper resource="com/springmvcmybatis/po/CustomerMapper.xml" />
-->
<mapper resource="com/springmvcmybatis/mapper/CustomerMapper.xml" />
</mappers>
</configuration>
com.springmvcmybatis.mapper/CustomerMapper.java
package com.springmvcmybatis.mapper;
import com.springmvcmybatis.po.Customer;
public interface CustomerMapper {
Customer findCustomerById(int id);
}
com.springmvcmybatis.mapper/CustomerMapper.xml
<?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.springmvcmybatis.mapper.CustomerMapper">
<!--根据id查询客户信息 -->
<select id="findCustomerById" parameterType="Integer"
resultType="customer">
select * from t_customer where id = #{id}
</select>
</mapper>
CUSTOMER.java
package com.springmvcmybatis.po;
/**
*
*/
public class Customer {
private Integer id;
private String username;
private String jobs;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", username=" + username +
", jobs=" + jobs + ", phone=" + phone + "]";
}
}
com.springmvcmybatis.controller/HomeController.java
package com.springmvcmybatis.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.springmvcmybatis.mapper.CustomerMapper;
import com.springmvcmybatis.po.Customer;
@Controller
public class HomeController {
@RequestMapping("/home")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
ApplicationContext ac = new ClassPathXmlApplicationContext("springmvcmybatis-config.xml");
CustomerMapper cm = (CustomerMapper)ac.getBean(CustomerMapper.class);
Customer c = cm.findCustomerById(1);
System.out.println(c.getUsername());
mv.addObject("msg","Hi,我是Home的变量。"+c.getUsername());
return mv;
}
}
WEB-INF/jsp/home.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
hello ,I am home.${msg}
</body>
</html>
Jars 列表:
注意:
1.阿里云服务器 MySql8远程功能启用:在mysql的cmd模式下:新建用户并授权,代码:
mysql> CREATE USER 'root1'@'%' IDENTIFIED BY 'password'; (您可以创建一个root1)
mysql> grant all privileges on *.* to 'root1'@'%';
程序连接串需要为:jdbc:mysql://1.2.3.4:3306/javadb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
2.在测试类中一般这样写:
ApplicationContext ac = new ClassPathXmlApplicationContext("springmvcmybatis-config.xml");
CustomerMapper cm = (CustomerMapper)ac.getBean(CustomerMapper.class);
Customer c = cm.findCustomerById(1);
以获得数据库数据,但正式中应这样:先写一个Util,再在config.xml中配置一下即可。
package com.springmvcmybatis.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
//import org.springframework.stereotype.Component;
//@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
}
配置:<bean id="springContextUtil" class="com.springmvcmybatis.SpringContextUtil" scope="singleton"></bean>
最后在Controller中使用时:
CustomerMapper cm = SpringContextUtil.getBean("CustomerMapper");
Customer c = cm.findCustomerById(1);
3.在name-config.xml中写上 <context:component-scan base-package="com.springmvcmybatis"></context:component-scan>
后,即不用再单个写有注解的Controller的bean,会自动识别。
4.SSM中css , js 等静态文件配置方法:
a)将css , js等文件夹放到WebContent目录下。
b)在name-servlet.xml中配置:
<mvc:annotation-driven />
<mvc:resources location="/WEB-INF/demo/" mapping="/demo/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
5. jsp包含文件中数据传递方法:在包含文件中写:
<jsp:include page="/WEB-INF/jsp/control/header.jsp" flush="true">
<jsp:param value="0" name="id"/>
</jsp:include>
被包含文件中取值方法 : ${param.id} 或 <% String id = request.getParameter("id")%>
6.使用 mybatis pagehelper插件做分页:参考:PageHelper实现Mybatis的插件分页(SSM+maven+jsp)_m0_38105115的博客-CSDN博客
先下载:https://github.com/pagehelper/Mybatis-PageHelper
和 jsqlparser 放到libs下。
然后在 edu-config.xml中的<bean id="sqlSessionFactory" > 中加入:
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
</bean>
</array>
</property>
然后是代码
public interface RoleMapper {
Role getById(int id);
Page<Role> getList();
}
<select id="getList" resultType="role">
select * from role
</select>
SERVICE:
public interface RoleService {
Role getById(int id);
Page<Role> getList(int page,int size);
}
@Service("roleService")
class RoleServiceImpl implements RoleService {
RoleMapper rm ;
@Override
public Role getById(int id) {
rm = SpringContextUtil.getBean("roleMapper");
Role r = rm.getById(id);
return r;
}
@Override
public Page<Role> getList(int page,int size){
rm = SpringContextUtil.getBean("roleMapper");
PageHelper.startPage(page, size);
return rm.getList();
}
}
Controller:
public String list(int page,int size,ModelMap model) {
Page<Role> roleInfo = rs.getList(page, size);
List<Role> roleList = roleInfo.getResult();
long count = roleInfo.getTotal();
for(Role r:roleList) {
System.out.println("R:"+r.getName());
}
7.Restful风格地址配置:
1).加入jackson相关的配置:jackson-annotations-2.11.0.jar jackson-core-2.11.0.jar jackson-databind-2.11.0
2).在Controller中这样写即可:
@RequestMapping("/get/{id}")
public String get(@PathVariable("id")int id,ModelMap model) {
// User u = us.getById(id);
// model.addAttribute("user", u);
return "course/get";
}
8.Eclipse中SSM+Freemarker使用方法(非Boot架构):
1.在SSM-servlet.xml中配置两个BEAN:
<!--freemarker视图解析器配置-->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!--视图解析器类-->
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<!--后缀配置-->
<property name="suffix" value=".ftl"/>
<!--设置各种属性覆盖-->
<!--允许重写Request属性-->
<property name="allowRequestOverride" value="true"/>
<!--允许重写Session属性-->
<property name="allowSessionOverride" value="true"/>
<!--设置request Attribute添加到模型-->
<property name="exposeRequestAttributes" value="true"/>
<!--设置session Attribute添加到模型-->
<property name="exposeSessionAttributes" value="true"/>
<!--页面内容类型-->
<property name="contentType" value="text/html;charset=utf-8"/>
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
2.在/WEB-INF/ftl/下加文件index.ftl,在lib下放入freemarker.jar即可。
9.去掉EClipse项目中路径中的项目名的方法:
打开eclipse->Servers->server.xml中,找到 <Context docBase="cms" path="/" reloadable="true",中的path改为: "/"即可。
10.在SSM+jsp模板中使用JSTL,除了jstl.jar和standard.jar还要加入下面这个JAR:
XercesImpl.jar下载地址: http://www.apache.org/dist/xerces/j/
xalan.jar下载地址: http://xml.apache.org/xalan-j/index.html
11.在SSM中集成Log4J的步骤:
1.新建一个名为:log4j.properties 放到项目java根下,内容:
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache.ibatis=INFO
log4j.logger.com.name=DEBUG
2.在mybatis-config里的第二个位置加入配置:
<settings>
<!-- 输出日志配置 -->
<setting name="logImpl" value="LOG4J" />
<!-- 这个配置使全局的映射器启用或者禁用二级缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 全局启用或者禁用延迟加载。当禁用时,所有关联对象都会及时加载 。 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 指定mybatis 如何自动映射列到属性: PARTIAL 只会自动映射简单,没有嵌套的结果。 FILL 会自动映射任意复杂的结果(嵌套的或者其他情况) -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!-- 设置超时时间,它决定驱动等待一个数据库相应的时间 -->
<setting name="defaultStatementTimeout" value="25" />
<!--是否开启自动驼峰命名规则,即从经典数据库列名A-COlUMN 到经典java属性名 aColumn的类似映射。 默认为false -->
<setting name="mapUnderscoreToCamelCase" value="false" />
</settings>
3.将jar包放到lib下刷新,即可在控制台输出sql.
12.注解方式写mapper,报错Controller无法注入,原因: 把@Resource 改为@Autowired:
@Autowired BookMapper bookMapper;