Mybatis初级

1 mybatis

持久层:可以立即保存在磁盘上,在这里可以理解为与数据库相关操作。

持久层技术解决方案有几种?

1.JDBC技术–>Connection、PreparedStatement、ResultSet

2.Spring的JdbcTemplate–>Spring中对Jdbc的简单封装

3.Apache(阿帕奇)的DBUtils–>它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

以上这些都不是框架(JDBC是规范、Spring的JdbcTemplate和Apache的DBUtils都只是工具类)

mybatis是一个用Java编写的持久层框架,它使用ORM实现了结果集的封装。

需要拥有两个配置文件,全局配置文件 和 映射文件,在编写这两个映射文件之前,必须创建mybatis环境(引入jar包或者maven工程导入坐标)

ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表。 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等烦杂过程

1 概念

  • 1 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!

  • 2 ORM(Object Relational Mapping 对象关系映射):指的是持久化数据和实体对象的映射模式。

  • 3:mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

  • mybatis通过xml或注解的方式将要执行的各种 statement(声明)配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。

  • 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

2 JDBC缺点

1 之前jdbc操作

2 原始jdbc操作的分析

  • 原始 JDBC 的操作问题分析

    <span style="background-color:#f8f8f8"><span style="color:#0055aa">1. </span><span style="color:#0055aa">频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。</span>
    <span style="color:#0055aa">2. </span><span style="color:#0055aa">sql语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护。</span>
    <span style="color:#0055aa">3. </span><span style="color:#0055aa">查询操作时,需要手动将结果集中的数据封装到实体对象中。</span>
    <span style="color:#0055aa">4. </span><span style="color:#0055aa">增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符。 </span></span>
  • 原始 JDBC 的操作问题解决方案

    <span style="background-color:#f8f8f8"><span style="color:#0055aa">1. </span><span style="color:#0055aa">使用数据库连接池初始化连接资源。 </span>
    <span style="color:#0055aa">2. </span><span style="color:#0055aa">将 sql 语句抽取到配置文件中。 </span>
    <span style="color:#0055aa">3. </span><span style="color:#0055aa">使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射</span>    </span>
  1. 使用数据库连接池初始化连接资源。

  2. 将sql语句抽取到配置文件中。

  3. 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映

反射(反射机制) java的反射指的是类,对象,方法,属性的调用 比如我创建一个对象,能够动态的去获取这个对象下的属性方法(类同理),简单来说,能够 " . "出来,就是反射

映射(映射关系) java的映射是指像在mybatis中指定包名,类名,是一种关系,通过他的全限定类名去对应指定的包或是类,简单来说,就是通过名字去找指定的人,只是一种联系

内省 (Introspector)是Java语言对JavaBean类的属性,事件和方法的默认处理方式 例如: 类User中有属性name,那么必定有getName,setName方法,内省就是通过这两个方法来获取或者设置name属性的值。

插件 mybatisx

lombok

3 mybatis的使用

①添加MyBatis的maven包

②创建user数据表

③编写User实体类

④编写核心文件MyBatis-Config.xml

⑤编写映射文件UserMapper.xml 和 UserMapper接口

⑥编写测试类

1 导入maven依赖
<span style="background-color:#f8f8f8"><span style="color:#333333">​
 <dependencies>
  <!-- 单元测试Junit -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  </dependency>
  <!-- mysql数据库驱动包 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.31</version>
  </dependency>
  <!-- dbcp连接池的依赖包 -->
  <dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
  </dependency>
  <!-- mybatis依赖 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
  </dependency>
​
  <!-- lombok依赖-->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
  </dependency>
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>
</dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build></span></span>

2 新建表

CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(255) DEFAULT NULL, password varchar(255) DEFAULT NULL, age int(11) DEFAULT NULL, phone varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

3 实体类

@Data

注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 等方法,注解后在编译时会自动加进去

@Build

@Build即可加到类上,也可以加到方法上。将其加到类上,相当于包含类所有属性的私有构造方法,且构造方法上加上 @Builder 注解。

User.builder() .age(10) .id(1) .phone("1212121") .build();

@Build加到类上,先实例化内部类对象并返回,然后为调用内部类的方法为内部类的属性赋值,build()方法就是将内部类的属性值传入类构造器中,实例化一个类对象,避免一个类出现过多构造函数。

@Data和@Builder一起使用时,反编译的文件中不会有无参构造方法,故在使用时要加上@AllArgsConstructor、@NoArgsConstructor这两个注解。

@NoArgsConstructor

注解在类上;为类提供一个无参的构造方法

@AllArgsConstructor

注解在类上;为类提供一个全参的构造方法

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Data</span>
<span style="color:#555555">@NoArgsConstructor</span>
<span style="color:#555555">@AllArgsConstructor</span>
<span style="color:#555555">@Builder</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">User</span> {
    <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">id</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">username</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">password</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">phone</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">age</span>;
    <span style="color:#000000">set</span> <span style="color:#000000">get</span> <span style="color:#000000">方法</span>
}</span></span>

