day01-项目介绍+SSM环境搭建
项目介绍+SSM环境搭建
1.项目功能/界面
- SSM整合项目界面:使用Vue完成
- 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM
- 前端框架-Vue3
- 后端框架-SSM(SpringMVC+Spring+MyBatis)
- 数据库-MySQL
- 项目依赖管理-Maven
- 分页-pagehelper
- 逆向工程-MyBatis Generator
- 其他...
2.项目基础环境搭建
2.1创建项目
(1)创建maven项目(注意配置maven的仓库镜像,不然创建的时候会很慢),File--New--Project--Maven




(2)手动创建java和test相关目录

(3)pom.xml文件中引入项目基本的jar包
<!--部分--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--引入SpringMVC,也会自动导入spring的库--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.8</version> </dependency> <!--引入spring-jdbc,支持事务相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.8</version> </dependency> <!--引入spring aspect--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.8</version> </dependency> <!--引入mybatis库--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--引入druid数据库连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> <!--mysql的驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> </dependencies>
(4)给项目配置Tomcat


(5)启动tomcat,测试成功

2.2项目全局配置web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--(1)配置启动Spring容器:主要配置和业务逻辑相关的,比如数据源,事务控制等--> <context-param> <param-name>contextConfigLocation</param-name> <!--指定文件位置--> <param-value>classpath:applictionContext.xml</param-value> </context-param> <!--(2)ContextLoaderListener 监听器,它的作用: 1.当启动web容器时,自动装配 applictionContext的配置信息 2.它实现了ServletContextListener 接口, 启动容器时,ContextLoaderListener自动会读取名为“contextConfigLocation”的参数配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--(3)配置SpringMVC的前端控制器,拦截所有的请求 因为这里没有指定SpringMVC的配置文件,这里就会按照servlet-name-servlet.xml的方式来获取 --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--3.1如果我们没有配置contextConfigLocation, 就默认按照默认机制/WEB-INF/springDispatcherServlet-servlet.xml去找--> <!--3.2在web项目启动时,就自动地加载DispatcherServlet--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--(4)配置spring提供的字符编码过滤器,解决中文编码问题--> <filter> <filter-name>characterEncodingFilter</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> <init-param> <!--过滤器会执行request.setCharacterEncoding(encoding)--> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <!--过滤器会执行response.setCharacterEncoding(encoding)--> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--(5)配置HiddenHttpMethodFilter,使用rest风格的url, 作用是把以post请求提交的delete和put请求进行转换--> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
如果web.xml的<web-app>
报红,选择只是高亮syntax即可,本身是没有问题的,只是DTD本身的约束

