这个项目来自B站狂神说的教程
1.spring+mybatis
1.1建立数据库
CREATE DATABASE `ssmbuild`;
USE `ssmbuild`;
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT(11) NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');
1.2项目架构
(controller包 第一阶段 spring mybatis 整合测试用 ,后面加入web层再用)
1.3maven导入依赖
mysql-connector-java这个导入的版本和你的数据库版本要对上
一定要注意自己导入jar包的版本问题
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.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.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
<!--资源过滤器 防止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>
</project>
1.3编写实体类,mapper接口,业务层
实体类
yzq\pojo\Books.java
这里使用了lombok插件,使用注解自动生成了set,get方法,和有参无参的构造函数
package yzq.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
mapper
yzq\dao\BookMapper.java
这里使用了@Repository注解 实现自动注入spring,要在对应的xml文件加入注解支持
不了解注解的,建议补一下注解的知识,帮助理清思路。
https://blog.csdn.net/fpga_zy/article/details/80870208
package yzq.dao;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import yzq.pojo.Books;
import java.util.List;
@Repository
public interface BookMapper {
List<Books> quryAllBooks();
}
对应的xml文件(建议放在resources文件夹下面,不然很可能在maven中写资源过滤器才能找到xml文件,当然你也可以直接不写xml文件,因为样例十分简单可以直接在接口中注解实现sql)
BookMapper.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="yzq.dao.BookMapper">
<select id="quryAllBooks" resultType="Books">
select * from books
</select>
</mapper>
业务层
这里也使用注解注入spring
yzq\servlet\service.java
package yzq.servlet;
import yzq.pojo.Books;
import java.util.List;
public interface service {
List<Books> quryAllBooks();
}
yzq\servlet\serviceImp.java
(@Data lombok 插件的注解,自动生成set,get)
package yzq.servlet;
import lombok.Data;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import yzq.dao.BookMapper;
import yzq.pojo.Books;
import java.util.List;
@Service("serviceImp")
@Data
public class serviceImp implements service{
@Qualifier("bookMapper")
@Autowired
private BookMapper bookMapper;
public List<Books> quryAllBooks() {
return bookMapper.quryAllBooks();
}
}
1.4 mybatis xml文件 spring xml文件的编写(重点)
感觉对于小白来说简直就是配置地狱,思路不清晰的话直接会爆炸,我就在这里搞了几天。。。难啊。文件都要放在resources文件夹下
记得把spring文件放在一个组(不然的话可能在自动动注入的时候要引入一下spring文件)
1.4.1.mybatis-config.xml
(数据库的连接交给spring自动管理,这里就写个别名,和xml文件的路径,但是我这里不知道这么的刚开始xml文件路径一直报错,我索性把xml文件路径也交给spring了,不写在这里了)其实这个文件也可以不写的全写到一个spring文件中,但这样写思路清晰一些。
<?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="yzq.pojo"/>
</typeAliases>
</configuration>
1.4.2.database.properties
这里写自己数据库的名称密码,如果数据库版本比较高有可能时区不对连不上
这个时候打开cmd
第一步:mysql -uroot -p
第二步:输入数据库密码:
第三步:set global time_zone=’+8:00’;
还有就是本版较低的驱动是:com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=xxx
1.4.3.spring-mybatis.xml(重点)
要点:
1.开头bean的网站路径一定不能错,我就spring-context写成了springcontext报错半天没找出错误在哪里,心态直接爆炸。
2. <bean id=“SqlSessionFactory”…>这里 vlaue xml文件路径配置一定要加(classpath:) 虽然IDEA能自动识别到你的xml文件但它生成的没用(classpath:)
3.< bean class=“org.mybatis.spring.mapper.MapperScannerConfigurer”>其实添加了这个配置 dao层的mapper接口可以不用写注解 ,它会自动扫描的你的包路径下的mapper接口
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解支持spring自动装配带有注解的java文件和引入properties文件-->
<context:property-placeholder
location="classpath:database.properties"/>
<context:annotation-config></context:annotation-config>
<!--自动装备包的范围-->
<context:component-scan base-package="yzq"></context:component-scan>
<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}"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- mybatis配置驼峰形式的设置类 -->
<bean id="settings" class="org.apache.ibatis.session.Configuration">
<property name="mapUnderscoreToCamelCase" value="true"></property>
</bean>
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:BookMapper.xml"/>
</bean>
<!-- 配置dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="yzq.dao"></property>
<property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"/>
</bean>
</beans>
1.5测试
yzq\controller\controller.java
吐槽:原来不知道原来测试类也要加注解@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = “classpath:spring-mybatis.xml”)
我就写了个
@Autowired
private serviceImp service;
然后用的
@Test
public void te(){
System.out.println(service.quryAllBooks());
}
结果测试失败而且控制台就告诉你 这一行System.out.println(service.quryAllBooks());出了问题没有报错提示
我半天不知道怎么弄心态炸裂 我直接人无了。我不知道怎么弄用的蠢方法又写了一个mybatis文件来测试连接成功没用,后面一步步解决问题,一点点发现自己写的几个xml文件都存在错误真的配置有点多一下就弄错了太烦了。后面连接成功了还报错,就又看了几遍教程一点点找错,不懂的地方再看博客才弄了出来,不过还好虽然痛苦,但是一直找错一遍遍的想自己错在哪里,执行流程清晰了不少,也算是大收获。
第一次测试建议直接使用第二种方法 public void testFindAll()如果用第一种方法的话错了就错了不会又提示,第二种能看到你的spring注入到底有没有问题,若是第二种能出来,第一种错了就是自动注入出了问题,建议检查自己bean,注解,还有网址是否引入正确,当然还有jar的版本问题,jar是否成功引入。
package yzq.controller;
import lombok.Data;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import yzq.pojo.Books;
import yzq.servlet.service;
import yzq.servlet.serviceImp;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:spring-mybatis.xml")
public class controller {
@Autowired
private serviceImp service;
@Test
public void te(){
System.out.println(service.quryAllBooks());
}
@Test
public void testFindAll(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
service newsService = context.getBean("serviceImp",serviceImp.class);
List<Books> list = newsService.quryAllBooks();
System.out.println(list);
}
}
这里若是第一种测试成功输出那么恭喜你spring+mybatis完成接下来就是引入springmvc。
2.整合springMVC
2.1引入web
若是你一开始就是web项目就不用这一步
引入web之后记得自己添加lib把jar包放里面(从右上角进路这个界面,不过大家应该都是一开始就建立的web项目吧)
项目结构
2.2编写web.xml
将请求拦截下来交给springMVC。
这里还可以配置中文乱码的问题但是我配的时候总是报错就没有配置了
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--总的配置文件,等下会创建将所有spring配置文件都引入-->
<param-value>classpath:applicationContex.xml</param-value>
</init-param>
<!--启动级别:设置和服务器一起启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- /不拦截 .jsp文件
/* 拦截所有请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3spring-mvc.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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--添加注解支持-->
<context:component-scan base-package="yzq"/>
<!--资源过滤器-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置专挑的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.4 applicationContex.xml(总的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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-mvc.xml"/>
<import resource="spring-mybatis.xml"/>
</beans>
2.5 yzq\controller\webController.java
package yzq.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import yzq.pojo.Books;
import yzq.servlet.serviceImp;
import java.util.List;
@Controller
@RequestMapping("/web")
public class webController {
@Autowired
private serviceImp serviceImp;
@RequestMapping("/allBooks")
private String queryAllBooks(Model model){
List<Books> booksList=serviceImp.quryAllBooks();
model.addAttribute("allBooks",booksList);
/*跳转的页面*/
return "showBooks";
}
}
2.6 jsp页面(注意路径)
我这里配置的是
< property name=“prefix” value=”/WEB-INF/jsp/” />
< property name=“suffix” value=”.jsp”/>
web\WEB-INF\jsp\showBooks.jsp
<%--
Created by IntelliJ IDEA.
User: 24999
Date: 2020/6/13
Time: 12:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${allBooks}
</body>
</html>
2.7配置Tomcat
2.8启动测试
到这里基本的ssm框架整合就结束了,有乱码的话记得设置乱码过滤,剩下的就是前端的美化,用json传输数据。祝大家成功。
最后再将CRUD全部实现一遍,附上我项目最终的界面
============================================================
============================================================