4 编写mybatis的配置文件

可以参考官方文档

mybatis – MyBatis 3 | 入门

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 数据库信息 db.properties</span>
​
<span style="color:#0000ff">driver</span>=<span style="color:#009900">com.mysql.jdbc.Driver</span>
<span style="color:#0000ff">url</span>=<span style="color:#009900">jdbc</span>:<span style="color:#009900">mysql</span>:<span style="color:#009900">//localhost</span>:<span style="color:#009900">3306/xinzhi666?useUnicode</span>=<span style="color:#009900">true&characterEncoding</span>=<span style="color:#009900">utf-8</span>
<span style="color:#0000ff">username</span>=<span style="color:#009900">root</span>
<span style="color:#0000ff">password</span>=<span style="color:#009900">root</span>
​
​
<span style="color:#aa5500"># 配置文件  mybaits-config.xml</span>
<span style="color:#0000ff"><?xml version</span>=<span style="color:#009900">"1.0" encoding</span>=<span style="color:#009900">"UTF-8" ?></span>
<span style="color:#0000ff"><!--MyBatis的DTD约束--></span>
<span style="color:#0000ff"><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span>
<span style="color:#0000ff">        "http</span>:<span style="color:#009900">//mybatis.org/dtd/mybatis-3-config.dtd"></span>
​
<span style="color:#0000ff"><!--configuration 核心根标签--></span>
<span style="color:#0000ff"><configuration></span>
​
<span style="color:#0000ff">    <!--引入数据库连接的配置文件--></span>
<span style="color:#0000ff">    <properties resource</span>=<span style="color:#009900">"db.properties"/></span>
​
<span style="color:#0000ff">    <!--配置LOG4J--></span>
<span style="color:#0000ff">    <settings></span>
<span style="color:#0000ff">        <setting name</span>=<span style="color:#009900">"logImpl" value</span>=<span style="color:#009900">"log4j"/></span>
<span style="color:#0000ff">    </settings></span>
​
<span style="color:#0000ff">    <!--起别名--></span>
<span style="color:#0000ff">    <typeAliases></span>
<span style="color:#0000ff">        <typeAlias type</span>=<span style="color:#009900">"com.xinzhi.model.User" alias</span>=<span style="color:#009900">"user"/></span>
<span style="color:#0000ff">        <!--<package name</span>=<span style="color:#009900">"com.xinzhi.model"/>--></span>
<span style="color:#0000ff">    </typeAliases></span>
​
<span style="color:#0000ff">    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--></span>
<span style="color:#0000ff">    <environments default</span>=<span style="color:#009900">"mysql"></span>
<span style="color:#0000ff">        <!--environment配置数据库环境  id属性唯一标识--></span>
<span style="color:#0000ff">        <environment id</span>=<span style="color:#009900">"mysql"></span>
<span style="color:#0000ff">            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务--></span>
<span style="color:#0000ff">            <transactionManager type</span>=<span style="color:#009900">"JDBC"></transactionManager></span>
<span style="color:#0000ff">            <!-- dataSource数据源信息   type属性 连接池--></span>
<span style="color:#0000ff">            <dataSource type</span>=<span style="color:#009900">"POOLED"></span>
<span style="color:#0000ff">                <!-- property获取数据库连接的配置信息 --></span>
<span style="color:#0000ff">                <property name</span>=<span style="color:#009900">"driver" value</span>=<span style="color:#009900">"${driver}" /></span>
<span style="color:#0000ff">                <property name</span>=<span style="color:#009900">"url" value</span>=<span style="color:#009900">"${url}" /></span>
<span style="color:#0000ff">                <property name</span>=<span style="color:#009900">"username" value</span>=<span style="color:#009900">"${username}" /></span>
<span style="color:#0000ff">                <property name</span>=<span style="color:#009900">"password" value</span>=<span style="color:#009900">"${password}" /></span>
<span style="color:#0000ff">            </dataSource></span>
<span style="color:#0000ff">        </environment></span>
<span style="color:#0000ff">    </environments></span>
​
<span style="color:#0000ff">    <!-- mappers引入映射配置文件 --></span>
<span style="color:#0000ff">    <mappers></span>
<span style="color:#0000ff">        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 --></span>
<span style="color:#0000ff">        <mapper resource</span>=<span style="color:#009900">"UserMapper.xml"/></span>
<span style="color:#0000ff">    </mappers></span>
<span style="color:#0000ff"></configuration></span>
​
<span style="color:#aa5500"># 日志文件 log4j.properties  </span>
​
​
<span style="color:#aa5500"># Global logging configuration</span>
<span style="color:#aa5500"># ERROR WARN INFO DEBUG</span>
<span style="color:#0000ff">log4j.rootLogger</span>=<span style="color:#009900">DEBUG, stdout</span>
<span style="color:#aa5500"># Console output...</span>
<span style="color:#0000ff">log4j.appender.stdout</span>=<span style="color:#009900">org.apache.log4j.ConsoleAppender</span>
<span style="color:#0000ff">log4j.appender.stdout.layout</span>=<span style="color:#009900">org.apache.log4j.PatternLayout</span>
<span style="color:#0000ff">log4j.appender.stdout.layout.ConversionPattern</span>=<span style="color:#009900">%5p [%t] - %m%n</span>
​</span></span>

