2020-08-30

SSM框架整合
Spring 和 springmvc 的关系
1.Spring和SpringMVC是父子容器关系。在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象
  
2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,而一个项目中会包含很多容器,并且它们分上下层关系,目前最常用的一个场景是在一个项目中导入Spring和SpringMVC框架,而Spring和SpringMVC其实就是两个容器,Spring是父容器,SpringMVC是子容器,Spring父容器中注册的Bean对SpringMVC子容器是可见的,反之则不行。
  
3.按照官方文档推荐,根据不同的业务模块来划分不同的容器中注册不同的Bean,SpringMVC主要就是为我们构建web应用程序,那么SpringMVC子容器用来注册web组件的Bean,如控制器、处理器映射、视图解析器等。而Spring用来注册其他Bean,这些Bean通常是驱动应用后端的中间层和数据层组件。

Mybatis 如何单独实现
导入jar包之后,我们开始编写mybatis的配置文件,配置如下:

<?xml version="1.0" encoding="UTF-8"?> //指定属性配置的资源文件
<!-- 为该包下的类配置别名  类名即全限定名   全限定名太麻煩 -->
<typeAliases>
	<package name="cn.itsource.mapper"/>
</typeAliases>

<!-- 配置使用某一个环境  default 表示使用某一个--> //配置使用哪一个数据库连接
<environments default="development">
 <environment id="development">
  	<!-- 采用的事务处理机制 -->
  	<transactionManager type="JDBC"/>
  	<!-- 使用的数据源类型  此处为连接池 -->
  	<dataSource type="POOLED">
    
    <property name="driver" value="${db.driver}"/>
    <property name="url" value="jdbc:mysql://localhost:3306/dbmstest?useUnicode=true&amp;serverTimezone=GMT&amp;useSSL=false"/>
    <property name="username" value="${db.username}"/>
    <property name="password" value="${db.password}"/>
    
 	 </dataSource>
	</environment>
 </environments>
//指定mapper.xml文件生效

再看mybatis 实现数据库操作的流程:

通过MyBatis-Config.xml 文件构建一个SqlSessionFactory 对象,再获取SqlSession

public enum MybatisUilt {
INSTANCE;
static SqlSessionFactory factory;
// 工厂对象应该静态初始话
static {
try {
Reader reader = Resources.getResourceAsReader(“MyBatis-Config.xml”);
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
System.out.println(“读取mybatis 配置文件失败”);
e.printStackTrace();
}
}

// 获取session的方法
public static SqlSession getSqlSession() {
return factory.openSession();

} 

}

在后续具体的数据访问操作中 通过SqlSession对象 指定获取某个Dao接口的mapper ,mapper对象相当于这个接口的实现类,我们可以通过这个mapper对象进行数据库操作

