ssm项目流程(xml版和注解版)
文章目录
1.创建maven web项目
2.导入依赖
<dependencies>
<!-- spring 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</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>
<!-- 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.0</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>
</dependencies>
3.数据库脚本
/*
Navicat Premium Data Transfer
Source Server : zzl
Source Server Type : MySQL
Source Server Version : 80028
Source Host : localhost:3306
Source Schema : studentms
Target Server Type : MySQL
Target Server Version : 80028
File Encoding : 65001
Date: 24/04/2022 12:56:03
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(0) NOT NULL,
`name` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`sex` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
`hometown` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`password` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (192208102124, 'zzl', 'male', 21, '湖北荆州', 123456);
INSERT INTO `user` VALUES (192208102125, 'zzm', 'male', 21, '湖北武汉', 123456);
INSERT INTO `user` VALUES (192208102126, 'zzn', 'female', 21, '上海', 123456);
INSERT INTO `user` VALUES (192208102127, 'zzx', 'female', 21, '山东', 123456);
SET FOREIGN_KEY_CHECKS = 1;
4.结构编写
1.User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
long id;
String name;
String sex;
int age;
String hometown;
int password;
}
2.UserMapper
public interface UserMapper {
void addUser(User user);
void deleteUser(long id);
void updateUser(User user);
void selectUser(long id);
List<User> queryAllUser();
}
3.UserMapper.xml
没有写parameterTyp也可以,因为mybatis能自动识别,但返回值类型不能不写,因为mybatis需要将获得结果封装到相应的类中,查询的字段与类的属性需要一致(不一致的需要显示的配置)。
<mapper namespace="com.zzl.mapper.UserMapper">
<insert id="addUser" parameterType="User">
insert into studentms.user(id,name,sex,age,hometown,password)
value (#{id},#{name},#{sex},#{age},#{hometown},#{password})
</insert>
<delete id="deleteUser" parameterType="long">
delete from studentms.user where id=#{id}
</delete>
<update id="updateUser" parameterType="User">
update studentms.user
set name=#{name},sex=#{sex},age=#{age},hometown=#{hometown},password=#{password}
where id=#{id}
</update>
<select id="selectUser" parameterType="long" resultType="User">
select * from studentms.user
where id=#{id}
</select>
<select id="queryAllUser" resultType="User">
select * from studentms.user
</select>
</mapper>
4.UserService
通过service层完成对Mapper层的封装,通过service层来访问Mapper层
public interface UserService {
void addUser(User user);
void deleteUser(int id);
void updateUser(User user);
void selectUser(int id);
List<User> queryAllUser();
}
5.UserServiceImpl
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public void addUser(User user) {
userMapper.addUser(user);
}
public void deleteUser(int id) {
userMapper.deleteUser(id);
}
public void updateUser(User user) {
userMapper.updateUser(user);
}
public void selectUser(int id) {
userMapper.selectUser(id);
}
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
}
5.编写配置文件
1.resource/spring-mybatis.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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置整合mybatis -->
<!-- 1.关联数据库文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 2.数据库连接池 -->
<!--数据库连接池
dbcp 半自动化操作 不能自动连接
c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
-->
<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>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.zzl.mapper"/>
</bean>
</beans>
2.resource/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>
<!-- 设置了别名可以在UserMapper.xml中的属性中不适用全限定名,使用User即可-->
<typeAliases>
<package name="com.zzl.entity"/>
</typeAliases>
<!--将UserMapper.class与UserMapper.xml关联到一起-->
<mappers>
<mapper resource="com/zzl/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.resource/spring-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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解驱动 -->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.扫描web相关的bean -->
<context:component-scan base-package="com.zzl.controller" />
</beans>
4.resource/spring-service.xml
这里就是将service中的类注入到ioc中生成bean,同时配置事务管理
<?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">
<!-- 扫描service相关的bean -->
<context:component-scan base-package="com.zzl.service" />
<!--BookServiceImpl注入到IOC容器中-->
<bean id="UserServiceImpl" class="com.zzl.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
5.resource/applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-mybatis.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
6.webapp/WEB-INF/web.xml
<?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">
<!--DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!-->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--encodingFilter-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Session过期时间-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
6.编写Control进行测试
@RestController
@RequestMapping("/User")
public class UserController {
@Autowired
@Qualifier("UserServiceImpl")
private UserServiceImpl userService;
@RequestMapping("/allUser")
public List<User> list(Model model) {
List<User> list = userService.queryAllUser();
model.addAttribute("list", list);
return list;
}
}
使用纯注解进行开发
1.创建普通maven web项目后删除所有的xml文件
最终的项目结构如图
这里与纯注解开发spring差不多,都是通过配置类来代替xml文件。
1.MybatisConfig
public class MybatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
//通过工厂bean创建对象
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//设置数据源
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
代替了
原本的spring-mybatis中的sqlSession的配置或者原本的Mybatis工具类
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
2.SpringMvcConfig
@EnableWebMvc
@ComponentScan("com.zzl.controller")
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver view =new InternalResourceViewResolver();
view.setPrefix("/WEB-INF/jsp/");
view.setSuffix(".jsp");
return view;
}
}
代替了原本的spring-mvc.xml
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解驱动 -->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.扫描web相关的bean -->
<context:component-scan base-package="com.zzl.controller" />
3.SpringMybatisConfig
这里的数据库连接池与前面xml方式的连接池不一样
这里的是阿里巴巴的 Druid 前面的是c3p0
@ComponentScan("com.zzl.service")
@MapperScan("com.zzl.mapper")
@PropertySource("classpath:database.properties")
public class SpringMybatisConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer psp(){
return new PropertySourcesPlaceholderConfigurer();
}
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource ds(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
}
代替了原来的spring-mybatis.xml
<context:property-placeholder location="classpath:database.properties"/>
<!-- 2.数据库连接池 -->
<!--数据库连接池
dbcp 半自动化操作 不能自动连接
c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
-->
<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}"/>
4.WebInitialer
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
//创建Spring容器
AnnotationConfigWebApplicationContext application = new AnnotationConfigWebApplicationContext();
application.register(SpringMvcConfig.class);
application.register(SpringMybatisConfig.class);
application.register(MybatisConfig.class);
DispatcherServlet dispatcherServlet=new DispatcherServlet(application);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);
servlet.addMapping("/");//添加上下文路径地址
servlet.setLoadOnStartup(1);//最优先启动
servlet.setAsyncSupported(true); //设置允许异步线程
}
}
代替了原来的web.xml
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!-->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>User
5.UserMapper
添加了一个@Seletct进行测试
@Mapper
@Repository
public interface UserMapper {
void addUser(User user);
void deleteUser(long id);
void updateUser(User user);
void selectUser(long id);
@Select("select * from user")
List<User> queryAllUser();
}
6.UserService和UserServiceImpl
这里把自己蠢了半天
前面的非注解版在xml中实现了UserMapper的动态加载到IoC中赋值
在这里需要添加@Autowired注解将userMapper赋值
public interface UserService {
void addUser(User user);
void deleteUser(int id);
void updateUser(User user);
void selectUser(int id);
List<User> queryAllUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public void addUser(User user) {
userMapper.addUser(user);
}
public void deleteUser(int id) {
userMapper.deleteUser(id);
}
public void updateUser(User user) {
userMapper.updateUser(user);
}
public void selectUser(int id) {
userMapper.selectUser(id);
}
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
}
7.TestController1
@RestController
@RequestMapping("/User")
public class TestController1 {
@Autowired
@Qualifier(value ="userServiceImpl")
UserServiceImpl userService;
@RequestMapping("/all")
public List<User> test(){
return userService.queryAllUser();
}
}
总结
使用纯注解开发也并没有比使用xml开发简便多少,所有将注解与xml并用才是最好的