5 编写接口 和 映射文件

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">UserMapper</span> {
​
    <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">selectAll</span>();
​
    <span style="color:#000000">User</span> <span style="color:#000000">selectById</span>(<span style="color:#008855">int</span> <span style="color:#000000">id</span>);
}
​
<span style="color:#aa5500">//映射文件  </span>
<span style="color:#981a1a"><?</span><span style="color:#000000">xml</span> <span style="color:#000000">version</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"1.0"</span> <span style="color:#000000">encoding</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"UTF-8"</span> <span style="color:#981a1a">?></span>
<span style="color:#981a1a"><!--</span><span style="color:#000000">MyBatis的DTD约束</span><span style="color:#981a1a">--></span>
<span style="color:#981a1a"><!</span><span style="color:#000000">DOCTYPE</span> <span style="color:#000000">mapper</span>
        <span style="color:#000000">PUBLIC</span> <span style="color:#aa1111">"-//mybatis.org//DTD Mapper 3.0//EN"</span>
        <span style="color:#aa1111">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span><span style="color:#981a1a">></span>
​
<span style="color:#981a1a"><!--</span>
    <span style="color:#000000">mapper:核心根标签</span>
    <span style="color:#000000">namespace属性:名称空间</span>
<span style="color:#981a1a">--></span>
<span style="color:#981a1a"><</span><span style="color:#000000">mapper</span> <span style="color:#000000">namespace</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"com.xinzhi.mapper.UserMapper"</span><span style="color:#981a1a">></span>
    <span style="color:#981a1a"><!--</span>
        <span style="color:#000000">select:查询功能的标签</span>
        <span style="color:#000000">id属性:唯一标识</span>
        <span style="color:#000000">resultType属性:指定结果映射对象类型</span>
        <span style="color:#000000">parameterType属性:指定参数映射对象类型</span>
    <span style="color:#981a1a">--></span>
    <span style="color:#981a1a"><</span><span style="color:#000000">select</span> <span style="color:#000000">id</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"selectAll"</span> <span style="color:#000000">resultType</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"user"</span><span style="color:#981a1a">></span>
        <span style="color:#000000">SELECT</span> <span style="color:#981a1a">*</span> <span style="color:#000000">FROM</span> <span style="color:#000000">user</span>
    <span style="color:#981a1a"></</span><span style="color:#000000">select</span><span style="color:#981a1a">></span>
    <span style="color:#981a1a"><</span><span style="color:#000000">select</span> <span style="color:#000000">id</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"selectById"</span> <span style="color:#000000">resultType</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"com.xinzhi.model.User"</span> <span style="color:#000000">parameterType</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"int"</span><span style="color:#981a1a">></span>
        <span style="color:#000000">select</span> <span style="color:#981a1a">*</span> <span style="color:#000000">from</span> <span style="color:#000000">user</span> <span style="color:#000000">where</span> <span style="color:#000000">id</span><span style="color:#981a1a">=</span><span style="color:#000000">#</span>{<span style="color:#000000">id</span>}
    <span style="color:#981a1a"></</span><span style="color:#000000">select</span><span style="color:#981a1a">></span>
<span style="color:#981a1a"></</span><span style="color:#000000">mapper</span><span style="color:#981a1a">></span>
​</span></span>

mapper.xml文件

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#555555"><!DOCTYPE mapper</span>
  <span style="color:#555555">PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span>
  <span style="color:#555555">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span>
<span style="color:#117700"><</span><span style="color:#117700">mapper</span> <span style="color:#0000cc">namespace</span>=<span style="color:#aa1111">""</span><span style="color:#117700">></span>
  
<span style="color:#117700"></</span><span style="color:#117700">mapper</span><span style="color:#117700">></span></span></span>

6 编写测试类

