SpringBoot

  • 1. SpringBoot集成MyBatis
    • 1.1 添加mybatis依赖,MySQL驱动
    • 1.2 使用MyBatis提供的逆向工程生成实体Bean,映射文件,DAO接口
      • 1.2.1 配置文件GeneratorMapper.xml
      • 1.2.2 插件
      • 1.2.3 成功生成映射文件,DAO接口,实体Bean
      • 1.2.4 总结:
    • 1.3 SpringBoot集成MyBatis测试
    • 1.4 扫描DAO的注解——有两种@Mapper和@MapperScan()
    • 1.5 问题:Java下的xml文件不被编译-----Mapper映射文件存放的位置
    • 2. SpringBoot支持事务-----@Transactional

1. SpringBoot集成MyBatis

1.1 添加mybatis依赖,MySQL驱动

pom

<!--MySQL驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--MyBatis整合SpringBoot框架的起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

1.2 使用MyBatis提供的逆向工程生成实体Bean,映射文件,DAO接口

有数据库直接生成实体Bean,Mapper,DAO接口

1.2.1 配置文件GeneratorMapper.xml

GeneratorMapper.xm
放在项目最外层

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
	<!--指定连接数据库的JDBC驱动包所在位置,指定到你本机的完成路径-->
	<classPathEntry location="C:Usersabc.m2
epositorymysqlmysql-connector-java8.0.28mysql-connector-java-8.0.28.jar"/>
	<!--配置table表信息内容体,targetRuntime指定采用MyBatis3的版本-->
	<context id="tables" targetRuntime="MyBatis3">
		<!--抑制生成注释,由于生成的注释都是英文的,可以不让它生成-->
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/xiaomissm?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"
			userId="root"
			password="123456">
		</jdbcConnection>
		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
			NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- 生成model类,实体Bean
		targetPackage 指定model类的包名
		targetProject:生成model类的位置 -->
		<javaModelGenerator targetPackage="com.guo.springboot.model"
			targetProject="src/main/java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

		<!-- 实体映射文件
		targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="com.guo.springboot.mapper"
			targetProject="src/main/java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>

		<!--生成MyBatis的Mapper接口类文件,    DAO接口
		targetPackage指定Mapper接口类的名
		targetPackage:指定生成的Mapper接口放的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.guo.springboot.mapper"
			targetProject="src/main/java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>


		<!-- 数据库表名及对应的Java模型类名 -->
		<table tableName="admin" domainObjectName="Admin"
			   enableCountByExample="false"
			   enableUpdateByExample="false"
			   enableDeleteByExample="false"
			   enableSelectByExample="false"
			   selectByExampleQueryId="false"/>
<!--		<table schema="" tableName="admin"></table>
		<table schema="" tableName="product_info"></table>
		<table schema="" tableName="product_type"></table>
		<table schema="" tableName="users"></table>-->

	</context>
</generatorConfiguration>

1.2.2 插件

pom
放在< plugins>标签下

<!--mybatis代码自动生成插件-->
           <plugin>
               <groupId>org.mybatis.generator</groupId>
               <artifactId>mybatis-generator-maven-plugin</artifactId>
               <version>1.3.3</version>
               <configuration>
                   <!--配置文件的位置-->
                   <configurationFile>GeneratorMapper.xml</configurationFile>
                   <verbose>true</verbose>
                   <overwrite>true</overwrite>
               </configuration>
           </plugin>

1.2.3 成功生成映射文件,DAO接口,实体Bean

Maven→Plugins→mybatis-generator→mybatis-generator:generate双击

1.生成的实体Bean

2.生成的DAO接口

3.映射文件SQL

AdminMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" "http://mybatis/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.guo.springboot.mapper.AdminMapper">

  <resultMap id="BaseResultMap" type="com.guo.springboot.model.Admin">
    <!--id 标签只能修饰主键字段-->
    <!--result除了主键意外的字段-->
    <!--
      column 数据库中的字段名称
      property 映射对象的属性名称
      jdbcType 列在数据库中字段的类型(可以省略不写)
    -->
    <!--
      resultMap作用:
      1.当数据库中字段名称与实体对象的属性名不一致时,可以进行转换
      2.当前查询的结果没有对应一个表的,可以自定义一个结果集
    -->
        <!--
      如果数据库中字段名由多个单词构成,通过MyBatis逆向工程生成的对象属性名称会
      按照驼峰命名法则生成属性名称
      其中:数据库中字段名称由多个单词通过_下划线分割
    -->
    <id column="a_id" jdbcType="INTEGER" property="aId" />
    <result column="a_name" jdbcType="VARCHAR" property="aName" />
    <result column="a_pass" jdbcType="VARCHAR" property="aPass" />
  </resultMap>
