1. 程式人生 > 實用技巧 >Mysql連線查詢示例語句

Mysql連線查詢示例語句

技術總結:

Mybatis入門

1.what is mybatis?

什麼是 MyBatis?
MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。

why idea掃描不到mapper層的UserMapper.xml檔案,在pom檔案中加入 如下程式碼即可

https://blog.csdn.net/qq_36459536/article/details/104498591


 <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

2.參考官網步驟開始上手

https://mybatis.org/mybatis-3/zh/getting-started.html

入門
安裝
要使用 MyBatis, 只需將 mybatis-x.x.x.jar 檔案置於類路徑(classpath)中即可。

如果使用 Maven 來構建專案,則需將下面的依賴程式碼置於 pom.xml 檔案中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
從 XML 中構建 SqlSessionFactory
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為核心的。SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先配置的 Configuration 例項來構建出 SqlSessionFactory 例項。

從 XML 檔案中構建 SqlSessionFactory 的例項非常簡單,建議使用類路徑下的資原始檔進行配置。 但也可以使用任意的輸入流(InputStream)例項,比如用檔案路徑字串或 file:// URL 構造的輸入流。MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置載入資原始檔更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
XML 配置檔案中包含了對 MyBatis 系統的核心設定,包括獲取資料庫連線例項的資料來源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)。後面會再探討 XML 配置檔案的詳細內容,這裡先給出一個簡單的示例:

<?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>
  <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="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>
當然,還有很多可以在 XML 檔案中配置的選項,上面的示例僅羅列了最關鍵的部分。 注意 XML 頭部的宣告,它用來驗證 XML 文件的正確性。environment 元素體中包含了事務管理和連線池的配置。mappers 元素則包含了一組對映器(mapper),這些對映器的 XML 對映檔案包含了 SQL 程式碼和對映定義資訊。

不使用 XML 構建 SqlSessionFactory
如果你更願意直接從 Java 程式碼而不是 XML 檔案中建立配置,或者想要建立你自己的配置建造器,MyBatis 也提供了完整的配置類,提供了所有與 XML 檔案等價的配置項。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意該例中,configuration 添加了一個對映器類(mapper class)。對映器類是 Java 類,它們包含 SQL 對映註解從而避免依賴 XML 檔案。不過,由於 Java 註解的一些限制以及某些 MyBatis 對映的複雜性,要使用大多數高階對映(比如:巢狀聯合對映),仍然需要使用 XML 配置。有鑑於此,如果存在一個同名 XML 配置檔案,MyBatis 會自動查詢並載入它(在這個例子中,基於類路徑和 BlogMapper.class 的類名,會載入 BlogMapper.xml)。具體細節稍後討論。

從 SqlSessionFactory 中獲取 SqlSession
既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的例項。SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 例項來直接執行已對映的 SQL 語句。例如:

try (SqlSession session = sqlSessionFactory.openSession()) {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
誠然,這種方式能夠正常工作,對使用舊版本 MyBatis 的使用者來說也比較熟悉。但現在有了一種更簡潔的方式——使用和指定語句的引數和返回值相匹配的介面(比如 BlogMapper.class),現在你的程式碼不僅更清晰,更加型別安全,還不用擔心可能出錯的字串字面值以及強制型別轉換。

例如:

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
}
現在我們來探究一下這段程式碼究竟做了些什麼。

探究已對映的 SQL 語句
現在你可能很想知道 SqlSession 和 Mapper 到底具體執行了些什麼操作,但 SQL 語句對映是個相當廣泛的話題,可能會佔去文件的大部分篇幅。 但為了讓你能夠了解個大概,這裡會給出幾個例子。

在上面提到的例子中,一個語句既可以通過 XML 定義,也可以通過註解定義。我們先看看 XML 定義語句的方式,事實上 MyBatis 提供的所有特性都可以利用基於 XML 的對映語言來實現,這使得 MyBatis 在過去的數年間得以流行。如果你用過舊版本的 MyBatis,你應該對這個概念比較熟悉。 但相比於之前的版本,新版本改進了許多 XML 的配置,後面我們會提到這些改進。這裡給出一個基於 XML 對映語句的示例,它應該可以滿足上個示例中 SqlSession 的呼叫。