<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span>  <span style="color:#008855">void</span> <span style="color:#0000ff">main1</span>( ) <span style="color:#770088">throws</span> <span style="color:#000000">IOException</span> {
        <span style="color:#aa5500">//加载核心配置文件</span>
        <span style="color:#000000">InputStream</span> <span style="color:#000000">is</span> <span style="color:#981a1a">=</span> <span style="color:#000000">Resources</span>.<span style="color:#000000">getResourceAsStream</span>(<span style="color:#aa1111">"mybatis-config.xml"</span>);
        <span style="color:#aa5500">//获得sqlSession工厂对象</span>
        <span style="color:#000000">SqlSessionFactory</span> <span style="color:#000000">sqlSessionFactory</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SqlSessionFactoryBuilder</span>().<span style="color:#000000">build</span>(<span style="color:#000000">is</span>);
        <span style="color:#aa5500">//获得sqlSession对象</span>
        <span style="color:#000000">SqlSession</span> <span style="color:#000000">sqlSession</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSessionFactory</span>.<span style="color:#000000">openSession</span>();
        
       
        <span style="color:#aa5500">//执行sql语句</span>
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">users</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSession</span>.<span style="color:#000000">selectList</span>(<span style="color:#aa1111">"com.xinzhi.mapper.UserMapper.selectAll"</span>);
        <span style="color:#aa5500">//打印结果</span>
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">users</span>);
        <span style="color:#000000">User</span> <span style="color:#000000">user</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSession</span>.<span style="color:#000000">selectOne</span>(<span style="color:#aa1111">"com.xinzhi.mapper.UserMapper.selectById"</span>, <span style="color:#116644">1</span>);
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">user</span>);
        <span style="color:#aa5500">//打印结果</span>
        <span style="color:#000000">sqlSession</span>.<span style="color:#000000">close</span>();
    }</span></span>
  • 注意如果是增删改需要提交事务 sqlSession.commit();

  • 如果sqlSessionFactory.openSession(true),括号中添加了true,那么就是自动提交事务。

7 注意事项

  • environments标签

<span style="background-color:#f8f8f8"><span style="color:#333333"><strong><span style="color:#0000ff"># 事务管理器(transactionManager)</span></strong>
    <span style="color:#aa5500">- JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。</span>
    <span style="color:#aa5500">- MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。</span>
<strong><span style="color:#0000ff"># 数据源(dataSource)</span></strong>
    <span style="color:#aa5500">- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。</span>
    <span style="color:#aa5500">- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。</span>
    <span style="color:#aa5500">- JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。</span>
​</span></span>

4 代理方式开发 规范 **

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。 Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象。 Mapper 接口开发需要遵循以下规范: 1、 Mapper.xml文件中的namespace与mapper接口的全限定名相同 2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同(id名) 3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同(参数) 4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

<span style="background-color:#f8f8f8"><span style="color:#333333">   <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span>  <span style="color:#008855">void</span> <span style="color:#0000ff">main1</span>( ) <span style="color:#770088">throws</span> <span style="color:#000000">IOException</span> {
        <span style="color:#000000">InputStream</span> <span style="color:#000000">is</span> <span style="color:#981a1a">=</span> <span style="color:#000000">Resources</span>.<span style="color:#000000">getResourceAsStream</span>(<span style="color:#aa1111">"mybatis-config.xml"</span>);
        <span style="color:#000000">SqlSessionFactory</span> <span style="color:#000000">sqlSessionFactory</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SqlSessionFactoryBuilder</span>().<span style="color:#000000">build</span>(<span style="color:#000000">is</span>);
        <span style="color:#000000">SqlSession</span> <span style="color:#000000">sqlSession</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSessionFactory</span>.<span style="color:#000000">openSession</span>();
        <span style="color:#aa5500">// 获取到mapper的代理对象,代理对象直接操作数据库</span>
        
        
        <span style="color:#000000">UserMapper</span> <span style="color:#000000">mapper</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSession</span>.<span style="color:#000000">getMapper</span>(<span style="color:#000000">UserMapper</span>.<span style="color:#770088">class</span>);
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">users</span> <span style="color:#981a1a">=</span> <span style="color:#000000">mapper</span>.<span style="color:#000000">selectAll</span>();
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">users</span>);
        <span style="color:#000000">User</span> <span style="color:#000000">user</span> <span style="color:#981a1a">=</span> <span style="color:#000000">mapper</span>.<span style="color:#000000">selectById</span>(<span style="color:#116644">1</span>);
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">user</span>);
        <span style="color:#000000">sqlSession</span>.<span style="color:#000000">close</span>();
    }</span></span>

会话(session)和事务的区别

会话,在应用程序中连接数据库要执行连接,然后会关闭,这算一次会话。

一个session可以启动多个事务,session指一次连接。一个session中可以完成多个事务。

一个事务 是指一个操作单元,要么成功,要么失败,没有中间状态。

事务呢,就好比在打开会话后要执行程序中的某一个或多个对数据库进行的操作。

5 mybatis和spring整合

1开发步骤

  • 1 导入maven依赖

  • 2 创建账户的实体类

  • 3 创建mapper接口和对应的xml文件

  • 4 Service接口类和实现类

  • 5 数据库的配置文件

  • 6 spring配置文件

  • 7 mybatis的配置文件

  • 8 测试功能

