Spring IOC控制反转 管理对象
IOC( Inversion of Control)控制反转/DI依赖注入(Dependency Injection)
- service 类上加注解 @Service
- @Service:声明此类是一个业务处理类
- Controller类使用的时候,通过注解@Resource
注意:- @Resource注解与@Autowired注解一样,都可以用来自动装配bean。
- @Autowired-----由spring提供,只按照byType注入
- @Resource-----由J2EE提供,默认是按照byName自动注入
- Spring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略;而使用type属性则使用byType自动注入策略;如果既不指定name也不指定type属性,这时通过反射机制使用byName自动注入策略。
(@Autowired注解与@Resource注解的区别与用法)
(Java面试–autowired和resource区别)
- Spring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略;而使用type属性则使用byType自动注入策略;如果既不指定name也不指定type属性,这时通过反射机制使用byName自动注入策略。
service
package com.base.service;
....
@Service
public class UserService {
JDBCComon jdbc=new JDBCComon();
....
Controller
package com.base.controller;
....
@RestController
@RequestMapping("use2")//表示这个类里面所有方法的路径之前必须加use2 在类的上面配置一个拦截路径:避免拦截路径配置相同
public class UserController2 {
@Resource
UserService us;//会自动创new出来 不需要再写 根据类型查找 得在UserService中配置@Service
@RequestMapping("all")
public List<User> getAll(){
//UserService us=new UserService();
List<User> userlist=us.selectAll();
return userlist;
}
- 使用Spring的ioc 控制反转,让spring容器帮我们创建对象
- 拦截路径 http://localhost:9080/a/use2/all
集成JPA
JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。
JPA包括以下3方面的技术:
-
ORM映射元数据: 支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系
-
API: 操作实体对象来执行CRUD操作
-
查询语言: 通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合
JPA是ORM规范,Hibernate、TopLink等是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切换的成本。
(https://www.jianshu.com/p/c23c82a8fcfc)
POM 配置需要的包
<!-- 添加JPA的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
/SpringBootJPA/src/main/resources/application.properties
#设置项目的端口号
server.port=9081
#设置工程名字
server.servlet.context-path=/b
#数据库的信息 datasource 数据源
spring.datasource.url = jdbc:mysql://localhost:3306/java10?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
#配置JPA
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
实体类 entity
什么是实体:
就是与数据库对应的表
1)有Entity注解
2)要有public 或者 protected无参构造函数
3)要有主键(唯一标识)
- @Id设置id为主键
- @Column(length=50) 设置主键长度
- @GeneratedValue(strategy=GenerationType.IDENTITY) 生成的策略:主键自增
package com.ll.entity;
import java.sql.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class OrderMaster {
@Id//表示主键
@Column(length=50)
private String id;
private String name;
private double total;//总价
private String address;
private Date createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
Repository—crudRepository
信息库的概念:
-
库原意指的是仓库,即数据仓库的意思.Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。这样设计的好处有两个:
- 降低层级之间的耦合:更换,升级ORM引擎(休眠)并不会影响业务逻辑
- 提高测试效率:如果在测试时能用模拟数据对象代替实际的数据库操作,运行速度会快很多
资源库和DAO的区别
- DAO:是传统MVC中模型的关键角色,全称是数据访问对象.DAO直接负责数据库的存取工作—相对于数据库而言(DAO仍然停留在数据操作的层面上)
- Repository:库蕴含着真正的面向对象的概念,即一个数据仓库角色,负责所有对象的持久化管理.—相对于对象
库介绍
Spring Data JPA中,有三种存储库接口方便开发者直接操作数据仓库。
它们之间的关系如下:( - >为继承关系)
JpaRepository - > PagingAndSortingRepository - > CrudRepository
CrudRepository
-
提供基本的CRUD操作其中保存方法对应两种操作:数据存在主键时,执行更新操作,不存在主键时执行插入操作。
-
sava /savaAll / findById / existsById / findAll / findAllById / count / deleteById / delete / deleteAll
-
spirng jap-------save =saveOrUpdate 查找id如果查找到了就会去修改;没有找到就会添加
PagingAndSortingRepository
- 增加了分页和排序的方法。
- public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable findAll(Sort var1);
Page findAll(Pageable var1);}
- public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
JpaRepository
-
JpaRepository则进一步在PagingAndSorting基础上,扩展了部分功能:
- 查询列表 / 批量删除 / 强制同步 /Example查询
(https://segmentfault.com/a/1190000012346333#articleHeader4)
(https://blog.csdn.net/qq_34075488/article/details/85123707)
- 查询列表 / 批量删除 / 强制同步 /Example查询
package com.ll.repository;
import org.springframework.data.repository.CrudRepository;
import com.ll.entity.OrderMaster;
public interface OrderMasterRepository extends CrudRepository<OrderMaster,String> {
}
Service
package com.ll.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.ll.entity.OrderMaster;
import com.ll.repository.OrderMasterRepository;
@Service
public class OrderService {
@Resource
OrderMasterRepository masterRepository;
public OrderMaster addmaster(OrderMaster master) {
return masterRepository.save(master);
}
}
controller
ackage com.ll.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ll.entity.OrderMaster;
import com.ll.service.OrderService;
import com.ll.util.KeyUtil;
@RestController
@RequestMapping("ordermaster")
public class OrderController {
@Resource
OrderService orderService;
@RequestMapping("add")
public OrderMaster save(HttpServletRequest request) {
OrderMaster master=new OrderMaster();
String address=request.getParameter("address");
String name=request.getParameter("name");
master.setId(KeyUtil.genUniqueKey());
master.setAddress(address);
master.setName(name);
return orderService.addmaster(master);
}
}
- 测试地址:http://localhost:9081/b/ordermaster/add?address=ddd&name=jacky