CREATE DATABASE maven_adv;
-- 创建用户表 用户名
CREATE TABLE `user` (
uid INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAr(20) NOT NULL,
sex CHAr(1) DEFAULT '男',
phone VARCHAr(20)
);
插入初始数据
INSERT INTO `user` (`name`,sex,phone) VALUES
('张小敏','女','13923454567'),
('李强','男','18712321234'),
('邹家俊','男','16233425678');
建订单表order
-- 订单表
CREATE TABLE `order` (
oid INT PRIMARY KEY AUTO_INCREMENT,
address VARCHAr(100) COMMENT '订单地址',
total DOUBLE COMMENT '金额',
uid INT,
FOREIGN KEY(uid) REFERENCES `user`(uid)
);
插入初始数据
- 一个用户下多个订单
INSERT INTO `order` (address,total,uid) VALUES
('广东省汕头市', 3200,1),
('湖南省株洲市', 250,1),
('广西省柳州市', 1200,2),
('广州市海珠区', 78,2),
('海南省海口市', 605,3);
2.建maven父子工程
3.在父模块中导包,并约定包的版本号
4.第四步:在实体类中建两个实体类4.0.0 com.itheima day36-ssm-parentpom 1.0-SNAPSHOT ssm-entity ssm-dao ssm-service ssm-web UTF-8 UTF-8 5.2.10.RELEASE 1.7.7 3.1.0 3.5.5 8.0.22 1.3.1 1.0.29 1.6.122.9.8 1.18.6 4.13 org.springframework spring-context${spring.version} org.springframework spring-webmvc${spring.version} org.springframework spring-jdbc${spring.version} org.aspectj aspectjweaver${aspectj.version} javax.servlet javax.servlet-api${servlet.version} org.mybatis mybatis${mybatis.version} org.mybatis mybatis-spring${mybatis.spring.version} mysql mysql-connector-java${mysql.version} com.alibaba druid${druid.version} org.slf4j slf4j-log4j12${slf4j.version} com.fasterxml.jackson.core jackson-databind${jackson.version} org.projectlombok lombok${lombok.version} org.springframework spring-test${spring.version} test junit junit${junit.version} test
由于其不需要依赖谁,使用直接使用父模块里面的包即可,系统会自动建立关系
User类:
@Data
public class User {
private Integer uid;
private String name;
private char sex;
private String phone;
}
Order类:
@Data
public class Order {
private Integer oid;
private String address;
private Double total;
private User user; //包含了用户对象,查询订单对象,可以获取到用户对象的属性
}
5.第五步:在dao模块中编写实体类以及对应的SQL语句方法,用于访问数据库。
public interface OrderDao {
List findUserAndOrder(@Param("address") String address);
}
用xml配置来写SQL语句(简单SQL用注解方式写就行,复杂SQL语句要用到xml配置来写)
注意:此处建包是com/itheima/dao,不是用点隔开,否则建包不成功。
在依赖包里面添加其对实体类的依赖SELECT * FROM `user` u INNER JOIN `order` o ON u.uid = o.uid WHERe address LIKE "%"#{address}"%"
6.第六步:在service模块中编写相关配置 6.1建如下框架: 6.2导依赖包:org.example ssm-entity1.0-SNAPSHOT
在pom.xml配置文件中添加:service对dao的依赖
com.itheima
ssm-dao
1.0-SNAPSHOT
6.3编写comfig里面的三个配置类:jdbcConfig用于链接数据库,MybatisConfig用于Spring整合Mybatis,以及SpringConfig主配置类(以后这些都是固定不变的,因此在接下来的项目,这些都是直接拿来使用了。最多修改一下其上面的注解。)
jdbcConfig类:
@PropertySource("classpath:jdbc.properties") //加载属性文件
public class JdbcConfig {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
MybatisConfig类:
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//注入数据源
factoryBean.setDataSource(dataSource);
//定义别名
factoryBean.setTypeAliasesPackage("com.itheima.entity");
//显示查询的SQL语句
Configuration configuration = new Configuration(); //创建一个配置对象
configuration.setLogImpl(StdOutImpl.class); //在控制台显示SQL语句
configuration.setMapUnderscoreToCamelCase(true); //开启下划线列名映射成实体类中驼峰命名
factoryBean.setConfiguration(configuration);
return factoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.itheima.dao");
return configurer;
}
}
SpringConfig主配置类:
@Configuration
@ComponentScan("com.itheima.service") //只扫描业务层
//整合mybatis,需要导入其它的两个配置文件
@Import({JdbcConfig.class, MybatisConfig.class})
@EnableTransactionManagement //开启事务管理
public class SpringConfig {
}
6.4:在resources下导入两个源文件配置:(之前多次使用,其实复制粘贴进来就可以)
jdbc.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql:///maven_adv?serverTimezone=UTC jdbc.username=root jdbc.password=root
log4j.properties(用以对log4j的日志的支持)
# 全局的日志级别,输出到控制台 log4j.rootLogger=info, stdout # Spring框架中的日志级别为info log4j.category.org.springframework=info # dao包中的日志级别为debug log4j.category.com.itheima.dao=debug # 输出到控制台的日志格式 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]-%m%n6.5:编写service的接口以及实现类
public interface OrderService {
List findUserAndOrder(String address);
}
@Service//注意此处添加注解,将这个类添加到Spring容器中
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Override
public List findUserAndOrder(String address) {
return orderDao.findUserAndOrder(address);
}
}
7.第七步编写web模块
7.1建如下框架
7.2导入相关依赖
7.3编写comfig里面的三个配置类:SpringMvcConfig(springMVC子容器,用于配置web相关支持),ServletConfigInitializer(将Spring父容器和子容器建立联系,并初始化加载,建立拦截所有请求处理),SpringMvcSupport(用以放行前端的静态资源)(以后这些都是固定不变的,因此在接下来的项目,这些都是直接拿来使用了。最多修改一下其上面的注解。)org.example ssm-service1.0-SNAPSHOT
SpringMvcConfig类:
@Configuration
@ComponentScan({"com.itheima.controller", "com.itheima.config"}) //扫描控制器
@EnableWebMvc //开启json转换
public class SpringMvcConfig {
}
ServletConfigInitializer类:
public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SpringMvcSupport类:
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println("静态资源放行");
registry.addResourceHandler("/css
@GetMapping("order")
public List findUserAndOrder(String address) {
return orderService.findUserAndOrder(address);
}
}
webapp里面的前端代码在我电脑里面,没有前端代码,可以使用postmen进行模拟交互。