1 导入maven依赖
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-beans<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-core<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-context<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-expression<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- 基于AspectJ的aop依赖 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-aspects<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>aopalliance<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>aopalliance<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.0<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- spring 事务管理和JDBC依赖包 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-tx<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-jdbc<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- spring 单元测试组件包 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-test<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.7.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- 单元测试Junit --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.12<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- mysql数据库驱动包 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>mysql<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mysql-connector-java<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>8.0.31<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- dbcp连接池的依赖包 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>commons-dbcp<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>commons-dbcp<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.4<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- mybatis依赖 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.mybatis<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mybatis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>3.5.2<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!-- mybatis和spring的整合依赖 --></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.mybatis<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mybatis-spring<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.3.1<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
​
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.projectlombok<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>lombok<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.18.24<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">build</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.apache.maven.plugins<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>maven-surefire-plugin<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.5<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">configuration</span><span style="color:#117700">></span>
                    <span style="color:#117700"><</span><span style="color:#117700">skipTests</span><span style="color:#117700">></span>true<span style="color:#117700"></</span><span style="color:#117700">skipTests</span><span style="color:#117700">></span>
                <span style="color:#117700"></</span><span style="color:#117700">configuration</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">build</span><span style="color:#117700">></span></span></span>
2 创建账户的实体类 Account
@Data

注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 等方法,注解后在编译时会自动加进去

@Build

@Build即可加到类上,也可以加到方法上。将其加到类上,相当于包含类所有属性的私有构造方法,且构造方法上加上 @Builder 注解。 @Build加到类上,先实例化内部类对象并返回,然后为调用内部类的方法为内部类的属性赋值,build()方法就是将内部类的属性值传入类构造器中,实例化一个类对象,避免一个类出现过多构造函数。

@Data和@Builder一起使用时,反编译的文件中不会有无参构造方法,故在使用时要加上@AllArgsConstructor、@NoArgsConstructor这两个注解。

@NoArgsConstructor

注解在类上;为类提供一个无参的构造方法

@AllArgsConstructor

注解在类上;为类提供一个全参的构造方法

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Data</span>
<span style="color:#555555">@NoArgsConstructor</span>
<span style="color:#555555">@AllArgsConstructor</span>
<span style="color:#555555">@Builder</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">Account</span> {
​
    <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">id</span>;
 
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
​
    <span style="color:#770088">private</span> <span style="color:#008855">double</span> <span style="color:#000000">money</span>;
    
} </span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">CREATE</span> <span style="color:#770088">TABLE</span> <span style="color:#0055aa">`account`</span> <span style="color:#999977">(</span>
  <span style="color:#0055aa">`id`</span> <span style="color:#3300aa">int</span><span style="color:#999977">(</span><span style="color:#116644">11</span><span style="color:#999977">)</span> <span style="color:#770088">NOT</span> <span style="color:#221199">NULL</span> <span style="color:#770088">AUTO_INCREMENT</span>,
  <span style="color:#0055aa">`name`</span> <span style="color:#3300aa">varchar</span><span style="color:#999977">(</span><span style="color:#116644">255</span><span style="color:#999977">)</span> <span style="color:#770088">DEFAULT</span> <span style="color:#221199">NULL</span>,
  <span style="color:#0055aa">`money`</span> <span style="color:#3300aa">decimal</span><span style="color:#999977">(</span><span style="color:#116644">11</span>,<span style="color:#116644">0</span><span style="color:#999977">)</span> <span style="color:#770088">DEFAULT</span> <span style="color:#221199">NULL</span>,
  <span style="color:#770088">PRIMARY</span> <span style="color:#770088">KEY</span> <span style="color:#999977">(</span><span style="color:#0055aa">`id`</span><span style="color:#999977">)</span>
<span style="color:#999977">)</span> <span style="color:#770088">ENGINE</span><span style="color:#981a1a">=</span><span style="color:#770088">InnoDB</span> <span style="color:#770088">AUTO_INCREMENT</span><span style="color:#981a1a">=</span><span style="color:#116644">3</span> <span style="color:#770088">DEFAULT</span> <span style="color:#ff5500">CHARSET</span><span style="color:#981a1a">=</span>utf8;</span></span>

3 创建mapper接口和对应的xml文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">AccountMapper</span> {
​
    <span style="color:#008855">int</span> <span style="color:#000000">update</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"name"</span>) <span style="color:#008855">String</span> <span style="color:#000000">name</span>,<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"money"</span>) <span style="color:#008855">double</span> <span style="color:#000000">money</span>);
  <span style="color:#aa5500">//注解: @Param 与映射文件中的参数相匹配 多个参数时得写 单个参数就无所谓</span>
    <span style="color:#008855">double</span> <span style="color:#000000">queryMoney</span>(<span style="color:#008855">String</span> <span style="color:#000000">name</span>);
}</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#555555"><!DOCTYPE mapper</span>
        <span style="color:#555555">PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span>
        <span style="color:#555555">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span>
