Spring IOC,DI
Spring-MVC 从前端到后端的流程控制
Mybatis ORM框架
xml框架结构认识
各个XML流程和作用解释
整体XML框架大概结构
web.xml
- 配置DispatcherServlet,进行访问的入口路径和流程分发
- 配置CharacterEncodingFilter 配置编码格式为UTF-8
- 配置监听器ContextLoaderListener,作用是和web初始化的事实一同初始化加载Bean
spring-mvc.xml
- 配置视图解析器InternalResourceViewResolver,设置前(prefix)后(suffix)缀路径
- import,加载Bean文件
- mvc:default-servlet-handler,开启静态资源放行
- mvc:annotation-driven 开启自定义标签
spring-Mybatis.xml
- 加载jdbc.properties
- 配置DataSource数据源
- 配置sqlSessionBeanFactory,整合Mybatis的SqlSessionFactory对象到spring容器中进行管理
- 配置MapperScannerConfigurer,以前的方式config里通过environments标签获得对象,这里直接注入找到对象注入进去 ,配置使用代理方式来生成XML文件映射Mapper接口的实例交给spring容器管理等同调用了sqlSession.getMapper()方法
吾日三省吾身之前是用数据流加载XML的方式获得SqlSession方法,再通过sqlSession.openSesion()获得对象,再通过sqlSesson.GetMapper(类对象)拿到Mapper,比如:
Reader reader = Resources.getResourceAsReader("mybatisconfig/MybatisConfiguration.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader); sqlSession = build.openSession();UserDAO mapper = sqlSession.getMapper(UserDAO.class);
spring-tx.xml
- 配置DataSourceTransactionManager,事务管理器
- 配置<tx:advice 切面通知规则
- 配置<aop:config 切如点
- 加载bean-context 逻辑分层负责service层加载,事务处理service层
Bean-context.xml
- 针对service类的Bean配置
Bean-controller.xml
- 针对controller类的Bean配置
BeanMapper.xml
- Mapper类映射接口完成TSQL编写
总结
总结:大体可以看成4层,
1.Web.config层 负责启动
2.spring-mvc层 负责分发
3.spring-mybatis 负责数据源和sqlSessionFactory
4.spring-tx,负责数据库的链接对象和Mpaper映射关系
项目创建
考虑好了我们的xml需要怎么进行分类,就开始思考需要使用那些Maven引用,进行项目的创建
pom.xml
spring-webmvc:加载dipacherServlet分发器
spring-aspects:用于事务切入点的通知
spring-jdbc:spring数据库链接
druid:数据源
mybatis:ORM框架
mybatis-spring:sqlSeesionFactory
mysql-connector-java:数据库driver驱动
servlet-api:分发
lombok:工具类
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
web.config
- 配置dipatcherServlet分发器
- 这里需要新增spring-mvc.xml文件后面进行配置
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:context/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 配置characterencodingFilter编码格式
<filter>
<filter-name>Filter</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>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 配置监听器,同web一同启动
- 需要新增applicationContext文件
<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>
Spring-mvc.xml
- 配置InternalResourceViewResolver,jsp视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
</bean>
- 开启mvc自定义标签使用
- <mvc:annotation-driven/>
- 开启静态资源的放行
<mvc:default-servlet-handler/>
- 引入Bean-controller.xml
<import resource="classpath:context/book/book-controller.xml"/>
Spring-mybatis.xml
- 配置数据源
1.加载配置文件
<context:property-placeholder location="classpath:jdbc.properties"/>
2.加载数据源
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.root}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="password" value="${jdbc.pwd}"></property>
</bean>
3.配置SqlSessionFactoryBean
1.属性DataSource为数据源
2.configLoaction和mapperLocations为配置mapper的2种方式
mapperLocations是在不同包的情况下配置XML文件加载
configLoaction是加载Mybatisconfig种的配置环境Env
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mybatis/mapper/*Mapper.xml"></property>
</bean>
4.配置MapperScannerConfigurer,是为了解决MapperFactoryBean繁琐而生的,有了MapperScannerConfigurer就不需要我们去为每个映射接口去声明一个bean了。大大缩减了开发的效率。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="scannerConfigurer">
<property name="basePackage" value="demo.mvc.dao"/>
</bean>
Spring-tx.xml
1.配置事务DataSourceTransactionManager,加载数据源
<bean id="transcationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
2.配置切面tx:advice
<tx:advice transaction-manager="transcationManager" id="interceptor">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="query*" propagation="SUPPORTS"/>
<tx:method name="log*" propagation="REQUIRES_NEW"/>
<tx:method name="*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
3.配置切入点aop.conifg
<aop:config>
<aop:pointcut id="pcut" expression="execution(* ssm.mvc..*.*(..))"/>
<aop:advisor advice-ref="interceptor" pointcut-ref="pcut"/>
</aop:config>
4.配置切入点aop.conifg
引入DAO层的context文件
<import resource="classpath:context/book/book-context.xml"/>
Bean-Context.xml
注册Servie层Bean
<bean class="ssm.mvc.service.BooksServiceImpl" id="bookService">
<property name="bookMapper" ref="bookMapper"></property>
</bean>
ref="bookMapper"指向的是接口
Bean-controller.xml
注册controller的ben
<bean id="bookController" class="ssm.mvc.controller.BookController">
<property name="bookService" ref="bookService"></property>
</bean>
配置Mapper.xml
<mapper>
<!--增加一本书-->
<insert id="addBook" parameterType="book">
insert into books(bookName,bookCount,detail)
values (#{bookName},#{bookCount},#{detail})
</insert>
<!--删除一本书-->
<delete id="deleteBookByID" parameterType="int">
delete from books where bookID=#{bookID}
</delete>
<!--更新一本书-->
<update id="updateBook" parameterType="book">
update books set
bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
where bookID=#{bookID} ;
</update>
<!--查询一本书-->
<select id="queryByID" resultType="book">
select * from books where bookID=#{bookID}
</select>
<!--查询所有书-->
<select id="queryAllBooks" resultType="book">
select * from books
</select>
</mapper>
配置ApplicationContext.xml
<import resource="classpath:context/spring-mybatis.xml"/>
<import resource="classpath:context/spring-tx.xml"/>
<import resource="classpath:context/spring-mvc.xml"/>
配置Mybatis-config.xml
- 配置别名和小驼峰命名方式
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="ssm.mvc.model.Books" alias="book"></typeAlias>
</typeAliases>
类代码编写
前端JS页面
<h1>全部书籍展示</h1>
${list}
Controller
@RequestMapping("/book")
public class BookController {
private BookService bookService;
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
//查询全部书籍,并且返回到一个页面进行显示
@RequestMapping("/allBooks")
public String list(Model model) {
List<Books> books = bookService.queryAllBooks();
model.addAttribute("list", books);
return "allBooks";
}
}
Mapper
public interface BookMapper {
//增加一本书
int addBook(Books books);
//删除一本书
//@Param注解指定传入参数的名称
int deleteBookByID(@Param("bookID") int id);
//更新一本书
int updateBook(Books books);
//查询一本书
//@Param注解指定传入参数的名称
Books queryByID(@Param("bookID") int id);
//查询全部的书
List<Books> queryAllBooks();
}
model
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Books {
private Integer bookID;
private String bookName;
private Integer bookCounts;
private String bookeDetail;
}
Service层,
public class BooksServiceImpl implements BookService{
//dao层的Mapper接口对象
private BookMapper bookMapper;
//set方法,为后续Spring注入准备
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
public int addBook(Books books) {
//调用dao层的方法
return bookMapper.addBook(books);
}
public int deleteBookByID(int id) {
//调用dao层的方法
return bookMapper.deleteBookByID(id);
}
public int updateBook(Books books) {
//调用dao层的方法
return bookMapper.updateBook(books);
}
public Books queryByID(int id) {
//调用dao层的方法
return bookMapper.queryByID(id);
}
public List<Books> queryAllBooks() {
//调用dao层的方法
return bookMapper.queryAllBooks();
}
}
services层
public interface BookService {
//增加一本书
int addBook(Books books);
//删除一本书
int deleteBookByID(int id);
//更新一本书
int updateBook(Books books);
//查询一本书
Books queryByID(int id);
//查询全部的书
List<Books> queryAllBooks();
}
运行测试 it’s OK
总结
前面花了大量篇幅讲解xml的分层,后面篇幅花的比较少之前讲过的内容都是,主要是讲解xml分三层,spring-mvc,spring-tx,spring-tx。各自负责的职责,每个功能做什么。以及需要注册的类的方法,需要牢记熟背对后面的源码理解有功不可没的功能。
代码
https://pan.baidu.com/s/1SV0rbN0pDlzlTJw2PrqqXg
b4om