zoukankan      html  css  js  c++  java
  • Spring全家桶一一SpringBoot与Mybatis

    Spring全家桶系列一一SpringBoot与Mybatis结合

    本文授权"Java知音"独家发布。
    Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以简易理解为中介,相对于它,还有个中介是hibernate,不过在mybatis中sql语句的灵活性,可优化性比较强,这也是现在大多数人选择的原因。

    1. mapper.xml、dao接口、实体类自动生成

    下载 https://pan.baidu.com/s/1JY7Xduk5E3KPm58AjnueuQ 工具包

    1.1 修改配置文件generator.xml

    解压之后,这里把文件拷贝到了C: esourcesgenerator文件夹下,以下称为"当前文件目录"
    一次配置,终身受益

    generator.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
    	<!-- 数据库驱动包位置 也就是刚解压的文件的位置加上 mysql-connector-java-5.1.34.jar-->
    	<classPathEntry location="C:
    esourcesgeneratormysql-connector-java-5.1.34.jar" />
        <!--这里也适用Oracle数据库的自动生成-->
    	<!-- <classPathEntry location="C:
    esourcesgeneratorojdbc6.jar" /> -->
    	<context id="DB2Tables" targetRuntime="MyBatis3">
            <commentGenerator>
                <!-- 去除生成日期 -->
                <property name="suppressDate" value="true"/>
                <!-- 去除所有的注解 -->
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
    		<!-- 数据库链接URL、用户名、密码 -->
    		<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ceilan" userId="root" password="123456">
    		<!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="scott" password="tiger">-->
            </jdbcConnection>
            <!--java类型处理器-->
    		<javaTypeResolver>
    			<property name="forceBigDecimals" value="false" />
    		</javaTypeResolver>
    		<!-- 生成模型的包名和位置 -->
    		<javaModelGenerator targetPackage="com.example.entity" targetProject="C:
    esourcesgeneratorsrc">
    			<property name="enableSubPackages" value="true" />
    			<property name="trimStrings" value="true" />
    		</javaModelGenerator>
    		<!-- 生成的映射文件包名和位置 -->
    		<sqlMapGenerator targetPackage="mapping" targetProject="C:
    esourcesgeneratorsrc">
    			<property name="enableSubPackages" value="true" />
    		</sqlMapGenerator>
    		<!-- 生成DAO的包名和位置 -->
    		<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.dao" targetProject="C:
    esourcesgeneratorsrc">
    			<property name="enableSubPackages" value="true" />
    		</javaClientGenerator>
    		<!-- 要生成哪个表,更改tableName(数据库里表名)和domainObjectName(实体名,一般首字母大写)就可以 -->
    		<table tableName="area" domainObjectName="Area" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    	</context>
    </generatorConfiguration>
    

    1.2 用Java运行自动生成

    在当前目录下打开cmd命令,运行如下
    注 : windows系统可直接执行 [ 生成.bat ] 批处理文件

    java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
    

    然后把当前目录src下的com文件夹拷贝到项目文件夹下
    把mapping文件拷贝到resources文件夹下


    目录结构如上

    2.集成Mybatis框架

    2.1 引入依赖

    compile "mysql:mysql-connector-java:5.1.39"
    compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.2.0'
    

    2.2 启动类DemoApplication.java增加扫描配置

    package com.example;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @SpringBootApplication
    // mapper接口 扫描包配置
    @MapperScan(value = "com.example.dao")
    public class DemoApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    }
    

    2.3 添加项目首页index.html

    在resources的templates文件中新建index.html

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>Welcome SpringBoot</h1>
    </body>
    </html>
    

    然后在 DemoApplication 启动类中添加

        //欢迎页面 首页
    	@RequestMapping("/")
        public String index(){
    	    return "index";
        }
    

    之前已经在application.yml中配置了资源映射设置,如下

    spring: 
      mvc:
        view:
          suffix: .html
      resources:
        static-locations: classpath:/templates
    

    所以现在的项目启动访问 http://localhost:8080/ 是可以直接访问到首页的

    3.添加业务层和控制层实现CRUD(增删改查)

    增加业务逻辑层包service以及在其下增加impl包用来实现其接口

    3.1业务逻辑层接口 AreaService.java

    package com.example.service;
    
    import com.example.entity.Area;
    
    /**
     * 这里给dao层的代码拷贝过来先使用
     * created by cfa  2018-11-08 下午 9:56
     **/
    public interface AreaService {
    
        
        int deleteByPrimaryKey(Integer id);
    
        int insert(Area record);
    
        int insertSelective(Area record);
    
        Area selectByPrimaryKey(Integer id);
    
        int updateByPrimaryKeySelective(Area record);
    
        int updateByPrimaryKey(Area record);
    }
    

    3.2业务层实现类 AreaServiceImpl.java

    package com.example.service.impl;
    
    import com.example.dao.AreaMapper;
    import com.example.entity.Area;
    import com.example.service.AreaService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.io.Serializable;
    
    /**
     * 这里的@Service注解相当于自动注册到Spring的Bean
     * 相当于原来的Application.xml里的 <bean id="areaServiceImpl" class="com.example.service.impl.AreaServiceImpl"/>
     * created by cfa  2018-11-08 下午 9:58
     **/
    @Service
    public class AreaServiceImpl implements AreaService, Serializable {
    
        private final AreaMapper areaMapper;
    
        @Autowired
        public AreaServiceImpl(AreaMapper areaMapper) {
            this.areaMapper = areaMapper;
        }
    
        @Override
        public int deleteByPrimaryKey(Integer id) {
            return areaMapper.deleteByPrimaryKey(id);
        }
    
        @Override
        public int insert(Area record) {
            return areaMapper.insert(record);
        }
    
        @Override
        public int insertSelective(Area record) {
            return areaMapper.insertSelective(record);
        }
    
        @Override
        public Area selectByPrimaryKey(Integer id) {
            return areaMapper.selectByPrimaryKey(id);
        }
    
        @Override
        public int updateByPrimaryKeySelective(Area record) {
            return areaMapper.updateByPrimaryKeySelective(record);
        }
    
        @Override
        public int updateByPrimaryKey(Area record) {
            return areaMapper.updateByPrimaryKey(record);
        }
    }
    

    3.3控制层的AreaController.java

    package com.example.controller;
    
    
    import com.example.entity.Area;
    import com.example.service.AreaService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("area")
    public class AreaController {
    
        private final AreaService areaService;
    
        @Autowired
        public AreaController(AreaService areaService) {
            this.areaService = areaService;
        }
    
        @RequestMapping("query")
        public Area areaList(){
            return areaService.selectByPrimaryKey(1);
        }
    
    }
    

    看到这里,想必看到很多次@Autowired,@Service等注解了,这就是Spring的两大核心之一的IOC(Inversion of Control),也就是DI依赖注入;
    Spring的两大核心AOP和IOC大家面试的时候也基本都有问到,到这里你IOC就不用头疼了;

    在Spring之前我们写代码,用到某个类,我们都需要去new一下,现在有个叫Spring,我把控制权交给它,OK,然后在给业务层盖上章(加注解),然后让这个叫Spring的家伙开始工作的时候,交给他去做,控制层需要逻辑A,OK,之前我们已经在控制层用DI注入了A,Spring就会把A的调用给控制层,下面说松紧耦合度,Spring之前,到处写的都是new新建对象,修改一个类很难,现在随意修改,只需要盖个章(DI),让Spring去管就可以了,你现在要问我原理,那些文邹邹的,后续在研究研究,原理相当于文言文,只有研究透了,才能用大家都理解的话写出来。

    业务层提供的接口加实现类就是为了实现松耦合,不然一个类就解决了,就像一个手机,坏了,里面的电池,屏幕,主板什么的拆下来还能用,这就是松耦合。

    4.热部署插件

    问题1:开发人员每次修改了一个java文件就需要重启tomcat,开发效率很低是不?
    答:Jrebel热部署插件解决你的问题https://mp.weixin.qq.com/s/4Gu5xWWnqtXAoXYDLVmXMA
    问题2:你为什么不选择springboot自带的热部署插件
    答: 和之前的朋友问我的一样,问我为啥不把生成代码的插件放在项目中,一个项目还好,你要是写了多个项目,一个一个去部署,麻烦不,所以一次配置,一劳永逸。

    5.关于AOP——Spring的又一大核心

    面向切面编程(AOP是Aspect Oriented Program的首字母缩写)我们知道,面向对象的特点是继承、多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配.实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用.但是人们也发现,在分散代码的同时,也增加了代码的重复性.什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
    也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、 指定位置上的编程思想就是面向切面的编程。
    一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
    这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。
    AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充
    引自:http://xiaobashagua.iteye.com/blog/1963683你问我为啥排这么紧,哈哈,好东西是留给有耐心的人看的,如果你把这篇文章的IOC和AOP仔细看了,你会对这俩的理解又深了一个层次

    5.小叙

    本文代码已上传Github:https://github.com/cuifuan/springboot-demo
    如果你是来学框架怎么写CRUD的,我错了,没让你看到具体的,我在写的是在写代码的时候,对插件工具的使用,和了解这些东西的作用,提高开发效率,并且知道自己用的是什么以及基本原理,而不是仅仅是一个“码农”,谢谢阅览。

  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/cvandy/p/10283440.html
Copyright © 2011-2022 走看看