mybatis的基本使用

itYobo發表於2021-02-09

歡迎使用社群 Markdown 編輯器寫文章!

mybatis 是一個半orm的持久層框架,他的優勢是,可以在mapper中書寫原生的sql語句,效果明顯,開發者容易掌控sql的執行,可以通過動態sql的標籤可以完成邏輯的sql的編寫,sql的書寫靈活,sql的管理可讀性高;
mybatis支援註解的方式進行書寫sql只需在mapper介面上貼上註解@Mapper,並在方法上貼上相應的crud註解在註解內部就可以書寫sql;
@Select(“SELECT * FROM t_order_info WHERE order_no=#{orderNo}”)

一. 配置

xml方式 :
特別注意mapper檔案的路徑和mapper介面的路徑要保持一致,在spring或者Springboot也一樣,如果不一樣需要指定mapper的位置,這個可以再配置檔案中進行配置

配置檔案大致如下:

<?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" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--引入db.properties檔案-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--配置資料庫連線池-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" init-method="init" destroy-method="clone">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--配置sqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>

    </bean>
    <!--配置mapper代理物件批量建立-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mapperScannerConfigurer">
        <property name="basePackage" value="cn.wolfcode.ssm.mapper"/>

    </bean>
    <!--配置事務管理類-->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <context:component-scan base-package="cn.wolfcode.ssm"/>
    <!--事務管理 tx 註解解析器-->
    <tx:annotation-driven/>

</beans>

db.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crm
jdbc.username=root
jdbc.password=root

上面是spring專案中整合mybatis的配置,如果是Springboot的化配置如下

#修改埠為80
server.port=80
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///crmtest?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
#配置別名
mybatis.type-aliases-package=cn.wo.kkk.domain

使用springboot最好使用啟動包的方式,而不是原生的依賴

     <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
     </dependency>
     <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
     </dependency>

註解方式:
配置檔案–該配置檔案格式為yml格式

spring:

  datasource:

    url: jdbc:mysql://localhost:3306/wolfcode_goods?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8

    driverClassName: com.mysql.jdbc.Driver

    type: com.alibaba.druid.pool.DruidDataSource

    username: root

    password: root

    filters: stat

    maxActive: 1000

    initialSize: 100

    maxWait: 60000

    minIdle: 500

    timeBetweenEvictionRunsMillis: 60000

    minEvictableIdleTimeMillis: 300000

    testOnBorrow: false

    testOnReturn: false

    testWhileIdle: true

    poolPreparedStatements: true

    maxOpenPreparedStatements: 20

    validationQuery: select 'x'

 mybatis:

  configuration:

    default-fetch-size: 100

    default-statement-timeout: 3000

    map-underscore-to-camel-case: true

註解分為兩種:如果是簡單的sql 使用基本的註解@Select @insert @update @delete
一種是 @SelectProvider 後面多加了Provider ;
下面簡單介紹兩者的不同,直接給大家看看例子

以查詢為例查詢gooid等於我們所傳引數的的商品資料
@Select("SELECT * FROM t_goods where id=#{goodId}")
Good getByGoodId(@Param("goodId") Long goodId);
如果我們需要查詢的條件沒有那麼簡單需要進行動態的拼接那麼上面的方式實現會很麻煩但是下面的方式會簡單很多
  @SelectProvider(type = GoodFind.class, method = "queryBygoodIds")
    List<Good> queryBygoodIds(@Param("ids") ArrayList<Long> ids);

我們可以通過類中的方法將引數拼接好直接拿來使用就可以了,說到這裡大家也看的出來type的值就是類,method就是對應的方法

public class GoodFind {
    public String queryBygoodIds(@Param("ids") ArrayList<Long> ids) {
        //SELECT * FROM t_goods where id in(1,2)
  StringBuilder sql = new StringBuilder("SELECT * FROM t_goods where id in(");
 for (int i = 0; i < ids.size(); i++) {
            if (i != 0) {
                sql.append(",");
  }
            sql.append(ids.get(i));

  }
        sql.append(")");
 return sql.toString();
  }
}

這樣看是不是一眼就明白了,簡單說當的sql需要寫成動態sql那麼使用加Provider的註解方式;

初次分享,還望大家有發現錯誤的地方多多指正謝謝

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章