Mybatis-基本學習(上)


Mybatis

定義:持久層?

干啥的?作用於哪一方面?

基本配置,基本操作?

  • 重點,難點---結果集映射
  • 分頁,
  • 注解開發(重點
  • 一對多,多對多的處理(難點)
  • 動態SQL(重點
  • 緩存(十分重要,極其重要)

mybatis開始

-----環境准備

- JDK 1.8
- mysql 8.0.21
- maven 3.6.1
- mybatis 3.5.3
- IDEA

一.簡介

1.什么是MyBatis

  • MyBatis 是一款優秀的持久層框架
  • MyBatis 避免了幾乎所有的 JDBC 代碼手動設置參數以及獲取結果集的過程
  • MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,
    將接口和 Java 的 實體類 【Plain Old Java Objects,普通的 Java對象】映射成數據庫中的記錄。
  • MyBatis 本是apache的一個開源項目ibatis, 2010年這個項目由apache 遷移到了google code,並且改名為MyBatis 。
  • 2013年11月遷移到Github .

2.持久化

  • 1.持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。

    • 1).即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用
      將內存中的對象存儲在數據庫中,或者存儲在磁盤文件中、XML數據文件中等等。
    • 2).JDBC就是一種持久化機制。文件IO也是一種持久化機制。
    • 3).在生活中 : 將鮮肉冷藏,吃的時候再解凍的方法也是。將水果做成罐頭的方法也是。
  • 2.為什么需要持久化服務呢?那是由於內存本身的缺陷引起的(內存斷電即失

    • 1).內存斷電后數據會丟失,但有一些對象是無論如何都不能丟失的,比如銀行賬號等,遺憾的
      是,人們還無法保證內存永不掉電。
    • 2).內存過於昂貴,與硬盤、光盤等外存相比,內存的價格要高2~3個數量級,而且維持成本也
      高,至少需要一直供電吧。所以即使對象不需要永久保存,也會因為內存的容量限制不能一直
      呆在內存中,需要持久化來緩存到外存

3.持久層

  • 什么是持久層?
    • 1.完成持久化工作的代碼塊 . ----> dao層 【DAO (Data Access Object) 數據訪問對象】
    • 2.大多數情況下特別是企業級應用,數據持久化往往也就意味着將內存中的數據保存到磁盤上加
      以固化,而持久化的實現過程則大多通過各種關系數據庫來完成。
    • 3.不過這里有一個字需要特別強調,也就是所謂的“層”。對於應用系統而言,數據持久功能大多
      是必不可少的組成部分。也就是說,我們的系統中,已經天然的具備了“持久層”概念?也許
      是,但也許實際情況並非如此。之所以要獨立出一個“持久層”的概念,而不是“持久模塊”,“持久
      單元”,也就意味着,我們的系統架構中,應該有一個相對獨立的邏輯層面,專著於數據持久
      化邏輯的實現.
    • 4.與系統其他部分相對而言,這個層面應該具有一個較為清晰和嚴格的邏輯邊界。 【說白了就
      是用來操作數據庫存在的!】

4.為什么需要Mybatis?

  • 幫助程序員將數據存到數據庫中
  • 方便
  • 傳統JDBC代碼台復雜。簡化。框架。自動化
  • 不用Mybatis也可以,更容易上手。技術沒有高低之分
  • 優點-------主要就是用的人多

二.第一個Mybatis程序

思路:搭建環境-->導入mybatis-->編寫代碼-->測試

1.搭建環境

1).數據庫的

        mysql> create database `mybatis`;
        Query OK, 1 row affected (0.00 sec)
        
        mysql> use `mybatis`;
        Database changed
        mysql> create table `user`(
            -> `id` int not null,
            -> `name` varchar(20) DEFAULT null,
            -> `password` varchar(20) DEFAULT null,
            -> primary key(`id`)
            -> )engine = INNODB DEFAULT charset=utf8;
        Query OK, 0 rows affected (0.02 sec)
        mysql> insert into `user`(`id`,`name`,`password`) values(0,'zjz0','123456'),(1,'zjz1','123456'),(2,'zjz2','123456');
        Query OK, 3 rows affected (0.00 sec)

2).maven項目

  • 普通maven項目
  • 刪除src
  • 導入mysql mybatis junit 包
        <dependencies>
            <!-- mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.21</version>
            </dependency>
            <!--  單元測試-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
            <!--mybatis-->
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.3</version>
            </dependency>
    
        </dependencies>
        <!-- ex:此處增加的build詳細在maven====太長不加了-->
       

3).創建一個子類modules

4).編寫mybatis的核心配置文件

  • 配置 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核心配置文件-->
            
            <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>
              <!--每一個mapper.xml都需要在mybatis核心配置文件中注冊-->
                <mappers>
                    <mapper resource="com/zjz/dao/UserMapper.xml"/>
                </mappers>
            </configuration>
    
    
    • 編寫mybatis工具類
      • sqlSessionFactory -- 構建sqlSession
         // sqlSessionFactory -產生-> sqlSession
          public class MybatisUtils {
          private static SqlSessionFactory sqlSessionFactory;
          
              static {
                  try {
                      // 第一步--獲取sqlSessionFactory對象
          
                      String resource = "mybatis-config.xml";
                      InputStream inputStream = Resources.getResourceAsStream(resource);
                      sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }//獲取SqlSession連接
          
               public static SqlSession getSqlSession() {
                  SqlSession sqlSession = sqlSessionFactory.openSession();  // sqlSession 不是線程安全的
                      return sqlSession;
                  
              }
          }
    
         
    

5).編寫代碼

  • UserMapper接口

        public interface UserMapper {
            List<User> getUserList();
        }
    
    
  • 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">
    <!--namespace,綁定一個Dao/Mapper接口-->
    <mapper namespace="com.zjz.dao.UserMapper">
    <!--id要與mapper的方法對應-->
    <!--resultType返回類型-->
        <select id="getUserList" resultType="com.zjz.pojo.User">
            select * from user
        </select>
    </mapper>

6).測試

  • Junit測試

            @Test
            public void test(){
        
                // 第一步,獲得SqlSession對象
                SqlSession sqlSession = MybatisUtils.getSqlSession();
                // 執行sql
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        
                List<User> userList = mapper.getUserList();
        
                System.out.println(userList.toString());
        
                // 關閉SqlSession
                sqlSession.close();
        
            }
    
    

三個核心接口


注意

  • org.apache.ibatis.binding.BindingException:
    Type interface com.zjz.dao.UserMapper is not known to the MapperRegistry.
  • MapperRegistry
  • 問題
    • 1.配置文件沒有注冊(mybatis-config沒配置)
    • UserMapper.xml--2.綁定接口錯誤 3.方法名不對 4.返回類型不對
    • pom.xml 5.Maven導出資源錯誤 MapperRegistry

總:

三,基本CRUD

操作DML一定要提交事務 sqlSession.commit();

1.namespace

  • namespace中的包名要和Mapper接口的包名一致

2.Mapper.xml

  • 語句
    • 1.id:對應的namesapce中的方法名
    • 2.resultType
      • Sql語句執行的返回值(對應對象則為對象類型)-單表返回對應的對象,多表返回
      • 在resultType中:參數1.一個是com.zjz.pojo.bean 2.一個是設置別名,要不就報錯
      • --如果select,必須有,其它可以沒有
    • 3.parameterType 參數類型
    • 4.語句中傳參使用#{XXX} XXX 要對應 parameterType里面的東西

問題 sqlSession 是如何控制全局的,中途關閉它,有什么影響?(或者只讓它有初始值)

  • 查詢時,可以依據參數查找對象---入參parameterType 出參 resultType
  • 插入時,入參parameterType--一般就是對象了 ,出參不寫

代碼

  • 1.接口Mapper

        public interface UserMapper {
             // 查詢全部用戶
            List<Object> getUserList(); // list中可以指定POJO,也可以指定Object(多表)
        
        
            // 根據id查詢
            User getUserById(int id);
            
            // 插入insert
            int addUser(User user);
        
            // 修改用戶
            int updateUser(User user);
        
            // 刪除用戶
            int deleteUser(int id);
        }
    
  • 2.Mapper.xml

        <!--namespace,綁定一個Dao/Mapper接口-->
        <mapper namespace="com.zjz.dao.UserMapper">
            <!--id要與mapper的方法對應-->
        <!--resultType返回類型-->
        <!--resultType返回類型
            select中,如果指定,那么返回指定對象,不指定報錯   多表應該怎么寫??
        -->
        
            <select id="getUserList" resultType="com.zjz.pojo.User" >
                select * from user
            </select>
    
        
            <select id="getUserById" parameterType="int" resultType="com.zjz.pojo.User">
                select * from mybatis.user where id = #{id}
            </select>
        
            <insert id="addUser" parameterType="com.zjz.pojo.User">
                insert into  mybatis.user(id,name,password) values (#{id},#{name},#{password});
            </insert>
        
            <update id="updateUser" parameterType="com.zjz.pojo.User">
                update mybatis.user
                set name = #{name},password = #{password}
                where id = #{id};
            </update>
        
            <delete id="deleteUser" parameterType="int">
                delete from mybatis.user where id = #{id};
            </delete>
        </mapper>
    
    
  • 3.Test

            @Test
            public void TestGetUserById(){
                SqlSession sqlSession = MybatisUtils.getSqlSession();
        
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                User userById = mapper.getUserById(1);
                System.out.println(userById);
        
                sqlSession.close();
            }
        
        
        
        
            @Test
            public void TestAddUser(){
                SqlSession sqlSession = MybatisUtils.getSqlSession();
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        
                 mapper.addUser(new User(5, "zjz05", "123456"));
        
                // 提交事務
                sqlSession.commit();
        
                sqlSession.close();
        
            }
        
            @Test
            public void TestUpdateUser(){
                SqlSession sqlSession = MybatisUtils.getSqlSession();
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        
                mapper.updateUser(new User(4,"zjz04","123456"));
        
                sqlSession.commit();
                sqlSession.close();
        
            }
    

模糊查詢 切記防止sql注入

  • 方式一:安全的

    • XXXMappper.xml
          <!--like '%zjz%'-->
        <select id="getUserLike" resultType="com.zjz.pojo.User" >
            select * from user where name like #{value}
        </select>
    
    • test語句
    • List<User> list = mapper.getUserLike("%zjz%");
  • 方式二:可sql注入

    • XXXMappper.xml
          <!--like '%zjz%'-->
        <select id="getUserLike" resultType="com.zjz.pojo.User" >
            select * from user where name like "%"#{value}"%"
        </select>
    
    • test語句
    • List<User> list = mapper.getUserLike("zjz");

一些錯誤

  • 1.標簽。。各對各的 select……
  • 2.resource綁定mapper,需要使用路徑
  • 3.程序配置文件符合規范
  • 4.NullPointException 沒找到資源
  • 5.輸出的xml文件有亂碼。。。
  • 6.maven資源導出問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM