目录
一.给实体类bean起别名
二.映射器注册Mapper
三.获取数据库连接
四.开启注解支持
五.配置文件xml到配置类注解
六.注入bean的比较
七.事务
八.注册servlet
九. 视图解析器
十.乱码问题
十一.静态资源导入
十二.拦截器
十三.视图跳转
一.给实体类bean起别名
- Mybatis
在配置文件中使用<typeAliases>
标签 - spring
在配置文件中使用<alias>
标签或者在bean便签使用<name>
属性 - springboot
①application.yml
mybatis:
type-aliases-package: com.lidice.**
②注解
//实体类上添加:
@Alias("value")
二.映射器注册Mapper
- Mybatis
在配置文件中使用<mappers>
标签 - spring
①整合mybatis
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath:com/lidice/mapper/*.xml"/>
</bean>
- springboot
mybatis:
mapper-locations:
classpath: mybatis/mapper/*.xml
三.获取数据库连接
- Mybatis
//先在mybatis.xml中配置数据库信息
String resource = "mybatis.xml"; --
Resources.getResourceAsStream(resouce) 获取is --
sqlSessionFactoryBuilder.build(is) 获取sqlSessionFactory --
sqlSessionFactory.openSession() 获取sqlSession --
sqlSession.getMapper(Class c) 获取当前Mapper类的对象 --
最后调用方法
- springMVC
<!--读取数据库配置属性文件-->
<context:property-placeholder location="classpath:sql.properties"/>
<!--c3p0数据库连接池连接数据库-->
<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}"/>
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<property name="autoCommitOnClose" value="false"/>
<property name="checkoutTimeout" value="10000"/>
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--创建sqlSession工厂,获取数据库连接-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--获取dataSource连接池-->
<property name="dataSource" ref="dataSource"/>
<!--整合Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<!--用spring的api应用sqlSessionFactory创建sqlSession;
并将dao包下类注入到spring中-->
<bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.lidice.mapper"/>
</bean>
- springboot整合mybatis(也有jdbc和druid方式,详情点击这里跳转)
①application.yml
spring:
# 连接数据库
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: Lidice.java.717
②然后
导入依赖 – mybatis注册mapper,别名等配置 – pojo、mapper、service、controller – 访问
四.开启注解支持
- spring使用
<context :annotation-config/>
开启注解支持 - springMVC使用
<mvc:annotation-driven/>
开启注解支持 - springboot默认开启注解支持
五.配置文件xml到配置类注解
- SSM使用xml配置文件进行功能的开启
- springboot使用configuration注解以配置类代替xml配置文件
六.注入bean的比较
- SSM直接在xml中配置
<bean id=" " class=" "/>
来注入bean - :在SSM配置文件中开启
<context:compont-scan base="com.lidice"/>
,在需要注入的类上使用component注解 - springboot用@component @bean等
/*
new的值相当于SSM配置文件中的class属性
方法名相当于SSM配置文件中的id属性
*/
@bean
public User user(){
return new User();
}
补充:springboot的**@SpringBootApplication**代替
@Configuration: 声明主启动类也是javaConfig
@EnableAutoConfiguration: 自动扫描自定义和扩展的配置类
@ComponentScan: 扫描@Component@bean等自动注入类
七.事务
- spring声明式事务:
<!--给service层 添加 声明式事务-->
<bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
- spring的aop配置事务
</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config> ......
</beans>
3.springboot注解版事务
@Service
public class PersonService {
@Resource //先byName自动装配
private PersonMapper personMapper;
@Autowird //先byType自动装配
private CompanyMapper companyMapper;
/*
rollbackFor:触发回滚的异常,默认是RuntimeException和Error
isolation: 事务的隔离级别,默认是Isolation.DEFAULT也就是数据库自身的默认隔离级别,比如MySQL是ISOLATION_REPEATABLE_READ可重复读
*/
@Transactional(rollbackFor = {RuntimeException.class, Error.class})
public void saveOne(Person person) {
Company company = new Company();
company.setName("tenmao:" + person.getName());
companyMapper.insertOne(company);
personMapper.insertOne(person);
}
}
@EnableTransactionManagement加到主启动类上(也可不加)
八.注册servlet
- spring注册 web.xml
<!--dispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- springboot 且算是自定义,因为默认server.port已设置为路由加端口
①配置类方式
public class WeChatServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
if (ValidUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
}
@SpringBootApplication
public class MyAppliction extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
// 这条如此配置打包后是war包,才可在tomcat下使用
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplicaitioni.class);
}
// 注册servlet
@Bean
public ServletRegistrationBean weChatValid(){
//第一个参数是第1步中创建的WeChatServlet实例,第二个参数是其对应的路径,相当于web.xml中配置时的url-pattern。
return new ServletRegistrationBean(new WeChatServlet(), "/weChatValid");
}
}
②注解版
//注解实现
@WebServlet(urlPatterns = "/weChatValid", description = "微信接口验证")
public class WeChatServlet extends HttpServlet {
//...同上
}
@ServletComponentScan //主启动类上添加此注解
1.举一反三:spring boot 的Filter注册、Listener注册和Servlet注册如出一辙。既然Servlet对应的注解是@WebServlet,那Filter和Listener就是…(你猜),不过他们三个在主类上都是用@ServletComponentScan(这个有点不按常理出牌~)
九. 视图解析器
- springMVC
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/book/"/>
<property name="suffix" value=".jsp"/>
</bean>
- springboot 也算是整合MVC
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Bean //放到bean中
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
//我们写一个静态内部类,视图解析器就需要实现ViewResolver接口
private static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
十.乱码问题
- SpringMVC
<!--乱码过滤-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.springboot
#springboot 1.4.2开始提供这种方式的项目编码
spring:
http:
encoding:
charset: utf-8
enabled: true
force: true
更多方式点这里查看
十一.静态资源导入
- springMVC pom.xml
<!--静态资源导出-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- springboot已经自动装配
十二.拦截器
- springMVC
public class MyInterceptor implements HandlerInterceptor(){
//重写perHandle方法就可
//内容大部分是验证session中有没有username这个key
//最后return ture,表示放行,默认会继续搜寻下一个过滤类
}
<!---->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截此请求下的所有请求, `/`代表Tomcat配置的根路径-->
<mvc:mapping path="/**"/>
<bean class="com.lidice.config.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--访问这个请求路径时直接return true放行,它会单独覆盖以上操作-->
<mvc:mapping path="/user/**"/>
<bean class="com.lidice.config.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- springboot
//自定义拦截器 -- 翻译:处理拦截
@Configuration
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object username = request.getSession().getAttribute("username");
if(username==null){
request.setAttribute("msg","没有权限,请先登录");
request.getRequestDispatcher("/login.html").forward(request,response);
return false;
}
return true;
}
}
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns:拦截的,excludePathPatterns:不拦截的
//链式编程
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/css/**","/img/**","/js/**");
}
}
十三.视图跳转
- springMVC
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/register",produces = "text/html;charset=UTF-8")
//@ResponseBody()
public String register(Model model){
//...
return "index";
}
}
- springboot
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//当访问“/”时跳转到“index”,后边的参数相当于return的页面
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}