@Test
void testDeleteById() {
SqlSession session = MybatisUilt.INSTANCE.getSqlSession();
ProductDaoMapper mapper = session.getMapper(ProductDaoMapper.class);
mapper.deleteById(23L); //执行接口中的方法
session.commit();
session.close();

Spring 整合mybatis
Mybatis 运行需要那些? 需要dataSource获取数据库连接 需要告诉mybatis dao接口的数据库访问映射文件所在位置,通过这些信息生成SqlSessionFactory 对象 再获取SqlSession对象,最后获取mapper(功能上可以看作接口的实现类)、

基于Spring是对象管理框架,我们的dataSource 可以看作一个对象交给spring管理,SqlSessionFactory 对象是基于mybatis-config.xml文件生成的 也可以交给Spring管理,mybatis 需要被告诉mapper.Xml所在位置,然后生成mapper对象,可以让spring扫描mapper.xml文件所在位置 ,动态生成mapper对象,还可以配置事务等,导入spring整合mybatis的架包后,spring的applicationContext.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>

 <!-- 加载属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 将服务层交给spring 管理 -->
<context:component-scan base-package="cn.itsource.service"></context:component-scan>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${db.driver}"/>
    	<property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;serverTimezone=GMT&amp;useSSL=false"/>
    	<property name="username" value="root"/>
    	<property name="password" value="root"/>		
</bean>


<!-- springmvc 管理sqlSessionFactory  -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<!-- 配置mybatis (mapper)映射器路径    这里指明mapper.xml配置文件在哪里 -->
	<property name="mapperLocations" value="classpath:cn/itsource/mapper/*Mapper.xml" />
	<!-- 配置别名 -->
	<!-- <property name="typeAliasesPackage" value="cn.itsource.domain" ></property> -->
</bean>


<!-- 映射器扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 这句可以省略,自动注册 -->
<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> -->
<!-- 这段配置会扫描指定包下的所有接口,然后创建各自接口的动态代理类。 -->
<property name="basePackage" value="cn.itsource.mapper"></property>
</bean>

<!-- 6. 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 7. 注解驱动,启动事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

Mybatis 就交给Spring管理了,不需要我们再去手动的获取SqlSessionFactory,mapper等对象

Springmvc 配置

<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package=“cn.itsource.controller”></context:component-scan>

<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

mvc:annotation-driven/

#{5*1024*1024}
<!-- 配置一个拦截器 -->

Spring里面可以配置的东西Springmvc可以配置,可以看到这里很多配置依旧是基于bean,但是额外多了<mvc…>一类的配置。(拦截器是springmvc 特有的 基于aop 思想)

Spring Springmvc 和 web的关系
web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。

需要Servlet容器启动时 配置spring容器.

Tomcat在启动时给每个Web应用创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供宿主环境。

Tomcat在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextInitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring根容器,这个就是Spring的IoC容器,IoC容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。

Tomcat在启动过程中还会扫描Servlet,一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求。

Servlet一般会延迟加载,当第一个请求达到时,Tomcat&Jetty发现DispatcherServlet还没有被实例化,就调用DispatcherServlet的init方法,DispatcherServlet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有Spring MVC相关的Bean。同时,Spring MVC还会通过ServletContext拿到Spring根容器,并将Spring根容器设为SpringMVC容器的父容器,请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean, 也就是说Spring根容器不能访问SpringMVC容器里的Bean。说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。

Web.xml

<?xml version="1.0" encoding="UTF-8"?> spring-web org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 dispatcherServlet / characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 characterEncodingFilter /*
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。首先,在Linux中使用Java编程和SQL查询需要先安装Java和MySQL数据库,并且需要连接到数据库。接着,我们可以使用Java的JDBC API来执行SQL查询并将结果存入MySQL数据库中的countrycmp表。以下是一个简单的Java程序示例,可以实现你的要求: ```java import java.sql.*; public class CountryCmp { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "username"; String pass = "password"; try (Connection conn = DriverManager.getConnection(url, user, pass); Statement stmt = conn.createStatement()) { // 查询指定日期的每个国家的确诊数和所有国家平均确诊数 String sql = "SELECT country, confirmed, (SELECT AVG(confirmed) FROM covid19 WHERE date='2020-08-30') AS avg_confirmed FROM covid19 WHERE date='2020-08-30'"; ResultSet rs = stmt.executeQuery(sql); // 将结果与平均确诊数比较,存入countrycmp表 PreparedStatement pstmt = conn.prepareStatement("INSERT INTO countrycmp (country, result) VALUES (?, ?)"); while (rs.next()) { String country = rs.getString("country"); int confirmed = rs.getInt("confirmed"); double avg_confirmed = rs.getDouble("avg_confirmed"); String result = (confirmed > avg_confirmed) ? "高" : ((confirmed < avg_confirmed) ? "低" : "相同"); pstmt.setString(1, country); pstmt.setString(2, result); pstmt.executeUpdate(); } // 查询前5条结果 sql = "SELECT country, confirmed FROM covid19 WHERE date='2020-08-30' ORDER BY confirmed DESC, country ASC LIMIT 5"; rs = stmt.executeQuery(sql); while (rs.next()) { String country = rs.getString("country"); int confirmed = rs.getInt("confirmed"); System.out.printf("%s: %d%n", country, confirmed); } } catch (SQLException e) { e.printStackTrace(); } } } ``` 上面的示例代码中,我们假设MySQL数据库的连接地址为`jdbc:mysql://localhost:3306/mydatabase`,用户名为`username`,密码为`password`。我们首先执行一个SELECT语句获取指定日期(2020-08-30)的每个国家的确诊数和所有国家平均确诊数,然后再通过一个循环将结果与平均确诊数比较,并将比较结果存入countrycmp表中。查询前5条结果的SELECT语句也很简单,只需要按确诊总数降序、国家名拼音字母升序排序,并限制结果数量为5即可。 当然,上面的示例代码仅供参考,实际应用中还需要根据具体情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值