​
​
<span style="color:#117700"><</span><span style="color:#117700">mapper</span> <span style="color:#0000cc">namespace</span>=<span style="color:#aa1111">"com.xinzhi.dao.AccountMapper"</span><span style="color:#117700">></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">update</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"update"</span><span style="color:#117700">></span>
        update student set money=#{money} where name=#{name}
    <span style="color:#117700"></</span><span style="color:#117700">update</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"queryMoney"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"java.lang.Double"</span><span style="color:#117700">></span>
        select money from student where name=#{name}
    <span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">mapper</span><span style="color:#117700">></span></span></span>

说明:

  • @param() 当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用

  • 当配置文件中有多个参数的时候,parameterType该怎么写呢? 一般可以使用实体类,也可以使用map。底层还是使用了反射的原理,根据对象的字段去匹配数据库相应的字段

面试题:

mybatis中# 和 $的区别

#与$的区别

默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。

这样做更安全,更迅速,通常也是首选做法

4 Service接口类和实现类
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">IAccountService</span> {
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 转账功能</span>
     <span style="color:#aa5500">* @param from 主动转账的人</span>
     <span style="color:#aa5500">* @param to   收款的人</span>
     <span style="color:#aa5500">* @param money  金额</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#008855">void</span> <span style="color:#000000">transfer</span>(<span style="color:#008855">String</span> <span style="color:#000000">from</span>, <span style="color:#008855">String</span> <span style="color:#000000">to</span>, <span style="color:#008855">double</span> <span style="color:#000000">money</span>);
}
​
​
<span style="color:#555555">@Service</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AccountServiceImpl</span> <span style="color:#770088">implements</span> <span style="color:#000000">IAccountService</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">AccountMapper</span> <span style="color:#000000">accountMapper</span>;
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">transfer</span>(<span style="color:#008855">String</span> <span style="color:#000000">from</span>, <span style="color:#008855">String</span> <span style="color:#000000">to</span>, <span style="color:#008855">double</span> <span style="color:#000000">money</span>) {
        <span style="color:#aa5500">// 先查询from账户的钱</span>
        <span style="color:#008855">double</span> <span style="color:#000000">fromMoney</span> <span style="color:#981a1a">=</span> <span style="color:#000000">accountMapper</span>.<span style="color:#000000">queryMoneyByName</span>(<span style="color:#000000">from</span>);
        <span style="color:#aa5500">// 对from账户进行扣钱操作</span>
        <span style="color:#000000">accountMapper</span>.<span style="color:#000000">updateUser</span>(<span style="color:#000000">from</span>, <span style="color:#000000">fromMoney</span><span style="color:#981a1a">-</span><span style="color:#000000">money</span>);
        <span style="color:#aa5500">//手动制造异常</span>
<span style="color:#aa5500">//        System.out.println(1 / 0);</span>
        <span style="color:#aa5500">// 先查询to账户的钱</span>
        <span style="color:#008855">double</span> <span style="color:#000000">toMoney</span> <span style="color:#981a1a">=</span> <span style="color:#000000">accountMapper</span>.<span style="color:#000000">queryMoneyByName</span>(<span style="color:#000000">to</span>);
        <span style="color:#aa5500">// 对to账户进行加钱操作</span>
        <span style="color:#000000">accountMapper</span>.<span style="color:#000000">updateUser</span>(<span style="color:#000000">to</span>, <span style="color:#000000">toMoney</span><span style="color:#981a1a">+</span><span style="color:#000000">money</span>);
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"支付宝到账:"</span><span style="color:#981a1a">+</span><span style="color:#000000">money</span><span style="color:#981a1a">+</span><span style="color:#aa1111">"元"</span>);
    }
}
​
​
 </span></span>
