• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Mybatis學習筆記(一)

    標簽: JAVA學習筆記  數據庫  mybatis  java

    嗷嗷

    環境統一

    • JDK1.8
    • Mysql5.7
    • maven3.6.1

    簡介

    什么是mybatis

    在這里插入圖片描述

    MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
    iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs->數據持久層對象)

    • MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。是Apache
    • MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。
    • MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。

    如何獲取Mybatis


    什么是持久化

    持久化就是將數據從持久狀態到瞬時狀態轉化的過程

    持久層

    完成持久化的代碼

    為什么需要Mybatis

    因為傳統的JDBC代碼很麻煩,我們就有了框架把它簡化一下

    • 簡單易學
    • 解除sql與程序代碼的耦合
    • 提供xml標簽
    • 提供映射標簽
    • 使用的人多

    第一個Mybatis程序

    搭建環境->導入Mybatis->編寫代碼->測試

    搭建環境

    創建maven項目,刪除src文件夾,導入依賴

    mysql、mybatis、junit
    

    創建子模塊

    創建一個模塊(Model),這個 模塊就自動成了mybatis的子模塊就不用再配置了,爽哦!

    在這里插入圖片描述

    配置子模塊

    官方文檔說,MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。

    也就是說,我們需要在resources文件夾下創建名為mybatis-config.xml的文件
    在這里插入圖片描述

    然后根據官方提示(《入門》這一章節),在文件中寫入如下配置文件,使用idea打開數據庫,方便定位database的url。

    在xml語法中,&需要轉義,即&amp;

    <?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="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="12345678"/>
                </dataSource>
            </environment>
        </environments>
      <!--記得最后把Mapper配置文件放進來-->
          <mappers>
            <mapper resource="com/dao/UserMapper.xml"/>
        </mappers>
    </configuration>
    

    編寫工具類

    官方介紹了,從 XML 中構建 SqlSessionFactory,從SqlSessionFactory中獲取SqlSession,這很麻煩,我們就創建工具類,簡化操作

    在這里插入圖片描述

    package utils;
    
    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=null;
        static {
            try {
                //使用Mybatis第一步,獲取SqlSessionFactory對象
                String resource = "mybatis-config.xml";
                InputStream  inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        /*
         * 既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。
         * SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。
         * */
        public static SqlSession getSqSession(){
            return sqlSessionFactory.openSession();
        }
    }
    

    編寫代碼

    代碼目錄

    在這里插入圖片描述

    • 實體類–>pojo文件夾下

      command+n可以打開構造器,Getter、Setter等等

      package pojo;
      
      public class User {
          String account;
          String name;
          String pwd;
          String phone;
          String type;
      
          public User() {
          }
      
          public User(String account, String name, String pwd) {
              this.account = account;
              this.name = name;
              this.pwd = pwd;
          }
      
          public String getAccount() {
              return account;
          }
      
          public void setAccount(String account) {
              this.account = account;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getPwd() {
              return pwd;
          }
      
          public void setPwd(String pwd) {
              this.pwd = pwd;
          }
      
          public String getPhone() {
              return phone;
          }
      
          public void setPhone(String phone) {
              this.phone = phone;
          }
      
          public String getType() {
              return type;
          }
      
          public void setType(String type) {
              this.type = type;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "account='" + account + '\'' +
                      ", name='" + name + '\'' +
                      ", pwd='" + pwd + '\'' +
                      ", phone='" + phone + '\'' +
                      ", type='" + type + '\'' +
                      '}';
          }
      }
      
    • Dao接口–>dao文件夾下

      public interface UserDao {
          List<User> getUserList();
      }
      
    • 接口實現類

      我們需要建立xml配置文件,告訴SqlSession 和 Mapper 具體執行什么操作,配置文件可以寫在任何地方,我就放在dao層了,但是需要在主配置文件添加build ,否則會被過濾,因為默認是放在resources目錄下的

      注意,命名空間為要綁定的Dao(Mapper)接口,其中id為對應的方法名字

      <?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.dao.UserDao">
          <select id="getUserList" resultType="com.pojo.User">
              select * from test.user;
          </select>
      </mapper>
      

    測試

    盡量使用junit進行測試,寫在綠色包里面

    報錯:類型接口在Mapper中心是未知的

    org.apache.ibatis.binding.BindingException: Type interface com.dao.UserDao is not known to the MapperRegistry.

    報錯:xml找不到,在兩個pom.xml配置文件中寫上配置文件地址,因為沒有放在rescourses文件夾下

        <build>
            <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>
        </build>
    

    測試類

    package com.demo.dao;
    
    
    import com.utils.MybatisUtils;
    
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    
    import java.util.List;
    
    public class UserDaoTest {
    
        @Test
        public void test(){
            //獲得sqSession
            SqlSession sqSession = MybatisUtils.getSqSession();
            //執行sqSession
            //方式一:getmapper
            UserDao mapper = sqSession.getMapper(UserDao.class);//獲取對象
            List<com.pojo.User> userList = mapper.getUserList();//執行對象的方法
    
            for (com.pojo.User user : userList) {//userList.for即可得到這一部分代碼
                System.out.println(user.toString());
            }
            sqSession.close();
        }
    }
    

    總結

    在這里插入圖片描述

    數據庫增刪改查

    namesppace

    namespace中的包名要和Mapper的一至

    SELECT

    選擇,查詢語句

    • id對應namespace中的方法名,相當于重寫了方法啊
    • resulttype。sql的返回值
    • parameterType參數的類型

    如果返回一個對象就使用類作為返回類型,這個返回值包含所有的信息,如果是字符串或者數字就指定類型。

    如果通過傳入的id沒找到就會返回null,傳入的id不存在也會返回null

        <select id="getUserById" resultType="String" parameterType="String">
            select pwd from test.user where account=#{id}
        </select>
    

    INSERT

    創建一個新用戶,在調用的時候直接new一個對象

    <insert id="addUser" parameterType="com.demo.pojo.User">
        insert into test.user (account,name,pwd,phone,type ) values (#{account},#{name},#{pwd},#{phone},#{type})
    </insert>
    

    注意:增刪改需要提交事務

    這是java的測試代碼

        @Test
        public void addUserTest(){
            //獲得sqSession
            SqlSession sqSession = MybatisUtils.getSqSession();
            UserMapper mapper = sqSession.getMapper(UserMapper.class);//獲取對象
            int res = mapper.addUser(new User("2011","hahaha","1111","10086","adm"));
            if(res>0){
                System.out.println("完成");
            }
            // 提交事務
            sqSession.commit();
            sqSession.close();
        }
    

    DELETE

        <delete id="removeUserById" parameterType="String">
            delete from test.user where account=#{id}
        </delete>
    
        //刪除用戶
        @Test
        public void removeUserByIdTest(){
            //獲得sqSession
            SqlSession sqSession = MybatisUtils.getSqSession();
            UserMapper mapper = sqSession.getMapper(UserMapper.class);//獲取對象
            int res = mapper.removeUserById("2011");
            if(res>0){
                System.out.println("刪除完成");
            }
            // 提交事務
            sqSession.commit();
            sqSession.close();
        }
    

    修改用戶

        //修改密碼
        @Test
        public void changePwdTest(){
            //獲得sqSession
            SqlSession sqSession = MybatisUtils.getSqSession();
            //執行sqSession
            //方式一:getmapper
            UserMapper mapper = sqSession.getMapper(UserMapper.class);//獲取對象
            int res = mapper.changePwdByIdd(new User("2011","woaini"));//執行對象的方法
            if (res>0){
                System.out.println("密碼已修改");
            }
            sqSession.commit();
            sqSession.close();
        }
    

    使用萬能的Map

    接口

    int addUser2(Map<String,String> map);
    

    xml

        <!--    使用map的時候,添加 value需要和傳入的map配套哦,我們上面取的都是類的屬性-->
        <insert id="addUser2" parameterType="Map">
            insert into test.user (account,pwd) values (#{user_account},#{user_pwd});
        </insert>
    

    測試代碼

        //使用map添加
        @Test
        public void addUser2(){
            SqlSession sqSession = MybatisUtils.getSqSession();
            UserMapper mapper = sqSession.getMapper(UserMapper.class);
    
            HashMap<String,String> map = new HashMap<String, String>();
            map.put("user_account","1111");
            map.put("user_pwd","1111");
    
            mapper.addUser2(map);
    
            sqSession.commit();
            sqSession.close();
        }
    

    配置解析

    屬性優化

    我們的屬性:driver、password等等都可以寫在properties中,嗯,這估計也是貴才哥考察的一個重點了。

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

    導入proprieties,要放在第一個位置

    <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>
    

    別名優化

    設置一個短的名字,有兩種方式:

    • 直接在mybatis配置文件里寫,不過要放在第三個位置,沒有第二個的話就放在properties下面就好

      <typeAliases>
          <typeAlias type="com.demo.pojo.User" alias="User"/>
      </typeAliases>
      
    • 讀取寫好的包,在使用的時候就直接使用實體類名

      <typeAliases>
          <typeAlias package="com.demo.pojo"/>
      </typeAliases>
      

    在實體類少的時候,就使用第一種,很多的話就使用第二種。

    不過第一種可以DIY,如果我們也想使用第二種方法DIY的話,可以給類加一個注解,這個注解就是DIY后的名字

    @Alias("hello")
    public class User{
      //code
    }
    /*這樣我們就找不到hello了,只能使用hello*/
    

    Mapper

    方式一:綁定xml文件

    • 沒有限制

    方式二:綁定class

    • 配置文件要和class在同一個包下
    • 配置文件要和class名字相同

    方式三:綁定package

    • 需要配置文件和包同名

    一個半成品

    點擊下載

    注:第二部分隨緣更新啦。。。我先把考核搞定再說嘿嘿

    版權聲明:本文為m0_46521785原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/m0_46521785/article/details/109449250

    智能推薦

    Mybatis學習筆記(一)

    1、環境描述 java版本:1.8 開發工具:idea 2018版 mysql:8.x版本 mybatis:3.4.6版本 lombok mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。 本文將圍繞它來介紹Mybatis的入門案例。 2、項目結構 2.1 配置文件 在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾...

    MyBatis學習筆記(一)

    一、MyBatis介紹   MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記...

    Mybatis學習筆記一

    Mybatis學習筆記一 概述 Mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和 statement 中sql 的動態參數進行映射生...

    MyBatis學習筆記(一)

    1 、對原生態jdbc程序中問題總結 jdbc編程步驟:  1、 加載數據庫驅動  2、 創建并獲取數據庫鏈接  3、 創建jdbc statement對象  4、 設置sql語句  5、 設置sql語句中的參數(使用preparedStatement)  6、 通過statement執行sql并獲取結果  7、 對sql執行結...

    Mybatis學習筆記(一)

    嗷嗷 環境統一 JDK1.8 Mysql5.7 maven3.6.1 簡介 什么是mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。 iBATIS一詞來源于“internet”和...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