<!--sql语句片段,,将公共的部分抽取出来
    可以通过include标签引用sql语句片段-->
  <sql id="Base_Column_List">
    a_id, a_name, a_pass
  </sql>

  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from admin
    where a_id = #{aId,jdbcType=INTEGER}
  </select>

  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from admin
    where a_id = #{aId,jdbcType=INTEGER}
  </delete>

  <insert id="insert" parameterType="com.guo.springboot.model.Admin">
    insert into admin (a_id, a_name, a_pass)
    values (#{aId,jdbcType=INTEGER}, #{aName,jdbcType=VARCHAR}, #{aPass,jdbcType=VARCHAR})
  </insert>
<!--suffixOverrides 去除多余的逗号-->
  <insert id="insertSelective" parameterType="com.guo.springboot.model.Admin">
    insert into admin
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="aId != null">
        a_id,
      </if>
      <if test="aName != null">
        a_name,
      </if>
      <if test="aPass != null">
        a_pass,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="aId != null">
        #{aId,jdbcType=INTEGER},
      </if>
      <if test="aName != null">
        #{aName,jdbcType=VARCHAR},
      </if>
      <if test="aPass != null">
        #{aPass,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.guo.springboot.model.Admin">
    update admin
    <set>
      <if test="aName != null">
        a_name = #{aName,jdbcType=VARCHAR},
      </if>
      <if test="aPass != null">
        a_pass = #{aPass,jdbcType=VARCHAR},
      </if>
    </set>
    where a_id = #{aId,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.guo.springboot.model.Admin">
    update admin
    set a_name = #{aName,jdbcType=VARCHAR},
      a_pass = #{aPass,jdbcType=VARCHAR}
    where a_id = #{aId,jdbcType=INTEGER}
  </update>
</mapper>

1.2.4 总结:

MyBatis逆向工程只针对于单表操作
单表操作
单表操作
生成6个方法,
增 (全部属性添加,部分属性添加)

改(全部属性修改,部分属性修改)

1.3 SpringBoot集成MyBatis测试

前边已经准备好依赖,映射文件,实体Bean,DAO接口。
下边对增删改查进行开发

Controller控制层
在控制层注入业务层

Service
在业务层注入持久层

能注入的前提是spring容器中要有
对象交给Spring容器创建
@Service
@Mapper

1.4 扫描DAO的注解——有两种@Mapper和@MapperScan()

@Mapper需要在每一个Mapper接口类上添加,作用扫描dao接口
@MapperScan()是在SpringBoot启动入口类上添加的,它是扫描所有包

1.在每个Mapper接口上边添加@Mapper注解
@Mapper //扫描DAO接口到spring容器
2.如果有多个Mapper接口,可以在启动类上添加注解@MapperScan()进行扫描接口
@MapperScan(basePackages = “com.guo.springboot.mapper”)//开启扫描Mapper接口的包以及子目录

核心配置文件

application.properties

#设置连接数据库的四要素
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/xiaomissm?useUnicode=true&characterEncoding=UTF-8&useJDBCComliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

1.5 问题:Java下的xml文件不被编译-----Mapper映射文件存放的位置

IDEA规定所有的配置文件应该在resources文件夹下,java文件应该在java文件下,,,,然而MyBatis中规定Mapper.xm文件和Mapper接口放在一起,,,最后会出现java文件夹下的Mapper.xml文件编译不进去,,,解决办法需要手动指定文件夹为resources。

1.方法一
Mapper接口和Mapper映射文件放在src/main/java同一目录下
需要在pom文件中手动指定资源文件夹路径resources
pom
在< plugins>标签下添加

 <!--手动指定文件夹为resources-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

2.方法二
将Mapper接口和Mapper映射文件分开放
把Mapper映射文件放在resources(类路径)文件夹的mapper目录下
需要在SpringBoot核心配置文件中指定mapper映射文件存放的位置

配置核心配置文件
application.properties

#指定MyBatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml

2. SpringBoot支持事务-----@Transactional

事务是一个完成的功能,也叫做是一个完成的业务
事务只能跟什么SQL语句有关系? 事务只跟DML语句有关系:增删改

  • DML 数据操作语言 : 主要的关键字有:update、delete、insert。DML操作可以手动控制事务的开启、提交和回滚。
  • DQL 数据查询语言 关键字有:select
  • DDL 数据定义语言 主要的关键字有:create、alter、drop、truncate。DDL操作是隐性提交的,不能回滚
  • TCL 事务控制语言 主要的语句关键字有:commit、rollback、savepoint、set transaction。
  • DCL 数据控制语言 主要的关键字有:grant、revoke 。

SpringBoot2.0以后只需要在方法上添加@Transactional
在之前还需要在入口类上添加
@EnableTransactionManagement //开启事务

更多推荐

SpringBoot集成MyBatis