5 数据库配置 db.properties
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">jdbc.driver</span>=<span style="color:#009900">com.mysql.jdbc.Driver</span>
<span style="color:#0000ff">jdbc.url</span>=<span style="color:#009900">jdbc</span>:<span style="color:#009900">mysql</span>:<span style="color:#009900">//localhost</span>:<span style="color:#009900">3306/xinzhi666?useUnicode</span>=<span style="color:#009900">true&characterEncoding</span>=<span style="color:#009900">utf-8</span>
<span style="color:#0000ff">jdbc.username</span>=<span style="color:#009900">root</span>
<span style="color:#0000ff">jdbc.password</span>=<span style="color:#009900">root</span></span></span>
6 spring配置文件 applicationContext.xml
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span>
    <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span> 
    <span style="color:#0000cc">xmlns:aop</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/aop"</span>
    <span style="color:#0000cc">xmlns:tx</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/tx"</span> 
    <span style="color:#0000cc">xmlns:context</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/context"</span>
    <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans </span>
    <span style="color:#aa1111">http://www.springframework.org/schema/beans/spring-beans-4.3.xsd</span>
    <span style="color:#aa1111">http://www.springframework.org/schema/tx </span>
    <span style="color:#aa1111">http://www.springframework.org/schema/tx/spring-tx-4.3.xsd</span>
    <span style="color:#aa1111">http://www.springframework.org/schema/context </span>
    <span style="color:#aa1111">http://www.springframework.org/schema/context/spring-context-4.3.xsd</span>
    <span style="color:#aa1111">http://www.springframework.org/schema/aop </span>
    <span style="color:#aa1111">http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--引入外部的配置文件--></span>
    <span style="color:#117700"><</span><span style="color:#117700">context:property-placeholder</span> <span style="color:#0000cc">location</span>=<span style="color:#aa1111">"classpath:db.properties"</span><span style="color:#117700">/></span>
    <span style="color:#aa5500"><!--    配置数据源--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"dataSource"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.apache.commons.dbcp.BasicDataSource"</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"driverClassName"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"${jdbc.driver}"</span><span style="color:#117700">/></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"url"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"${jdbc.url}"</span> <span style="color:#117700">/></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"username"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"${jdbc.username}"</span> <span style="color:#117700">/></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"password"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"${jdbc.password}"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--    配置事务管理器--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"transactionManager"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"dataSource"</span> <span style="color:#0000cc">ref</span>=<span style="color:#aa1111">"dataSource"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--开启事务注解--></span>
    <span style="color:#117700"><</span><span style="color:#117700">tx:annotation-driven</span> <span style="color:#0000cc">transaction-manager</span>=<span style="color:#aa1111">"transactionManager"</span> <span style="color:#117700">/></span>
    
    <span style="color:#aa5500"><!--    xml方式配置事务,一般使用上面注解的方式,因为方便和简单,其实事务也是对业务层逻辑的增强--></span>
<span style="color:#aa5500"><!--    <tx:advice transaction-manager="transactionManager" id="txAdvice" >--></span>
<span style="color:#aa5500"><!--        <tx:attributes>--></span>
<span style="color:#aa5500"><!--            <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>--></span>
<span style="color:#aa5500"><!--        </tx:attributes>--></span>
<span style="color:#aa5500"><!--    </tx:advice>--></span>
<span style="color:#aa5500"><!--    --></span>
<span style="color:#aa5500"><!--    <aop:config>--></span>
<span style="color:#aa5500"><!--        <aop:pointcut id="myPointCut" expression="execution(* com.soft.impl.*.*(..))"/>--></span>
<span style="color:#aa5500"><!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointCut"/>--></span>
<span style="color:#aa5500"><!--    </aop:config>--></span>
​
​
    <span style="color:#aa5500"><!--    配置sqlSessionFactory,主要是指定数据源,配置文件的位置</span>
            <span style="color:#aa5500">classpath:指的是resources 这个--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"sqlSessionFactory"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.mybatis.spring.SqlSessionFactoryBean"</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"dataSource"</span> <span style="color:#0000cc">ref</span>=<span style="color:#aa1111">"dataSource"</span><span style="color:#117700">/></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"configLocation"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"classpath:mybatis-config.xml"</span><span style="color:#117700">/></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"mapperLocations"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"classpath:mapper/*.xml"</span><span style="color:#117700">/></span>
​
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--    扫描mapper文件--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"basePackage"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"com.xinzhi.dao"</span><span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
​
​
    <span style="color:#aa5500"><!--    组件扫描,扫描指定包下的注解--></span>
    <span style="color:#117700"><</span><span style="color:#117700">context:component-scan</span> <span style="color:#0000cc">base-package</span>=<span style="color:#aa1111">"com.xinzhi"</span><span style="color:#117700">/></span>
​
<span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>

classpath指 文件夹resources

7 mybatis的配置文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#555555"><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span>
    <span style="color:#555555">"http://mybatis.org/dtd/mybatis-3-config.dtd"></span>
<span style="color:#117700"><</span><span style="color:#117700">configuration</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--    开启二级缓存,默认是关闭的--></span>
    <span style="color:#117700"><</span><span style="color:#117700">settings</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">setting</span> <span style="color:#0000cc">name</span> = <span style="color:#aa1111">"cacheEnabled"</span> <span style="color:#0000cc">value</span> = <span style="color:#aa1111">"true"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">settings</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--    别名--></span>
    <span style="color:#117700"><</span><span style="color:#117700">typeAliases</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">package</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"com.xinzhi.model"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">typeAliases</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--    map.xml文件的位置指定,因为sqlsessionfactory中已经指定过了,所以可以不配置--></span>
    <span style="color:#117700"><</span><span style="color:#117700">mappers</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--        <mapper resource="mapper/AccountMapper.xml"/>--></span>
    <span style="color:#117700"></</span><span style="color:#117700">mappers</span><span style="color:#117700">></span>
