IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Mybatis在spring、springboot中的整合和原生使用 -> 正文阅读

[Java知识库]Mybatis在spring、springboot中的整合和原生使用

Mybatis

一、官方文档地址

  • Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
  • GitHub : https://github.com/mybatis/mybatis-3

二、原生使用

1、第一个程序

  1. 搭建数据库

    create datebase `mybatis`
    
    use `mybatis`
    
    drop table if exists `user`;
    
    create table `user`(
    `id` int(20) not null
    `name` varchar(30) default null
    `pwd` varchar(30) default null,
    primary key(`id`)
    )engine=InnoDB default charset=utf-8;
    
    insert  into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),
    (2,'张三','abcdef'),
    (3,'李四','987654');
    
  2. 导入jar包

    <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.5.2</version>
    </dependency>
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.47</version>
    </dependency>
    
  3. 编写mybatis核心配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <!--核心配置标签要按一定的顺序,否则会报错
        可以配置多个环境,通过default属性指定哪个环境,dataSourse 为数据库信息
        mapper 注册xxxmapper
    -->
    <configuration>
       <environments default="development">
           <environment id="development">
               <transactionManager type="JDBC"/>
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                   <property name="username" value="root"/>
                   <property name="password" value="123456"/>
               </dataSource>
           </environment>
       </environments>
       <mappers>
           <mapper resource="com/kuang/dao/userMapper.xml"/>
       </mappers>
    </configuration>
    
  4. 编写工具类

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class MybatisUtils{
        private static SqlSessionFactory sqlSessionFactory;
        
        static{
            try{
                string resource ="mybatis-config.xml";
                InputStream inputStream = Resources.getReSourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
    
  5. 创建实体类

    public class User {
       
       private int id;  //id
       private String name;   //姓名
       private String pwd;   //密码
       
       //构造,有参,无参
       //set/get
       //toString() 
    }
    
  6. 编写Mapper接口类

    import com.kuang.pojo.User;
    import java.util.List;
    
    public interface UserMapper{
        List<User> selectUser();
    }
    
  7. 编写userMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.kuang.dao.UserMapper">
     <select id="selectUser" resultType="com.kuang.pojo.User">
      select * from user
     </select>
    </mapper>
    
  8. 编写测试类

    public class Mytest{
        @Test
        public void selectUser() {
           SqlSession session = MybatisUtils.getSession();
           //方法一:
           //List<User> users = session.selectList("com.kuang.mapper.UserMapper.selectUser");
           //方法二:
           UserMapper mapper = session.getMapper(UserMapper.class);
           List<User> users = mapper.selectUser();
    
           for (User user: users){
               System.out.println(user);
          }
           session.close();
      }
    }
    
  9. 运行测试

  10. 注意点

    可能出现问题,原因为mapper.xml在java包下无法解析,导致mapper无法生效(maven静态资源过滤问题)

    • 解决方法一(推荐)
    <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
    </resources>
    
    • 方法二

      将xml文件移到resource目录下,并修改核心配置文件里mapper 的地址位置

2、CRUD 操作

  1. userMapper 接口添加方法

    public interface UserMapper {
       //查询全部用户
       List<User> selectUser();
       //根据id查询用户
       User selectUserById(int id);
       //添加一个用户
       int addUser(User user);
       //根据id删除用户
       int deleteUser(int id);
    }
    
  2. 在UserMapper.xml中添加Select语句

    <select id="selectUserById" resultType="com.kuang.pojo.User">
    select * from user where id = #{id}
    </select>
    
    <insert id="addUser" parameterType="com.kuang.pojo.User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>
    <delete id="deleteUser" parameterType="int">
      delete from user where id = #{id}
    </delete>
    
  3. 测试类中测试

    注意点:其中增删改需要提交事务

    @Test
    public void tsetSelectUserById() {
       SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
       UserMapper mapper = session.getMapper(UserMapper.class);
       User user = mapper.selectUserById(1);
       System.out.println(user);
       session.close();
    }
    
    @Test
    public void testAddUser() {
       SqlSession session = MybatisUtils.getSession();
       UserMapper mapper = session.getMapper(UserMapper.class);
       User user = new User(5,"王五","zxcvbn");
       int i = mapper.addUser(user);
       System.out.println(i);
       session.commit(); //提交事务,重点!不写的话不会提交到数据库
       session.close();
    }
    
    @Test
    public void testDeleteUser() {
       SqlSession session = MybatisUtils.getSession();
       UserMapper mapper = session.getMapper(UserMapper.class);
       int i = mapper.deleteUser(5);
       System.out.println(i);
       session.commit(); //提交事务,重点!不写的话不会提交到数据库
       session.close();
    }
    

**练习:**根据密码和名字查询用户

  • 方法一:在方法里传参数

    1. 在接口方法的参数前加 @Param属性

    2. Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

      //通过密码和名字查询用户
      User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
      
      /*
         <select id="selectUserByNP" resultType="com.kuang.pojo.User">
           select * from user where name = #{username} and pwd = #{pwd}
         </select>
      */
      
  • 方法二:用Map

    1. 用Map传参

      User selectUserByNP2(Map<String,Object> map);
      
    2. 编写sql语句的时候,需要传递参数类型,参数类型为map

      <select id="selectUserByNP2" parameterType="map" resultType="com.kuang.pojo.User">
      select * from user where name = #{username} and pwd = #{pwd}
      </select>
      
    3. 在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!

      Map<String, Object> map = new HashMap<String, Object>();
      map.put("username","小明");
      map.put("pwd","123456");
      User user = mapper.selectUserByNP2(map);
      

      如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可

小结:

  • 所有的增删改操作都需要提交事务!
  • 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
  • 有时候根据业务的需求,可以考虑使用map传递参数!
  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

3、配置文件详解

核心配置文件

  • mybatis-config.xml 系统核心配置文件
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
  • 能配置的内容如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

我们可以阅读 mybatis-config.xml 上面的dtd的头文件!

environments元素

<environments default="development">
 <environment id="development">
   <transactionManager type="JDBC">
     <property name="..." value="..."/>
   </transactionManager>
   <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
   </dataSource>
 </environment>
</environments>
  • 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)

  • 子元素节点:environment

    • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

    • 数据源是必须配置的。

    • 有三种内建的数据源类型

      type="[UNPOOLED|POOLED|JNDI]")
      
    • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

    • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

    • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

    • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…

    • 详情:点击查看官方文档

    • 这两种事务管理器类型都不需要设置任何属性。

    • 具体的一套环境,通过设置id进行区别,id保证唯一!

    • 子元素节点:transactionManager - [ 事务管理器 ]

      <!-- 语法 -->
      <transactionManager type="[ JDBC | MANAGED ]"/>
      
    • 子元素节点:数据源(dataSource)

mappers元素

mappers

  • 映射器 : 定义映射SQL语句文件
  • 既然 MyBatis 的行为其他元素已经配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。

引入资源方式

<!-- 使用相对于类路径的资源引用 -->
<mappers>
 <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
 <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
 <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
 <package name="org.mybatis.builder"/>
</mappers>

Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.UserMapper">
   
</mapper>
  • namespace中文意思:命名空间,作用如下:

    • namespace的命名必须跟某个接口同名
    • 接口中的方法与映射文件中sql语句id应该一一对应
    1. namespace和子元素的id联合保证唯一 , 区别不同的mapper
    2. 绑定DAO接口
    3. namespace命名规则 : 包名+类名

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。

Properties优化

数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。具体的官方文档

我们来优化我们的配置文件

第一步 ; 在资源目录下新建一个db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

第二步 : 将文件导入properties 配置文件

<configuration>
   <!--导入properties文件-->
   <properties resource="db.properties"/>

   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${username}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="mapper/UserMapper.xml"/>
   </mappers>
</configuration>

更多操作,可以查看官方文档!【演示带领学习】

  • 配置文件优先级问题
  • 新特性:使用占位符

typeAliases优化

类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<!--配置别名,注意顺序-->
<typeAliases>
   <typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>

当这样配置时,User可以用在任何使用com.kuang.pojo.User的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases>
   <package name="com.kuang.pojo"/>
</typeAliases>

每一个在包 com.kuang.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

若有注解,则别名为其注解值。见下面的例子:

@Alias("user")
public class User {
  ...
}

去官网查看一下Mybatis默认的一些类型别名!

其他配置浏览

设置

  • 设置(settings)相关 => 查看帮助文档

    • 懒加载
    • 日志实现
    • 缓存开启关闭
  • 一个配置完整的 settings 元素的示例如下:

    <settings>
     <setting name="cacheEnabled" value="true"/>
     <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="multipleResultSetsEnabled" value="true"/>
     <setting name="useColumnLabel" value="true"/>
     <setting name="useGeneratedKeys" value="false"/>
     <setting name="autoMappingBehavior" value="PARTIAL"/>
     <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
     <setting name="defaultExecutorType" value="SIMPLE"/>
     <setting name="defaultStatementTimeout" value="25"/>
     <setting name="defaultFetchSize" value="100"/>
     <setting name="safeRowBoundsEnabled" value="false"/>
     <setting name="mapUnderscoreToCamelCase" value="false"/>
     <setting name="localCacheScope" value="SESSION"/>
     <setting name="jdbcTypeForNull" value="OTHER"/>
     <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    </settings>
    

类型处理器

  • 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
  • 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。【了解即可】

对象工厂

  • MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。
  • 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。
  • 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。【了解即可】

生命周期和作用域

作用域(Scope)和生命周期

理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。

我们可以先画一个流程图,分析一下Mybatis的执行过程!

图片

作用域理解

  • SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。
  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
  • 所以 SqlSession 的最佳的作用域是请求或方法作用域。

图片

4、resultMap和注解开发

解决Javabean的属性名与数据库表的字段不一致问题

public class User {

   private int id;  //id
   private String name;   //姓名
   private String password;   //密码和数据库不一样!
   
   //构造
   //set/get
   //toString()
}

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultType="map">
select id , name , pwd
  from user
  where id = #{id}
</select>

**注意:**利用注解开发就不需要mapper.xml映射文件了 .

1、我们在我们的接口中添加注解

//查询全部用户
@Select("select id,name,pwd password from user")
public List<User> getAllUser();

三、在spring集成Mybatis

1、整合说明解释

官方文档: mybatis-spring

  • Spring整合MyBatis, 主要目的就是把MyBatis核心配置文件中的内容,交给Spring来处理; 再简单点来说, 将MyBatis的SqlSessionFactoryMapper的创建交给Spring处理;

  • 要和Spring 一起使用MyBatis,需要在Spring应用上下文中定义至少两样东西:一个sqlsessionFactory和至少一个数据映射器类。
    在MyBatis-Spring 中,可使用sqlsessionFactoryBean来创建sqlsessionFactory

注意:

  • sqlsessionFactory需要一个Datasource(数据源)。这可以是任意的DataSource,只需要和配置其它Spring 数据库连接―样配置它就可以了。

  • 在基础的MyBatis用法中,是通过SqlSessionFactoryBuilder来创建SqlSessionFactory的。而在 MyBatis-Spring 中,则使用SqlSessionFactoryBean来创建。

  • 在MyBatis 中,你可以使用SqlSessionFactory来创建SqlSession。一旦你获得―个session之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭session。

  • SqlSessionFactory有一个唯一的必要属性:用于JDBC的DataSource。这可以是任意的DataSource对象,它的配置方法和其它Spring 数据库连接是―样的。

  • 一个常用的属性是configLocation,它用来指定MyBatis的XML配置文件路径。它在需要修改MyBatis 的基础配置非常有用。通常,基础配置指的是或元素。

  • 需要注意的是,这个配置文件并不需要是一个完整的MyBatis配置。确切地说,任何环境配置( ),数据源( )和 MyBatis 的事务管理器()都会被忽略。SqlSessionFactoryBean会创建它自有的 MyBatis 环境配置( ) ,并按要求设置自定义环境的值。

  • sqlsessionTemplate是MyBatis-Spring 的核心。作为Sqlsession的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的sqlsession .

  • 模板可以参与到Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用sqlSessionTemplate来替换 MyBatis 默认的Defaultsqlsession实现。在同一应用程序中的不同类之间混杂使用可能会引起数据—致性的问题。

  • 可以使用 sqlsessionFactory作为构造方法的参数来创建SqlSessionTemplate对象。

2、整合方式

注意:(下列步骤中省略mapper.xml的编写,可以参考上面例子中的编写)

1. 方法一

通过SqlSessionFactoryBean创建sqlSessionFactory,再通过它创建sqlSessionTemplate。通过mapper实现类注入sqlSessionTemplate

  1. 创建Spring配置文件applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--DataSource: 使用Spirng的数据源替换Mybatis的配置, 可以使用c3p0,dbcp,druid,或者spring提供的jdbc-->
    <!-- 加载数据库配置信息 -->
    <!--db.properties
    #连接数据库的四个基本要素
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=1111
    #druid连接池其他配置,省略
    -->
    <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
    <!-- 连接池对象 -->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
       init-method="init" destroy-method="close">
     <property name="driverClassName" value="${jdbc.driverClassName}"/>
     <property name="username" value="${jdbc.username}"/>
     <property name="url" value="${jdbc.url}"/>
     <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
     <!-- 1:连接池 -->
     <property name="dataSource" ref="myDataSource"/>
     <!-- 2:绑定MyBatis总配置文件 -->
     <property name="configLocation" value="classpath:mybatis-config.xml"/>
     <!-- 3:配置别名扫描 -->
     <property name="typeAliasesPackage" value="com.sunny.ssm"/>
     <!-- 4:加载mapper文件 -->
     <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
    </bean>
    <!--注册sqlSessionTemplate,关联sqlSessionFactory-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
     <!--只能通过构造器注入sqlSessionFactory,因为没有set方法-->
     <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    <!--注册mapper实现类-->
    <bean id="userMapperImpl" class="com.sunny.ssm.mapper.UserMapperImpl">
     <property name="sqlSession" ref="sqlSession"/>
    </bean>
     
    
  2. 增加Mapper(Dao)接口的实现类;私有化sqlSessionTemplate

    public class UserMapperImpl implements UserMapper{
        
        private SqlSessionTemplate sqlSession;
    
        public void setSqlSession(SqlSessionTemplate sqlSession) {
            this.sqlSession = sqlSession;
        }
    
        public List<User> selectAll() {
            return sqlSession.getMapper(UserMapper.class).selectAll();
        }
    }
    
  3. 测试

    @Test
    public void test2() throws Exception{
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
        for (User user : userMapper2.selectAll()) {
            System.out.println(user);
        }
    }
    

    结果成功输出!现在我们的Mybatis配置文件的状态!发现都可以被Spring整合!

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--日志技术-->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    </configuration>
    
    

    其实我们可以通过Spirng完全将mybatis配置文件去除,这里还是保留一个配置吧!

2. 方法二

让Dao继承Support类 , 直接利用 getSqlSession()获得 , 然后直接注入SqlSessionFactory . 比起方式1 , 不需要管理SqlSessionTemplate , 而且对事务的支持更加友好

官方文档截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYGvw2U7-1628175901098)(C:\Users\superstrong\AppData\Roaming\Typora\typora-user-images\image-20210804150820165.png)]

  1. 修改UserMapperImpl

    public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
        public List<User> selectAll() {
            return getSqlSession().getMapper(UserMapper.class).selectAll();
        }
    }
    
  2. 修改bean的配置

    <bean id="userMapperImpl" class="com.sunny.ssm.mapper.UserMapperImpl2">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    

3. 方法三

前两种的整合实现方式,都创建了Dao接口的实现类,通过实现类来获取mapper对象;
使用整合方式三,我们告诉Spring,让他来帮我们创建mapper的代理对象即可!

  1. 配置MapperFactoryBean,Spring帮我们创建 Mapper的代理对象

    <!-- 创建mapper, 因为之前没有写mapper的实现类,mybatis帮我们创建的代理类
        所以要告诉Spring,帮我们创建mapper的代理对象
    -->
    <!-- 配置MapperFactoryBean,Spring帮我们创建 Mapper的代理对象-->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="mySqlSessionFactory"/>
        <!--给哪个接口创建代理对象-->
        <property name="mapperInterface" value="com.sunny.ssm.mapper.UserMapper"/>
    </bean>
    
    或者采用下面扫描的方式
    <!--扫描接口包路径,生成包下所有接口的代理对象,并且放入spring容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    	<property name="basePackage" value="com.sunny.mapper"/>
    </bean>
    
    

四、Spring + jdbctemplate

1、 jdbcTemplate更新数据库常用方法

  • update (更新数据)
  • batchUpdate (批量更新数据库)
  • queryForObject (查询单行)
  • query (查询多行)
  • queryForObject (单值查询)不同的

2、Spring数据访问过程

Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类

  • 模板(template) :模板管理过程中固定的部分
  • 回调(callback) :回调处理自定义的数据访问代码

