目录
4、IDEA中新建Moudle,pom.xml文件导入mybatis和mysql包
一、SSM整合
系统架构图
项目结构
1、需求
访问:http://localhost:8080/car/get
返回:{"name":"BMW","color":"red","price":9.9}
2、数据库准备表,添加数据
CREATE TABLE car (
id int(11) NOT NULL auto_increment,
name varchar(10) default NULL,
color varchar(10) default NULL,
price double default NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into car values(1,"Bmw","red",9.9),(2,"Auto","green",0.5)
3、创建前端页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试 框架整合</title>
</head>
<body>
<a href="http://localhost:8080/car/get">点我提交请求</a>
</body>
</html>
4、IDEA中新建Moudle,pom.xml文件导入mybatis和mysql包
<?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">
<parent>
<artifactId>cgb2105boot01</artifactId>
<groupId>cn.tedu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>day1802</artifactId>
<dependencies>
<!--导入mybatis包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--导入mysql包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
5、创建启动类RunApp
package cn.tedu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class);
}
}
6、创建配置文件application.yml
为什么使用yml配置文件?
YAML易于人们阅读。
YAML数据在编程语言之间是可移植的。
YAML匹配敏捷语言的本机数据结构。
YAML具有一致的模型来支持通用工具。
YAML支持单程处理。
YAML具有表现力和可扩展性。
YAML易于实现和使用。
k: (空格)v 的格式
注意点:
url中数据库的名字要改
drivaer驱动版本要注意加或不加cj
修改端口号也在配置文件中,
server:
port: 8090
#SpringBoot配置mysql信息
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///mybatisdb?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
#SpringBoot整合Mybatis配置
mybatis:
#指定UserMapper.xml文件的位置 *号代表resources下的文件都可以扫描到
mapper-locations: classpath:*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
7、创建Car类,进行封装数据
使用Lombok插件,也可以generater提供set、get、toString()以及无参构造和全参构造
@Component提供spring的ioc功能创建对象
package cn.tedu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.stereotype.Component;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Component//提供spring的ioc功能,将类的对象交给spring容器管理
public class Car {
private Integer id;
private String name;
private String color;
private Double price;
}
8、创建CarDao接口
package cn.tedu.dao;
import cn.tedu.pojo.Car;
import java.util.List;
@Component
public interface CarDao {
List<Car> get();//获取所有数据
}
与映射文件联系在一起:
- 映射文件的namespace值是持久层接口的全路径,对应的是持久层接口的类名
- 映射文件中SQL标签的id值对应的是持久层接口的抽象方法名
- resultType是接口中方法的返回值类型
业务层实现类和持久层接口建立自动装配时,业务层实现类会出现红色波浪线:
- 解决方案一:在持久层接口添加@Component注解
- 解决方案二:setting,editor,inspections,spring,springcore,code下取消勾选autowiring forbeans class
9、创建CarMapper.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">
<!--namespace的值是CarDao接口的全路径-->
<mapper namespace="cn.tedu.dao.CarDao">
<!--id的值是接口中的方法名 resultType是接口中方法的返回值类型-->
<select id="get" resultType="cn.tedu.pojo.Car">
select * from car
</select>
</mapper>
10、创建CarService 接口
业务层的抽象方法和持久层的抽象方法一样
package cn.tedu.service;
import cn.tedu.pojo.Car;
import java.util.List;
public interface CarService {
List<Car> get();//获取所有数据
}
11、创建业务层CarServiceImpl实现类
package cn.tedu.service;
import cn.tedu.dao.CarDao;
import cn.tedu.pojo.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service//ioc
public class CarServiceImpl implements CarService{
@Autowired//di,绑定业务层和持久层接口
private CarDao dao;//会出现红线,在cardao接口加注解@Component
//获取所有数据
@Override
public List<Car> get() {
return dao.get();
}
}
12、创建控制层CarController类
package cn.tedu.controller;
import cn.tedu.pojo.Car;
import cn.tedu.service.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("car")
public class CarController {
@Autowired //di,绑定控制层和业务层接口
private CarService carService;
@RequestMapping("get")
public List<Car> get() {
//直接使用了service的功能
return carService.get() ;
}
}
13、修改启动类,添加持久层接口的包扫描
@MapperScan("cn.tedu.dao")
package cn.tedu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("cn.tedu.dao")//扫描dao接口所在的包
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class);
}
}
14、测试
重启服务器,点击前端页面提交请求数据
15、流程结构思路分析
二、练习car类新增业务操作
1,修改CarDao接口
package cn.tedu.dao;
import cn.tedu.pojo.Car;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public interface CarDao {
List<Car> get();//获取所有数据
void add(Car c);//添加方法
}
2、修改CarMapper.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">
<!--namespace的值是CarDao接口的全路径-->
<mapper namespace="cn.tedu.dao.CarDao">
<!--id的值是接口中的方法名 resultType是接口中方法的返回值类型-->
<select id="get" resultType="cn.tedu.pojo.Car">
select * from car
</select>
<insert id="add">
insert into car values(null,#{name},#{color},#{price})
</insert>
</mapper>
3、修改CarService接口
package cn.tedu.service;
import cn.tedu.pojo.Car;
import java.util.List;
public interface CarService {
List<Car> get();//获取所有数据
void add(Car c);//添加方法
}
4、修改CarServiceImpl实现类
package cn.tedu.service;
import cn.tedu.dao.CarDao;
import cn.tedu.pojo.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service//ioc
public class CarServiceImpl implements CarService{
@Autowired//di
private CarDao dao;
@Override //新增业务
public void add(Car c) {
dao.add(c);
}
//获取所有数据
@Override
public List<Car> get() {
return dao.get();
}
}
5、修改CarController
package cn.tedu.controller;
import cn.tedu.pojo.Car;
import cn.tedu.service.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("car")
public class CarController {
@Autowired //di
private CarService carService;
//新增业务
//http:localhost:8080/car/add?id=10&name=BMW&color=gray&price=10
@RequestMapping("add")
public void add(Car c) {
System.out.println(c);
//直接使用了service的功能
carService.add(c);
}
@RequestMapping("get")
public List<Car> get() {
//直接使用了service的功能
return carService.get() ;
}
}
6、测试
三、练习dept业务操作
1、前端业务获取用户动态设置属性
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试SSM的整合</title>
<style>
</style>
</head>
<body>
<form action="http://localhost:8080/dept/get" method="get">
<table>
<tr><td><h3>根据部门名称查信息</h3></td></tr>
<tr><td>
<select name="name">
<option>呵呵</option>
<option>哈哈哈哈</option>
<option>operations</option>
<option>java教研部</option>
<option>开发</option>
<option>java考试部</option>
<option>java前端开发</option>
<option>java大数据</option>
</select>
</td></tr>
<tr><td><input type="submit" value="查看" /></td></tr><br />
</table>
</form>
<form action="http://localhost:8080/dept/getid" method="get">
<table>
<tr><td><h3>点我通过多个id获取部门信息</h3></td></tr>
<tr>
<td>
<input type="checkbox" name="id" value="1">1
<input type="checkbox" name="id" value="2">2
<input type="checkbox" name="id" value="3">3
<input type="checkbox" name="id" value="5">5
<input type="checkbox" name="id" value="11">11
</td>
</tr>
<tr><td><input type="submit" value="查看" /></td></tr><br />
</table>
</form>
</body>
</html>
2、修改DeptMapper.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="cn.tedu.dao.DeptDao">
<!--提取sql片段,include使用片段-->
<sql id="names">
id,dname,loc
</sql>
<!--动态部门名称获取部门信息-->
<select id="getbyname" resultType="cn.tedu.pojo.Dept">
select * from dept where dname=#{dname}
</select>
<!--动态获取多个id值的部门信息-->
<select id="getbyid" resultType="cn.tedu.pojo.Dept">
select
<include refid="names"></include>
from dept
where id in(
//数组形式遍历
<foreach collection="array" item="i" separator=",">
#{i}
</foreach>
)
</select>
</mapper>
3、修改DeptDao接口
package cn.tedu.dao;
import cn.tedu.pojo.Dept;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public interface DeptDao {
List<Dept> getbyname(String name);
List<Dept> getbyid(int[] id);//多个值使用数组
List<Dept> getbyloc(String[] loc);
void insert(Dept dept);//添加业务,增删改都可以
}
4、修改DeptService接口
package cn.tedu.service;
import cn.tedu.pojo.Dept;
import java.util.List;
public interface DeptService {
List<Dept> getbyname(String name);
List<Dept> getbyid(int[] id);
List<Dept> getbyloc(String[] loc);
void insert(Dept dept);//添加业务
}
5、业务层接口实现类
package cn.tedu.service;
import cn.tedu.dao.DeptDao;
import cn.tedu.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao d;
@Override
public List<Dept> getbyname(String name) {
return d.getbyname(name);
}
@Override
//int[] array={1,2,3,5,11};
public List<Dept> getbyid(int[] id) {
return d.getbyid(id);
}
@Override
public List<Dept> getbyloc(String[] loc) {
return d.getbyloc(loc);
}
@Override
public void insert(Dept dept) {
System.out.println("提交成功");
}
}
6、控制层
package cn.tedu.controller;
import cn.tedu.pojo.Dept;
import cn.tedu.service.DeptService;
import cn.tedu.service.DeptServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("dept")
public class DeptController {
@Autowired
private DeptService ds;
@RequestMapping("get")
public List<Dept> get(String name){
System.out.println(ds.getbyname(name));
return ds.getbyname(name);
}
@RequestMapping("getid")
public List<Dept>get(int[] id){
return ds.getbyid(id);
}
@RequestMapping("getname")
public List<Dept>get(String[] loc){
return ds.getbyloc(loc);
}
}
7、重启服务器,根据前端页面请求的数据进行操作