目录
1.ssm框架简介
ssm框架是指spring、springmvc和mybatis,在我看来,mybatis简化了通过jdbc操作数据库的Java代码,而改用配置文件来对操作数据库进行必要配置。并且在实际操作数据库的时候,也不需要实现dao接口,而是通过配置文件来绑定设置,使得Java代码显得很简洁。
spring则是简化了获得对象的操作,将所有的对象都在spring容器中注册好,包括属性的注入,这样的结果就是在项目中不需要通过new获取对象,spring配置文件就直接可以将注册好的对象注入到需要的地方。
springmvc主要负责的就是controller层,也就是Javaweb的servlet层,它可以将请求的url地址解析出来,得到控制器,根据这个得到的控制器再去找controller相对应的方法,处理这个请求。
或许,可以不大准确地说,mybatis处理了dao层【也就是mapper,文章中出现的话mapper和dao是一个概念】对数据库操作的实际业务,spring处理了有关类的对象的获取,springmvc处理了servlet层,负责将请求分析找到对应的处理方法。这只是我学习到目前的一个看法,或许不妥,但借鉴这个思想看这篇整合文章确实是有助于理解的。
2.整合ssm框架
2.1项目准备
2.1.1导入需要的依赖
<dependencies>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
2.1.2 建立数据库
建一个数据库ssmbuild,里面建一张books表,并且编写对应的Java实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
2.2 整合mybatis
mybatis主要用在dao层,实现对数据库的操作。这里需要编写一个BookMapper的接口以及接口的映射文件bookMapper.xml
public interface BookMapper {
// 获取书籍列表
public List<Book> getBooks();
// 根据id获取书籍
public Book getBookById(int bookID);
// 添加一本数据
public int addBook(Book book);
// 根据id删除一本书籍
public int deleteBookById(int bookID);
// 根据id修改一本书籍信息
public int modifyBook(Book book);
}
<mapper namespace="com.plane.mapper.BookMapper">
<select id="getBooks" resultType="Book">
select * from books
</select>
<select id="getBookById" resultType="Book" parameterType="int">
select * from books where bookID = #{bookID}
</select>
<insert id="addBook" parameterType="Book">
insert into books(bookID, bookName, bookCounts, detail)
VALUES (#{bookID}, #{bookName}, #{bookCounts}, #{details})
</insert>
<delete id="deleteBookById" parameterType="int">
delete from books where bookID = #{bookID}
</delete>
<update id="modifyBook" parameterType="Book">
update books set bookCounts=#{bookCounts}, bookName=#{bookName}, detail=#{detail}
where bookID=#{bookID}
</update>
</mapper>
在bookMapper.xml文件中使用了Book类的别名而没有写全限定名,这里别名在mybatis-config.xml文件中配置,配置文件如下(设置了日志、别名以及接口映射文件):
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<typeAlias type="com.plane.pojo.Book" alias="Book"></typeAlias>
</typeAliases>
<mappers>
<mapper resource="bookMapper.xml"></mapper>
</mappers>
</configuration>
在这里,mybatis的整合就完成了。
在单纯的mybatis中,如果不整合spring,那么需要在mybatis-config.xml文件中对连接数据库进行必要的配置,如driver、url、username和password,然后通过这个配置文件获得一个SqlSessionFactory,再用SqlSessionFactory获得一个SqlSession,SqlSession获得mapper,mapper调用自身方法实现对数据库的操作。
但是我们还需要整合spring,在spring中,一切对象都托管到了spring容器中,不再由用户自己new出来了(完了,Java程序员不能自己new对象了 : - < ),而是在spring容器中注册好,然后spring来帮我们获得。SqlSessionFactory、SqlSession等这些对数据库操作必要的对象也是由spring容器来帮我们获得的
2.3整合spring
2.3.1spring整合dao层
上一章节已经编写了一个操作数据库的mapper接口并完成了映射文件的编写,但是连接数据库必要的对象还没有。spring整合dao就是在spring容器中注册这些对象
注:这一章节的配置文件都是spring的配置文件,不是mybatis的。spring的配置文件和mybatis的配置文件头不同
编写spring-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1 引入外部配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 2 注册连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 3 注册sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- 4 配置扫描mapper接口包,动态实现mapper接口注入到spring容器中
也就是说,所有的mapper接口都已经被自动注册好了,可以直接使用-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="basePackage" value="com.plane.mapper"></property>
</bean>
外部配置文件如下
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true jdbc.username=root jdbc.password=root
注:这里有一个很奇葩的坑,是一个使用了spring整合mybatis后出现连接数据库失败的错误,具体可看下面的链接:
版权声明:本文为CSDN博主「乄耂_×乀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42069617/article/details/106059994
到此,SqlSession已经注册到spring容器中了,操作数据库的部分已经完成。
在普通的Javaweb项目中,servlet掉用service业务,service调用dao层业务,实现对数据库的操作。按照这个逻辑,现在需要进行spring对service层的整合了。
2.3.2spring整合service层
编写BookService接口和BookServiceImpl实现类,实现类中有一个BookMapper的属性,service调用mapper的方法来完成业务
public interface BookService {
// 获取书籍列表
public List<Book> getBooks();
// 根据id获取书籍
public Book getBookById(int bookID);
// 添加一本数据
public int addBook(Book book);
// 根据id删除一本书籍
public int deleteBookById(int bookID);
// 根据id修改一本书籍信息
public int modifyBook(Book book);
}
public class BookServiceImpl implements BookService{
BookMapper bookMapper;
public void setBookMapper(BookMapper bookMapper){
this.bookMapper=bookMapper;
}
public List<Book> getBooks() {
return bookMapper.getBooks();
}
public Book getBookById(int bookID) {
return bookMapper.getBookById(bookID);
}
public int addBook(Book book) {
return bookMapper.addBook(book);
}
public int deleteBookById(int bookID) {
return bookMapper.deleteBookById(bookID);
}
public int modifyBook(Book book) {
return bookMapper.modifyBook(book);
}
}
编写spring-service.xml文件,将BookServiceImpl注册到spring容器中
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- <context:component-scan base-package="com.plane.service"></context:component-scan>-->
<bean id="bookService" class="com.plane.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"></property>
</bean>
<!--配置事务管理器到spring容器中-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
2.4整合springmvc层
使用springmvc框架,首先在web.xml文件中注册了一个前端控制器dispatcherServlet,它可以将用户从前端发出的请求进行拦截解析,得到控制器。如 localhost:8080/allBooks,它可以解析得到控制器allBooks,根据这个控制器去controller中寻找相应的方法,处理请求。方法返回一个字符串,会被视图解析器解析到,进行前缀和后缀拼接,得到真实的页面资源地址。代码看下:
在web.xml文件中注册前端控制器以及乱码过滤器
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encoding</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>
<!-- 这里注意 / 和 /*的区别-->
<!-- / 只会过滤请求的路径,/*会把请求和.jsp页面的路径都过滤-->
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
实现BookController类
@Controller
public class BookController {
@Autowired
@Qualifier("bookService")
private BookService bookService;
@RequestMapping("/allBooks")
public String getAllBooks(Model model){
List<Book> list = bookService.getBooks();
for (Book book : list) {
System.out.println(book);
}
// model.addAttribute("list", list);
return "allBooks";
}
}
编写springmvc-servlet.xml文件,开启注解支持、自动扫描@Controller注解以及注册视图解析器
<?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/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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包下的@Controller注解-->
<context:component-scan base-package="com.plane.controller"></context:component-scan>
<!-- 让springmvc不处理静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 支持注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
想要使用@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在累计被和方法级别处理
而annotation-dreven配置帮助我们自动我完成上述两个实例的注入
它们的功能大概相当于处理映射器和处理适配器-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 添加 视图解析器:DispatcherServlet给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
最后一步,在WEB-INF/jsp路径下新建一个allBooks.jsp文件,作为controller的跳转页面,启动项目,在浏览器地址栏输入 localhost:8080/allBooks 就会后台会打印出books表的所有数据项。