2.3SpringMVC配置
WEB-INF 目录下创建SpringMVC的配置文件 springDispatcherServlet-servlet.xml
文件的命名要根据上面web.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"> <!--(1)配置自动扫描com.li.furn包--> <context:component-scan base-package="com.li.furn"> <!--springmvc只扫描Controller--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--(2)配置默认视图解析器,指定页面返回--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置属性 suffix(后缀) 和 prefix(前缀)--> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".html"/> <property name="order" value="10"/> </bean> <!--(3)加入两个常规配置--> <!--支持SpringMVC的高级功能,比如:JSR303校验,映射动态请求--> <mvc:annotation-driven/> <!--将SpringMVC不能处理的请求,交给tomcat处理,比如css,js--> <mvc:default-servlet-handler/> </beans>
2.4配置Spring和MyBatis,并完成整合
(1)在resource目录下创建jdbc.properties,配置连接mysql的信息
# The key value is arbitrary jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.pwd=123456
(2)在pom.xml文件引入mybatis整合spring的适配包
<!--引入mybatis整合spring的适配包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency>
(3)在resource目录下创建 Spring 的配置文件 applicationContext.xml
右键-->New-->XML Configuration-->Spring Config
<?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" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--spring的配置文件:主要配置和业务逻辑有关的,比如数据源,事务控制等--> <!--(1)配置扫描com.li.furn包(控制器除外,它由springmvc管理)--> <context:component-scan base-package="com.li.furn"> <!--排除扫描 @Controller注解--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--(2)配置数据源--> <!--2.1引入外部的属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--2.2配置数据源对象-DataSource--> <bean class="com.alibaba.druid.pool.DruidDataSource" id="pooledDataSource"> <!--给数据源对象配置属性值--> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.pwd}"/> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> <!--!!(3)配置spring和mybatis的整合 3.1在项目中要引入mybatis整合到spring的适配库 mybatis-spring--> <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> <!--指定mybatis的全局配置文件mybatis-config.xml--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--指定数据源--> <property name="dataSource" ref="pooledDataSource"/> <!--指定mybatis的 mapper.xml文件的位置 我们在开发中通常把 mapper.xml放在类路径下 resource/mapper 所以这里指定的value是 classpath:mapper/*.xml--> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!--(4)配置扫描器,将mybatis接口的实现加入到ioc容器中--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--扫描所有的dao接口的实现,将入到ioc容器中,这里的dao接口就是mapper接口 (mapper接口放在com.li.furn.dao下,因为mybatis处于DAO层,用于操作数据库)--> <property name="basePackage" value="com.li.furn.dao"/> </bean> <!--(5)配置事务管理器对象--> <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="pooledDataSource"/> </bean> <!--(6)配置开启基于注解的事务(这里使用xml+切入表达式),并指定切入点--> <!--6.1指定事务规则,即指定事务如何切入--> <tx:advice id="txAdvice"> <tx:attributes> <!--*代表所有方法都是事务方法--> <tx:method name="*"/> <!--以get开头的所有方法,我们认为是只读的,进行调优--> <tx:method name="get*" read-only="true"/> </tx:attributes> </tx:advice> <!--6.2配置切入表表达式,引用上面的事务规则,即在匹配切入表达的方法中使用上述的事务规则--> <aop:config> <!--切入表达式--> <aop:pointcut id="txPoint" expression="execution(* com.li.furn.service..*(..))"/> <!--配置事务规则,使用上面的txAdvice,指定规则对txPoint进行切入--> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/> </aop:config> </beans>
(4)在resource目录下创建mapper目录,存放xxxMapper.xml文件
(5)在resource目录下创建mybatis的配置文件 mybatis-config.xml(原因和上面一致,因为在spring配置文件中指定了路径)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--暂时为空--> </configuration>
2.5创建表,使用逆向工程生成Bean、XxMapper和XxMapper.xml
(1)创建数据库和表
-- 创建数据库 CREATE DATABASE furn_ssm; USE furn_ssm; -- 创建家居表 CREATE TABLE furn( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, #id `name` VARCHAR(64) NOT NULL, #家居名 `maker` VARCHAR(64) NOT NULL, #厂商 `price` DECIMAL(11,2) NOT NULL, #价格 `sales` INT(11) NOT NULL, #销量 `stock` INT(11) NOT NULL, #库存 `img_path` VARCHAR(256) NOT NULL #照片路径 ); -- 初始化家居数据 INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , '北欧风格小桌子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , '简约风格小椅子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , '典雅风格小台灯' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , '温馨风格盆景架' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg'); SELECT * FROM furn;

(2)使用MyBatis Generator 逆向生成bean mapper接口和mapper.xml
如果逆向工程生成的代码不能满足需求,再自己编写
2.1)修改Mybatis-config.xml,增加typeAliases别名配置,配置日志输出
<configuration> <!--配置mybatis自带的日志输出,查看原生的sql--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases> <!--直接引入包,包下面的所有类名都可以作为别名使用--> <package name="com.li.furn.bean"/> </typeAliases> </configuration>
2.2)在pom.xml引入MyBatis Generator包
<!--引入mybatis逆向工程的依赖包--> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency>
2.3)在项目目录下创建mbg.xml(mybatis generator),并参考文档进行配置
文档和模板:MyBatis Generator Core – MyBatis Generator XML Configuration File Reference
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <!--生成没有注释的 bean--> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--配置数据库连接信息,按照你的实际情况配置--> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/furn_ssm?characterEncoding=utf8" userId="root" password="123456"> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--指定Javabean生成的位置 targetPackage 是包名,targetProject是包所在的路径--> <javaModelGenerator targetPackage="com.li.furn.bean" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--指定sql映射文件(xml文件)生成的位置--> <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!--指定dao接口生成的位置,也就是mapper接口--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.li.furn.dao" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!--指定要逆向生成的表和生成策略 tableName是数据库的表名,domainObjectName是生成的Javabean的类名--> <table tableName="furn" domainObjectName="Furn"/> </context> </generatorConfiguration>
2.4)在test目录下创建一个MBGTest.java,该文件可以生成相关bean、mapper接口和mapper.xml
文件模板:MyBatis Generator Core – Running MyBatis Generator With Java
package com.li.furn.test; import org.junit.Test; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @author 李 * @version 1.0 */ public class MBGTest { @Test public void generator() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //这里根据自己的情况指定配置的 mbg.xml文件 //如果下面这样访问,需要将文件放在项目目录下 File configFile = new File("mbg.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
运行上述方法后,可以看到成功生成了指定的文件:这样我们就可以直接使用逆向工程成功的方法操作数据库,而不必在接口和映射文件来回编写代码。

(3)使用Junit测试Spring和MyBatis是否整合成功,能否通过MyBatis添加furn到数据库
3.1)修改bean:Furn.java,分别添加全参和无参构造器(略)
3.2)在test目录下增加测试文件,测试逆向工程生成的方法是否可用。
@Test public void insertSelective() { //初始化spring容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取到 FurnMapper的代理对象(类型=class com.sun.proxy.$Proxy17) FurnMapper furnMapper = ioc.getBean(FurnMapper.class); //添加数据 Furn furn = new Furn(null, "小电灯", "一等家居", new BigDecimal(66), 123, 45, "/assets/images/product-image/1.jpg"); int affected = furnMapper.insertSelective(furn); System.out.println("操作影响行数=" + affected + ",操作成功!"); }
测试成功:

2.6注意事项和细节说明
关于逆向生成的方法中,insertSelective() 和 insert() 方法的区别:
- insertSelective-选择性保存数据
比如User中有三个字段:id,name,age,但是在插入数据时只设置了name字段:
User u = new User(); u.setName("张三") insertSelective(u);
它在底层发出的sql语句为:insert into db_user (id,name) value (null,"张三");
,也就是说生成的sql的字段是有选择性的,会根据你设置的值来生成(ps:这里的id是自增长的)
- insert 则是无论设置多少个字段,统一都要添加一遍,即使是一个。如:
User u = new User(); u.setName("张三") insert(u);
底层生成的sql语句为:insert into db_user (id,name,age) value (null,'张三',null,null)
因此在使用insert方法时要注意,如果表的字段不允许为null,调用方法时又没有设置值,就会出错。通常情况下推荐使用 insertSelective() 方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战