3、spring中实现jdbcTemplate对数据库操作(采用c3p0连接池)

  1. 导入jar包

    MySQL的驱动包,spring-jdbc
    <!--Spring 的JDBC模板操作-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>4.2.8.RELEASE</version>
        </dependency>
        <!--mysql驱动包-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.18</version>
        </dependency>
    
    
  2. src下创建配置db.properties

    jdbc.user=root
    jdbc.password=Hudie
    jdbc.jdbcUrl=jdbc:mysql://localhost:3306/jdbctemplate
    jdbc.driverClass=com.mysql.jdbc.Driver
    
    <!--
     initialPoolSize:初始化连接数量
     minPoolSize:最小连接数量
     maxPoolSize:最大连接数量
     acquireIncrement: 当连接池用完之后一次性获取的连接数量
     idleConnectionTestPeriod:根据一定的时间间隔检查连接池的连接数量 单位为秒
     maxIdleTime:最大空闲时间 单位为秒
     maxStatements:最大的maxStatements连接数量
     maxStatementsPerConnection:最大语句缓存
    -->
    jdbc.initPoolSize=5
    jdbc.maxPoolSize=10
    
  3. 配置xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
        <!-- 导入资源文件
            读取db.properties文件中的数据 -->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!-- 配置C3P0数据源 -->
        <bean id="dataSource"
            class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="${jdbc.user}"></property>
            <property name="password" value="${jdbc.password}"></property>
            <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
            <property name="driverClass" value="${jdbc.driverClass}"></property>
    
            <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
            <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
        </bean>
    
        <!-- 配置Spring的jdbcTemplate 
            并注入一个dataSource数据源-->
        <bean id="jdbcTemplate"
            class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>    
        </bean>
    </beans>
    
  4. 测试1中的方法

    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class testJDBC {
        private JdbcTemplate jdbcTemplate;
        private ApplicationContext context = null;
    
        //初始化连接池
        {
            context = new ClassPathXmlApplicationContext("applicationContext.xml");
            jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
        }
        //update
        @Test
    	public void testUpdate() {
            String sql = "update student set name = ? where num = ?";
            jdbcTemplate.update(sql, "pink",0001);
           System.out.println("success");
        }
        //batchupdate 
        @Test
        public void testBatechUpdate() {
            String sql = "insert into student(num,password,name,age,score) value(?,?,?,?,?)";
            List<Object[]> batchArgs = new ArrayList<Object[]>();
            batchArgs.add(new Object[] {"007","123","pojp",23,99});
            batchArgs.add(new Object[] {"008","123","trtp",23,99});
            batchArgs.add(new Object[] {"009","123","QQQp",23,99});
            jdbcTemplate.batchUpdate(sql, batchArgs);
        }
        //查询返回某个值
        String sql = "select count(name) from student";
        Long count = jdbcTemplate.queryForObject(sql, Long.class);
        //query查询多行
        String sql = "select num,name,age from student where id > ?";
        RowMapper<stu> rowMapper = new BeanPropertyRowMapper<stu>(stu.class);
        List<stu> s = jdbcTemplate.query(sql, rowMapper,0);//最后一个参数为id值
        //query查询多行
        String sql = "select num,name,age from student where id = ?";
        RowMapper<stu> rowMapper = new BeanPropertyRowMapper<stu>(stu.class);
        stu s = jdbcTemplate.queryForObject(sql, rowMapper,5);//最后一个参数为id值
    }
    