<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>
為了這個簡單的例子,我們似乎寫了不少配置,但其實並不多。在一個 XML 對映檔案中,可以定義無數個對映語句,這樣一來,XML 頭部和文件型別宣告部分就顯得微不足道了。文件的其它部分很直白,容易理解。 它在名稱空間 “org.mybatis.example.BlogMapper” 中定義了一個名為 “selectBlog” 的對映語句,這樣你就可以用全限定名 “org.mybatis.example.BlogMapper.selectBlog” 來呼叫對映語句了,就像上面例子中那樣:

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
你可能會注意到,這種方式和用全限定名呼叫 Java 物件的方法類似。這樣,該命名就可以直接對映到在名稱空間中同名的對映器類,並將已對映的 select 語句匹配到對應名稱、引數和返回型別的方法。因此你就可以像上面那樣,不費吹灰之力地在對應的對映器介面呼叫方法,就像下面這樣:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
第二種方法有很多優勢,首先它不依賴於字串字面值,會更安全一點;其次,如果你的 IDE 有程式碼補全功能,那麼程式碼補全可以幫你快速選擇到對映好的 SQL 語句。

提示 對名稱空間的一點補充

在之前版本的 MyBatis 中,名稱空間(Namespaces)的作用並不大,是可選的。 但現在,隨著名稱空間越發重要,你必須指定名稱空間。

名稱空間的作用有兩個,一個是利用更長的全限定名來將不同的語句隔離開來,同時也實現了你上面見到的介面繫結。就算你覺得暫時用不到介面繫結,你也應該遵循這裡的規定,以防哪天你改變了主意。 長遠來看,只要將名稱空間置於合適的 Java 包名稱空間之中,你的程式碼會變得更加整潔,也有利於你更方便地使用 MyBatis。

命名解析:為了減少輸入量,MyBatis 對所有具有名稱的配置元素(包括語句,結果對映,快取等)使用瞭如下的命名解析規則。

全限定名(比如 “com.mypackage.MyMapper.selectAllThings)將被直接用於查詢及使用。
短名稱(比如 “selectAllThings”)如果全域性唯一也可以作為一個單獨的引用。 如果不唯一,有兩個或兩個以上的相同名稱(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那麼使用時就會產生“短名稱不唯一”的錯誤,這種情況下就必須使用全限定名。
對於像 BlogMapper 這樣的對映器類來說,還有另一種方法來完成語句對映。 它們對映的語句可以不用 XML 來配置,而可以使用 Java 註解來配置。比如,上面的 XML 示例可以被替換成如下的配置:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}
使用註解來對映簡單語句會使程式碼顯得更加簡潔,但對於稍微複雜一點的語句,Java 註解不僅力不從心,還會讓你本就複雜的 SQL 語句更加混亂不堪。 因此,如果你需要做一些很複雜的操作,最好用 XML 來對映語句。

選擇何種方式來配置對映,以及認為是否應該要統一對映語句定義的形式,完全取決於你和你的團隊。 換句話說,永遠不要拘泥於一種方式,你可以很輕鬆的在基於註解和 XML 的語句對映方式間自由移植和切換。

作用域(Scope)和生命週期
理解我們之前討論過的不同作用域和生命週期類別是至關重要的,因為錯誤的使用會導致非常嚴重的併發問題。

提示 物件生命週期和依賴注入框架

依賴注入框架可以建立執行緒安全的、基於事務的 SqlSession 和對映器,並將它們直接注入到你的 bean 中,因此可以直接忽略它們的生命週期。 如果對如何通過依賴注入框架使用 MyBatis 感興趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 兩個子專案。

