SSM项目
首先是pom.xml导入依赖,都是几个常见的依赖
- springMVC
- Spring JDBC
- Spring Aop
- Mybatis 依赖包
- Spring整合MyBatis
- Servlet
其他一些依赖现在暂时没看
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm.example</groupId>
<artifactId>SsmDemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SSMDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 配置 SpringMVC 依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- Spring JDBC 依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- Spring AOP 依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--MyBatis 依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- Spring 整合 MyBatis 依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MySQL 驱动依赖包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- C3P0 数据源依赖包 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
<!-- jstl 依赖包 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- ServletAPI 依赖包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- junit 测试依赖包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<!-- 如果不添加此节点,mybatis 的 mapper.xml 文件都会被漏掉 -->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
创建db.properties用来保存数据库连接相关信息
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_example?userUnicode=true&characterEncoding=UTF-8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=admin
当然,之后是需要建对应的数据库的
创建mybatis-config.xml 用来配置数据库操作的辅助信息
<?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>
<settings>
<!--用来打印sql-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!--这个参数的作用就是,用来指定一个包,这个位置就可以不用写对应的类名了-->
<package name="org.wzw.entity"/>
</typeAliases>
</configuration>
创建springmvc.xml用来注册扫描和视图解析器
mvc:annotation-driven/的作用:当配置了< mvc:annotation-driven/>后,Spring就知道了我们启用注解驱动。然后Spring通过< context:component-scan/>标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。
视图解析器作用:他就是使用ViewResource进行视图解析,并在浏览器中渲染模型,而ViewResource是可以解析JSP,Velocity的。
prefix suffix是spring MVC试图解析器的一个属性,
prefix : 是指访问页面的前缀,指定页面存放的文件夹
suffix : 是指文件的后缀名,常见的后缀名有html,jsp,php,txt,mp3
创建applicationContext.xml用来配置MyBatis和数据库相关信息
(ps 这里用到了 C3P0 这个数据库连接池,对应之前的这个依赖)
有一个三大连接池之间的对比:https://blog.csdn.net/wawa3338/article/details/81380662
<!-- C3P0 数据源依赖包 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
这里还有一个MyBatis的mapper的映射地址,这个映射地址是用来写那些sql语句的吧,也就是那些xml文件的,这些文件内有sql语句
这里MyBatis 映射的时候,如果不在pom.xml中加入下面的代码的话,是不会成功的
也就是maven 里面 的作用:
就是为了打包资源文件,因为在默认情况下,maven只打包src/main/resource下的资源。通过设置这个标签的话,就可以将我们需要用到的资源打包了。
而这里可以了解一下 classpath和classpath*的区别了:
classpath:
:表示从类路径中加载资源,classpath:和classpath:/是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在JAR或ZIP的类包中。
classpath*::假设多个JAR包或文件系统类路径都有一个相同的配置文件,classpath:只会在第一个加载的类路径下查找,而classpath*:会扫描所有这些JAR包及类路径下出现的同名文件。
classpath的优点是相对来说比较快,而classpath*的优点就是范围会广很多。
还有mapperLocations和configLoaction,甚至一个是s一个没有s
扫描Mybatis的mapper接口,这个和那个映射的关系是什么呢:(MapperScannerConfigurer和mapperLocations之间的区别):
mapperLoactions这个是用来扫描mapper.xml,而MapperScannerConfigurer是用来找mapper接口的,也就是一个是xml,一个是java代码.class
如果mapper.xml和mapper.class在同一个包下且同名的话,MapperScannerConfigurer扫描.class的同时会自动扫描到同名的Mapper.xml并装配到.class中
但如果这两个不在同一个包下面,或者不同名的话,那就必须要用mapperLocations指定的mapper.xml的位置了
而basePackage也就是对应的包路径
这里的事物管理器transactionManager和之前的SqlSessionFactoryBean的区别:
主要也是在于数据源的选择上吧
除去配置事物增强和开启基于注解的事务:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载资源文件 是为了方便编码人员在一个阶段内不需要频繁书写一个参数的值,而在不同阶段间又可以方便的切换参数配置信息-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置C3P0数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="initialPoolSize" value="5"/>
<property name="maxPoolSize" value="10"/>
</bean>
<!--配置MyBatis sqlSessionFactory-->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定数据源,也就是前面那个-->
<property name="dataSource" ref="dataSource"/>
<!--指定Mybatis mapper的映射地址-->
<property name="mapperLocations" value="classpath*:org/wzw/dao/*.xml"/>
<!--指定Mybatis全局配置文件的位置-->
<property name="configLocation" value="classpath*:mybatis-config.xml"/>
</bean>
<!--扫描Mybatis的mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有的dao接口,加入到ioc容器当中-->
<property name="basePackage" value="org.wzw.dao"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--指定数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
建立数据表
表名:ssm_example
建表代码如下:
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`tel` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`cla` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
INSERT INTO `student` VALUES (1, '孔乙己', '男', 'kongyiji@163.com', '13509856897', '计算机1班');
INSERT INTO `student` VALUES (2, '阿强', '女', 'aqiang@126.com', '12345678909', '软件工程');
INSERT INTO `student` VALUES (3, '阿福', '男', 'afu@12345.com', '13657898762', '数学专业');
INSERT INTO `student` VALUES (4, '阿霞', '女', '12345@qq.com', '12378645987', '英语专业');
INSERT INTO `student` VALUES (5, '指南者', '男', 'compassblog@gmail.com', '13587690873', '打杂搬砖专业');
SET FOREIGN_KEY_CHECKS = 1;
建立实体类,在entity包
package org.wzw.entity;
public class Student {
private int id;
private String name;
private String gender;
private String email;
private String tel;
private String cla;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getCla() {
return cla;
}
public void setCla(String cla) {
this.cla = cla;
}
}
写业务代码
StudentControll.java
package org.wzw.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 org.springframework.web.bind.annotation.ResponseBody;
import org.wzw.entity.Student;
import org.wzw.service.StudentService;
import org.wzw.service.impl.StudentServiceImpl;
@Controller
@ResponseBody
public class StudentController {
//这个类负责和前端做连接、
//这里就简单写一个查找所有的学生
//这里就需要注入service 用他来调用方法
@Autowired
private StudentService studentService;
@RequestMapping("/findAll")
public String test(){
//这里就会调用对应的方法
Student student=studentService.getOne();
//获得之后,就需要注入
// model.addAttribute("student",student);
int id=student.getId();
return "id= "+id;
}
}
StudentService
package org.wzw.service;
import org.wzw.entity.Student;
public interface StudentService {
Student getOne();
}
StudentServiceImpl
package org.wzw.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wzw.dao.StudentDao;
import org.wzw.entity.Student;
import org.wzw.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService {
//这里就要实现那个方法 也是直接调用dao层的方法
@Autowired
private StudentDao studentDao;
public Student getOne() {
return studentDao.getOne();
}
}
StudentDao
package org.wzw.dao;
import org.wzw.entity.Student;
import java.util.List;
public interface StudentDao {
Student getOne();
}
StudentDao.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="org.wzw.dao.StudentDao">
<select id="getOne" resultType="org.wzw.entity.Student">
select * from student;
</select>
</mapper>
一些遇到的错误:
会出现关于数据库的操作,而其中当我不连接数据库的时候,会报错的是:数据库没连上
但这样一定程度上来说,数据库就是在尝试连接了。
可是当我开启数据库服务之后,就会出现:
java.sql.SQLException: Unknown system variable ‘query_cache_size’
结果网上说可能是版本过低:
<!--MyBatis 依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- Spring 整合 MyBatis 依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
改成:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
改成
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
改成
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
然后运行一下: