我们为什么要学习Spring?
Spring框架的优势?
什么是Spring?
Spring框架的两大核心技术是什么?
? ? ? ? ①Spring框架提供了很丰富的技术
? ? ? ? ②目前,在企业开发中用到Spring技术的占据99%?
????????1.方便解耦,简化开发
????????2.AOP编程的支持
????????3.声明式事务的支持
????????4.方便程序的测试
????????5.方便集成各种优秀框架
????????6.降低Java EE API的使用难度
? ? ? ? ?Spring的技术包括:控制反转&依赖注入、面向切面编程、spring事务管理、通过spring集成其他框架 等等……(现在说这些也都是概念级的,后面详细了解即可)
? ? ? ? IOC:IOC 就是控制反转,原来我们需要创建对象的,必须自己 new,但是现在有了 spring 容器,我们不需要再自己 new 了,有两个好处,解耦,因为对象自己 new 完之后,无法更改,如果依赖对象发生异常,则会对我们自己的类造成 影响。 springIOC,用户只需要进行配置,容器会在容器中自动实例化依赖对象,并且是单例模式,直接通过@autowired 直接注入即可。
????????AOP:AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共 行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码, 降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AOP 实现的关键在于 代理模式,AOP 代理主要分为静态代理和动态代理。静态代理的代表为 AspectJ;动态代理则以 Spring AOP 为代表。
需求:创建一个简单的spring项目,完成对sudent表的增删改查 ,以及登录(user)
用户表user:
id 主键
username 用户名??
password 密码
学生表student:
id 主键
name 姓名
sex 性别 int类型
time 日期
major 专业?
important:
pom文件中的依赖需要导入,不然项目就是不完整的(会出一期pom文件中相关的依赖,关注收藏叭)
ssm_dao:mapper层和实体类我的是Student类,我这里采用的是通用mapper来开发的
ssm_service:service层包含service接口和实现类
ssm_web:controller层,主要处理前端请求地址,以及前端
问题来了:mybatis和通用mapper的区别是什么呢?
项目建立完毕之后,要开始编写每一层所需要的内容
要想使用mapper开发,实体类中属性要和表中属性对应,包括必须标记的注解
下面是我实体类中的属性以及对应注解
table:识别表
id:标记主键
transient:不是表中属性
column:列,若实体类中的属性名称和表中不一致,使用column注解
通用mapper使用方式,创建一个接口继承Mapper接口,泛型是我们所需的实体类。例如:
??
?主要的业务逻辑在service层
在service层通过@AutoWired注入,创建mapper对象会爆红,像这样:
放心,不是问题,在Mapper层上加个注解@Repository就可以轻松解决啦
mapper继承了Mapper接口之后,用mapper创建的对象就能调用相应的方法
Select
方法:List<T> select(T record);
说明:根据实体中的属性值进行查询,查询条件使用等号
方法:T selectByPrimaryKey(Object key);
说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
方法:List<T> selectAll();
说明:查询全部结果,select(null)方法能达到同样的效果
方法:T selectOne(T record);
说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
方法:int selectCount(T record);
说明:根据实体中的属性查询总数,查询条件使用等号
Insert
方法:int insert(T record);
说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
方法:int insertSelective(T record);
说明:保存一个实体,null的属性不会保存,会使用数据库默认值
Update
方法:int updateByPrimaryKey(T record);
说明:根据主键更新实体全部字段,null值会被更新
方法:int updateByPrimaryKeySelective(T record);
说明:根据主键更新属性不为null的值
Delete
方法:int delete(T record);
说明:根据实体属性作为条件进行删除,查询条件使用等号
方法:int deleteByPrimaryKey(Object key);
说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
Example方法
方法:List<T> selectByExample(Object example);
说明:根据Example条件进行查询
重点:这个查询支持通过Example
类指定查询列,通过selectProperties
方法指定查询列
方法:int selectCountByExample(Object example);
说明:根据Example条件进行查询总数
方法:int updateByExample(@Param("record") T record, @Param("example") Object example);
说明:根据Example条件更新实体record
包含的全部属性,null值会被更新
方法:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
说明:根据Example条件更新实体record
包含的不是null的属性值
方法:int deleteByExample(Object example);
说明:根据Example条件删除数据
我的serviceimpl中都有这些内容,仅供参考(写代码时写注释是好习惯,一定要培养起来……我的注释写的非常潦草):
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public List<Student> findAllStudent(Student student) {
Example example = new Example(Student.class);
Example.Criteria criteria = example.createCriteria();
//模糊查询
if(student.getName()!=null && !student.getName().equals("")){
criteria.andLike("name","%"+student.getName()+"%");
}
//区间查询
if(student.getStart()!=null){
criteria.andGreaterThanOrEqualTo("time",student.getStart());
}
if(student.getEnd()!=null){
criteria.andLessThanOrEqualTo("time",student.getEnd());
}
List<Student> studentList = studentMapper.selectByExample(example);
return studentList;
}
//数据回显
@Override
public Student findById(Integer id) {
return studentMapper.selectByPrimaryKey(id);
}
//修改
@Override
public void updateStudent(Student student) {
studentMapper.updateByPrimaryKeySelective(student);
}
//添加
@Override
public void addStudent(Student student) {
studentMapper.insertSelective(student);
}
//删除
@Override
public void DeleteById(Integer id) {
studentMapper.deleteByPrimaryKey(id);
}
//统计有几个学生
@Override
public Integer toCount() {
Student student=new Student();
int i = studentMapper.selectCount(student);
return i;
}
//统计
@Override
public List<Student> findCount() {
return studentMapper.findCount();
}
}
处理前端控制器发送过来的请求
我的controller层内容,仅供参考:
student
@Controller
@RequestMapping("student")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("studentList")
public String findAllStudent(Student student, Model model, @RequestParam(required = true,defaultValue = "1")Integer pageNum,HttpServletRequest request){
User user = (User) request.getSession().getAttribute("user");
//只有登陆过才能进入主页面
if(user!=null){
PageHelper.startPage(pageNum,3);
List<Student> studentList=studentService.findAllStudent(student);
PageInfo<Student> pageInfo = new PageInfo<>(studentList);
Integer count=studentService.toCount();
model.addAttribute("countNumber",count);
model.addAttribute("page",pageInfo);
return "show";
}else{
return "login";
}
}
@RequestMapping("findById")
public String findById(Integer id,Model model){
Student student=studentService.findById(id);
model.addAttribute("student",student);
return "update";
}
@RequestMapping("update")
public String updateStudent(Student student){
studentService.updateStudent(student);
return "redirect:studentList";
}
@RequestMapping("DeleteById")
public String DeleteById(Integer id){
studentService.DeleteById(id);
return "redirect:studentList";
}
@RequestMapping("toadd")
public String toadd(){
return "add";
}
@RequestMapping("tocount")
public String tocount(Model model){
List<Student> studentList=studentService.findCount();
model.addAttribute("studentList",studentList);
return "count";
}
@RequestMapping("add")
public String addStudent(Student student){
studentService.addStudent(student);
return "redirect:studentList";
}
@RequestMapping("pldelete")
public String pldelete(Integer[] ids){
for (Integer id : ids) {
studentService.DeleteById(id);
}
return "redirect:studentList";
}
}
user:
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
private static long yanzheng=0;
@RequestMapping("tologin")
public String tologin(Model model){
Random random=new Random();
long x=random.nextInt(10000)+1000;
yanzheng=x;
model.addAttribute("number",x);
return "login";
}
@RequestMapping("userLogin")
public String login(User user, HttpServletRequest request){
if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getYanzheng())){
request.getSession().setAttribute("error","账号或密码不能为空!");
return "redirect:tologin";
}
User user1=userService.login(user);
if(user1!=null && user.getYanzheng()==yanzheng){
request.getSession().setAttribute("user",user1);
return "redirect:/student/studentList";
}else{
request.getSession().setAttribute("error","您输入的账号或密码错误,请重新输入!");
return "redirect:tologin";
}
}
}
在开启项目的时候会先执行index,执行之后我在index中写了一个重定向到登陆页面,包含验证码
?最后,看一遍运行结果(添加时有个弹窗,是我测试添加的时候加的,无伤大雅):
spring运行结果
想要完整代码???,关注,私信,绝对会给!!!
详细地都感觉自己有点啰嗦了,这篇文章就到这里叭?resources里面的内容可以来私信我要文件