Spring框架父子工程的整合

我们为什么要学习Spring?

Spring框架的优势?

什么是Spring?

Spring框架的两大核心技术是什么?

1、首先,为什么要学习Spring:

        ①Spring框架提供了很丰富的技术

        ②目前,在企业开发中用到Spring技术的占据99% 

2、 Spring框架的优势?

        1.方便解耦,简化开发

        2.AOP编程的支持

        3.声明式事务的支持

        4.方便程序的测试

        5.方便集成各种优秀框架

        6.降低Java EE API的使用难度

3、什么是Spring?

         Spring的技术包括:控制反转&依赖注入、面向切面编程、spring事务管理、通过spring集成其他框架 等等……(现在说这些也都是概念级的,后面详细了解即可)

4、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 专业 

创建项目:

1、创建项目:(打开idea,新建项目)

 2、创建一个maven项目: 

 3、点击next之后来到这个页面(按步骤操作)

 4、找到我们要放入的文件夹路径,点击finish 这样父项目就创建好啦,是这样的:

5、 接下来创建ssm_parent的子类,new Module(需要创建三次,分别是:dao层,service层,web层),创建的方式都一样

6、另外需要注意的是web层需要创建一个webapp,创建方式如下: 

7、完成:项目到现在为止就创建完毕啦 ,这是创建之后的目录

important:

pom文件中的依赖需要导入,不然项目就是不完整的(会出一期pom文件中相关的依赖,关注收藏叭)

ssm_dao:mapper层和实体类我的是Student类,我这里采用的是通用mapper来开发的

ssm_service:service层包含service接口和实现类

ssm_web:controller层,主要处理前端请求地址,以及前端

问题来了:mybatis和通用mapper的区别是什么呢?

项目建立完毕之后,要开始编写每一层所需要的内容

编写每层内容

ssm_dao层:

要想使用mapper开发,实体类中属性要和表中属性对应,包括必须标记的注解

下面是我实体类中的属性以及对应注解

table:识别表

id:标记主键

transient:不是表中属性

column:列,若实体类中的属性名称和表中不一致,使用column注解

domain实体类中: 

mapper中:

通用mapper使用方式,创建一个接口继承Mapper接口,泛型是我们所需的实体类。例如:

  

 主要的业务逻辑在service层

 ssm_service层:
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();
    }


}
ssm_web层
controller层:

处理前端控制器发送过来的请求

我的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里面的内容可以来私信我要文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘猫_A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值