​
<span style="color:#117700"></</span><span style="color:#117700">configuration</span><span style="color:#117700">></span></span></span>
8 测试功能
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RunWith</span>(<span style="color:#000000">SpringJUnit4ClassRunner</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@ContextConfiguration</span>(<span style="color:#000000">locations</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">"classpath:applicationContext.xml"</span>})
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AppTest</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">IAccountService</span> <span style="color:#000000">accountService</span>;
​
    <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">testTransfer</span>() <span style="color:#770088">throws</span> <span style="color:#000000">Exception</span> {
        <span style="color:#000000">accountService</span>.<span style="color:#000000">transfer</span>(<span style="color:#aa1111">"husband"</span>, <span style="color:#aa1111">"wife"</span>, <span style="color:#116644">100</span>);
    }
}</span></span>

说明:

  • @RunWith(SpringJUnit4ClassRunner.class) 让测试运行于Spring测试环境

  • @ContextConfiguration(locations = {"classpath:applicationContext.xml"})

2 整合的总结

  • 其实整合的目的就是把mapper对象放入到容器中。(从接口生成对象,底层还是反射)

  • 注意配置文件的加载,测试类中指定了spring的配置文件, spring的配置文件中又指定了mybatis配置文件和mapper映射文件。

3 mybatis缓存

mybatis的缓存主要是针对查询操作的

1 一级缓存

  • 一级缓存默认是开启的, SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。

  • 当调用 SqlSession 的修改,添加,删除,commit(),close()等,方法时,就会清空一级缓存。

2 二级缓存

  • 二级缓存是 mapper 映射级别的缓存, 默认是不开启的,需要手动开启二级缓存

  • 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,也就是序列化

    <span style="background-color:#f8f8f8">    <span style="color:#aa5500"><!-- 开启二级缓存的支持 --></span> 
    <span style="color:#117700"><</span><span style="color:#117700">setting</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"cacheEnabled"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"true"</span><span style="color:#117700">/></</span><span style="color:#117700">settings</span><span style="color:#117700">></span></span>

4 隔离级别

1.读未提交(Read uncommitted):脏读

脏读: 一个事务在执行的过程中读取到了其他事务还没有提交的数据

Tom的账户money=0,公司发工资把5000元打到Tom的账户上,Tom的money=money+5000元,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户money=5000元,非常高兴,可是不幸的是,公司发现发给Tom的工资金额不对,应该是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户money=2000元,Tom空欢喜一场,从此郁郁寡欢,走上了不归路……

2.读已提交(Read committed):

可避免 脏读 的发生。

两次读取的数据不一样,自己事务没有提交的时候可以读取别的已经提交的事务。

Tom拿着工资卡去消费,酒足饭饱后在收银台买单,服务员告诉他本次消费1000元,Tom将银行卡给服务员,服务员将银行卡插入POS机,POS机读到卡里余额为3000元,就在Tom磨磨蹭蹭输入密码时,他老婆以迅雷不及掩耳盗铃之势把Tom工资卡的3000元转到自己账户并提交了事务,当Tom输完密码并点击“确认”按钮后,POS机检查到Tom的工资卡已经没有钱,扣款失败,Tom十分纳闷,明明卡里有钱,于是怀疑POS有鬼,和收银小姐姐大打出手,300回合之后终因伤势过重而与世长辞,Tom老婆痛不欲生,郁郁寡欢,从此走上了不归路…

3.可重复读(Repeatable read):幻读

MySql默认隔离级别。自己事务没有提交的时候,读不到别的已经提交的事务。

Tom的老婆工作在银行部门,她时常通过银行内部系统查看Tom的工资卡消费记录。2019年5月的某一天,她查询到Tom当月工资卡的总消费额为80元,Tom的老婆非常吃惊,心想“老公真是太节俭了,嫁给他真好!”,而Tom此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录并提交了事务,沉浸在幸福中的老婆查询了Tom当月工资卡消费明细一探究竟,可查出的结果竟然发现有一笔1000元的消费,Tom的老婆瞬间怒气冲天,外卖订购了一个大号的榴莲,傍晚降临,Tom生活在了水深火热之中,只感到膝盖针扎的痛…

4.串行化(Serializable ):

可避免 脏读、不可重复读、幻读 的发生。

5 事务

事务有以下特性(ACID): 1、原子性(Atomicity) 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

2、一致性(Consistency) 事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

3、隔离性(Isolation) 多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

4、持久性(Durability) 已被提交的事务对数据库的修改应该永久保存在数据库中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值