SqlSessionFactoryBuilder
這個類可以被例項化、使用和丟棄,一旦建立了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數)。 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 例項,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactory
SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項。 使用 SqlSessionFactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建 SqlSessionFactory 被視為一種程式碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession
每個執行緒都應該有它自己的 SqlSession 例項。SqlSession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 例項的引用放在一個類的靜態域,甚至一個類的例項變數也不行。 也絕不能將 SqlSession 例項的引用放在任何型別的託管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以開啟一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的應用邏輯程式碼
}
在所有程式碼中都遵循這種使用模式,可以保證所有資料庫資源都能被正確地關閉。

對映器例項
對映器是一些繫結對映語句的介面。對映器介面的例項是從 SqlSession 中獲得的。雖然從技術層面上來講,任何對映器例項的最大作用域與請求它們的 SqlSession 相同。但方法作用域才是對映器例項的最合適的作用域。 也就是說,對映器例項應該在呼叫它們的方法中被獲取,使用完畢之後即可丟棄。 對映器例項並不需要被顯式地關閉。儘管在整個請求作用域保留對映器例項不會有什麼問題,但是你很快會發現,在這個作用域上管理太多像 SqlSession 的資源會讓你忙不過來。 因此,最好將對映器放在方法作用域內。就像下面的例子一樣:

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // 你的應用邏輯程式碼
}

Mybatis框架的搭建步驟

Mybatis框架搭建步驟注意事項

Mybatis框架的搭建步驟

1.1 載入包

1.2 寫java package pojo ,dao

1.3 mybatis-config.xml

<?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>
    <!--配置mybatis的環境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--告知mybatis對映檔案的位置-->
    <mappers>
        <mapper class="com.javaboy.dao.IUserDao"/>
    </mappers>
</configuration>

1.4 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.mybatis.dao.UserMapper">
    <select id="findAllUser" resultType="com.mybatis.pojo.User">
        select * from smbms_user;
    </select>
   <select id="findUserById" parameterType="Integer" resultType="com.mybatis.pojo.User">
         select id,userCode,userName from smbms_user where id = #{uid}
   </select>

    <insert id="addUser" parameterType="User" >
      insert into smbms_user (id,userCode,userName)
      values (#{id},#{userCode},#{userName})
    </insert>
</mapper>

1.5 測試

package com.mybatis.test;

import com.mybatis.dao.UserMapper;
import com.mybatis.pojo.User;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMybatis {
    @Test
    public void testFindALLUser(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession=sqlSessionFactory.openSession();
           List<User> userList=(List<User> )sqlSession.getMapper(UserMapper.class).findAllUser();
            for (User user:userList) {
                System.out.println("user:"+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void testFindUserById(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession=sqlSessionFactory.openSession();
           User user=(User)sqlSession.getMapper(UserMapper.class).findUserById(1);

                System.out.println("user:"+user);
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void testAddUser(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession=sqlSessionFactory.openSession();
            User user = new User();
            user.setId(111);
            user.setUserCode("javaboy2019");
            user.setUserName("helloJava");
            int count=(int)sqlSession.getMapper(UserMapper.class).addUser(user);
           sqlSession.commit();
            if(count>0){
                System.out.println("新增成功");
            }else{
                System.out.println("新增失敗");
            }

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}




<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
  </dependency>



<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javaboy</groupId>
    <artifactId>mybatis01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>


</project>

注意事項:-

  • Resources:建包,只能手動一個一個建;
  • dao層的介面名和對映檔案的名字必須一致,且對映檔案只能寫在resources目錄下
  • mapper對映檔案中的namespace只能和介面的類路徑保持一致
  • 在mybatis-config.xml中元素標籤的位置是有順序的,順序不對不能成功執行
  • 記得將mapper對映檔案引入到mybatis.xml檔案中去
  • 做sqlSession增刪改的時候記得sqlSession.commit();
  • 別名不區分大小寫,增刪改對映檔案中是沒有返回值型別的;int型別會預設返回.