五、springboot+Mybatis

可以查看下面这篇csdn博客

参考链接

六、总结

原生mybatis:

  • 主要为在工具栏中先通过配置文件获得SqlSessionFactoryBuilder----->SqlSessionFactory------>SqlSession

  • 其中通过mapper.xml交给mybatis创建mapper接口的实现类,并在主配置文件中通过mapper.xml配置注册mapper

  • 通过SqlSession.getmapper获得mapper

spring+mybatis:

  • 将原生的mybatis中的配置文件交给spring处理,SqlSessionFactoryBuilder变成了spring中的SqlSessionFactoryBean,SqlSession在spring中有一个sqlsessionTemplate实现类
  • mapper.xml 变成了一个实现类,通过注册实现类组件和注入(DI) sqlsessionTemplate,从而达到和前者一样的效果

spring jdbctemplate

  • 主要是spring将jdbc的复杂操作编写成了一个template(模板)即class,通过数据源外部属性的注入注册其对象,将对象注入到mapper中,跟mybatis中的Sqlsession一样,就可以实现各个crud方法的调用

springboot +mybatis

  • 其实就是将上述的spring的第三种整合方式(包扫描的方式)中的mybatis配置文件的配置信息移到到application.yml中,springboot会根据application.yml的配置更改自动配置时的信息

  • application.yml

    
    server:
      port: 8081
    
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/zzz?useUnicode=true & characterEncoding=utf-8 &
          useSSL=true & serverTimezone=Asia/Shanghai
        username: root
        password: 123456
    
    mybatis:
      mapper-locations: classpath:/mapper/*.xml
      type-aliases-package: com.example.entity
    
    
  • 在mapper的接口上加上**@mapper或者@MapperScan(“com.atguigu.admin.mapper”)**

小结:

所有说只要掌握了mybatis的实现过程,spring+mybatis的整合就会了,而springboot+mybatis的整合完全就是与spring大致相同,只是基于其的自动配置的特点发生了简单的变化,其底层的原理还是spring

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:29:41  更:2021-08-06 09:30:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 13:32:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码