<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【精選】框架初探篇之——MyBatis的CRUD及配置文件

      MyBatis增刪改查

      在這里插入圖片描述

      MyBatis新增

      在這里插入圖片描述

      新增用戶
      1. 持久層接口添加方法

        void add(User user);
        
        
      2. 映射文件添加標簽

        <insert id="add" parameterType="com.mybatis.pojo.User">
           insert into user(username,sex,address) values(# {username},# {sex},# {address})
        </insert>
        
        
      3. 編寫測試方法

        @Test
        public void testAdd() throws Exception {
          InputStream is= Resources.getResourceAsStream("SqlMapConfig.xml");
          SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
          SqlSessionFactory factory = builder.build(is);
          SqlSession session = factory.openSession();
          UserMapper userMapper = session.getMapper(UserMapper.class);
          User user = new User("程序員", "男", "上海");
          userMapper.add(user);
          // 提交事務(wù)
          session.commit();
          session.close();
          is.close();
        }
        
        

      注意:

      1. 當接口方法的參數(shù)類型為POJO類型時,SQL語句中綁定參數(shù)時使用# {POJO的屬性名}即可。
      2. MyBatis事務(wù)默認手動提交,所以在執(zhí)行完增刪改方法后,需要手動調(diào)用SqlSession對象的事務(wù)提交方法,否則數(shù)據(jù)庫將不發(fā)生改變。

      MyBatis修改

      優(yōu)化測試類

      我們發(fā)現(xiàn)MyBatis的測試方法在操作數(shù)據(jù)庫前都需要獲取代理對象,操作數(shù)據(jù)庫后都需要釋放資源,可以利用Junit的前置后置方法,優(yōu)化測試類代碼。

      InputStream is = null;
      SqlSession session = null;
      UserMapper userMapper = null;
      
      
      @Before
      public void before() throws IOException {
        // (1)讀取核心配置文件
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        // (2)創(chuàng)建SqlSessionFactoryBuilder對象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // (3)SqlSessionFactoryBuilder對象獲取SqlSessionFactory對象
        SqlSessionFactory factory = builder.build(is);
        // (4)SqlSessionFactory對象獲取SqlSession對象
        session = factory.openSession();
        // (5)獲取代理對象
        userMapper = session.getMapper(UserMapper.class);
      }
      
      
      @After
      public void after() throws IOException {
        // 釋放資源
        session.close();
        is.close();
      }
      
      

      這樣Junit就會自動執(zhí)行獲取代理對象和釋放資源的方法。

      修改用戶
      1. 持久層接口添加方法

        void update(User user);
        
        
      2. 映射文件添加標簽

        <update id="update" parameterType="com.mybatis.pojo.User">
           update user
           set username = #{username},
           sex    = #{sex},
           address=#{address}
           where id = #{id}
        </update>
        
        
      3. 編寫測試方法

        @Test
        public void testUpdate(){
          User user = new User(8,"程序員1","女","深圳");
          userMapper.update(user);
          session.commit();
        }
        
        

      MyBatis刪除、根據(jù)Id查詢

      刪除用戶
      1. 持久層接口添加方法

        void delete(int userId);
        
      2. 映射文件添加標簽

        <delete id="delete" parameterType="int">
           delete from user where id = #{id}
        </delete>
        
        

        注:當方法的參數(shù)類型是簡單數(shù)據(jù)類型時,#{}中可以寫任意名稱

        • 簡單數(shù)據(jù)類型:基本數(shù)據(jù)類型、字符串等
      3. 編寫測試方法

        @Test
        public void testDelete(){
          userMapper.delete(8);
          session.commit();
        }
        
        
      根據(jù)ID查詢用戶
      1. 持久層接口添加方法

        User findById(int userId);
        
      2. 映射文件添加標簽

        <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User">
           select * from user where id = #{userId}
        </select>
        
        
      3. 編寫測試方法

        @Test
        public void testFindById(){
          User user = userMapper.findById(1);
          System.out.println(user);
        }
        
        

      MyBatis模糊查詢

      使用#定義參數(shù)
      1. 持久層接口添加方法

        List<User> findByNameLike(String username);
        
      2. 映射文件添加標簽

        <select id="findByNameLike" parameterType="string" resultType="com.mybatis.user.User">
           select * from user where username like #{name}
        </select>
        
      3. 編寫測試方法

        @Test
        public void testFindByNameLike(){
          List<User> users = userMapper.findByNameLike("%王%");
          for (User user:users){
            System.out.println(user);
           }
        }
        
        

      我們看到在映射文件中,parameterType的值為string而沒有寫java.lang.String,這是為什么呢?

      • 參數(shù)/返回值類型為基本數(shù)據(jù)類型/包裝類/String等類型時,我們可以寫全類名,也可以寫別名。
      數(shù)據(jù)類型別名
      byte_byte
      long_long
      short_short
      int_int
      int_integer
      double_double
      float_float
      boolean_boolean
      Stringstring
      Bytebyte
      Longlong
      Shortshort
      Integerint/integer
      Doubledouble
      Floatfloat
      Booleanboolean
      Datedate
      BigDecimaldecimal/bigdecimal
      Objectobject
      Mapmap
      HashMaphashmap
      Listlist
      ArrayListarraylist
      Collectioncollection
      Iteratoriterator
      使用$定義參數(shù)

      模糊查詢?nèi)绻幌朐谡{(diào)用方法時參數(shù)加%,可以使用拼接參數(shù)的方式設(shè)置Sql:

      <select id="findByUsernameLike" parameterType="string" resultType="com.mybatis.pojo.User">
         select * from user where username like '%${value}%'
      </select>
      

      測試方法寫法如下:

      @Test
      public void testFindByNameLike(){
        List<User> users = userMapper.findByUsernameLike("張三");
        users.forEach(System.out::println);
      }
      

      #和$的區(qū)別:

      1. #表示sql模板的占位符,$表示將字符串拼接到sql模板中。
      2. #可以防止sql注入,一般能用#就不用$。
      3. ${}內(nèi)部的參數(shù)名必須寫value。
      使用< bind>定義參數(shù)

      如果使用#還不想在調(diào)用方法的參數(shù)中添加%,可以使用<bind>標簽,<bind>標簽允許我們在 Sql語句以外創(chuàng)建一個變量,并可以將其綁定到當前的Sql語句中。用法如下:

      <select id="findByUsernameLike" parameterType="string" resultType="com.mybatis.pojo.User">
        <bind name="likeName" value="'%'+username+'%'"/>
         select * from user where username like #{likeName}
      </select>
      

      測試方法寫法如下:

      @Test
      public void testFindByNameLike(){
        List<User> users = userMapper.findByUsernameLike("張三");
        users.forEach(System.out::println);
      }
      

      MyBatis分頁查詢

      分頁查詢時,Sql語句使用limit關(guān)鍵字,需要傳入開始索引和每頁條數(shù)兩個參數(shù)。MyBatis的多參數(shù)處理有以下方式:

      順序傳參

      Sql中的參數(shù)使用arg0,arg1…或param1,param2…表示參數(shù)的順序。此方法可讀性較低,在開發(fā)中不建議使用。

      1. 持久層接口方法

        /**
           * 分頁查詢
           * @param startIndex 開始索引
           * @param pageSize 每頁條數(shù)
           * @return
           */
        List<User> findPage(int startIndex,int pageSize);
        
      2. 映射文件

        <select id="findPage" resultType="com.mybatis.mapper.User">
           select * from user limit #{arg0},#{arg1}
        </select>
        
        
        <select id="findPage" resultType="com.mybatis.mapper.User">
           select * from user limit #{param1},#{param2}
        </select>
        
      3. 測試類

        @Test
        public void testFindPage(){
          List<User> users = userMapper.findPage(0,3);
          users.forEach(System.out::println);
        }
        
      @Param傳參

      在接口方法的參數(shù)列表中通過@Param定義參數(shù)名稱,在Sql語句中通過注解中所定義的參數(shù)名稱指定參數(shù)位置。此方式參數(shù)比較直觀的,推薦使用。

      1. 持久層接口方法

        List<User> findPage1(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
        
      2. 映射文件

        <select id="findPage1" resultType="com.mybatis.mapper.User">
          select * from user limit #{startIndex},#{pageSize}
        </select>
        
      3. 測試類

        @Test
        public void testFindPage1(){
          List<User> users = userMapper.findPage1(3,3);
          users.forEach(System.out::println);
        }
        
      POJO傳參

      自定義POJO類,該類的屬性就是要傳遞的參數(shù),在SQL語句中綁定參數(shù)時使用POJO的屬性名作為參數(shù)名即可。此方式推薦使用。

      1. 自定義POJO

        public class PageQuery {
          private int startIndex;
          private int pageSize;
            // 省略getter/setter/構(gòu)造方法
        }
        
        
      2. 持久層接口方法

        List<User> findPage2(PageQuery pageQuery);
        
        
      3. 映射文件

        <select id="findPage2" resultType="com.mybatis.pojo.User" parameterType="com.mybatis.pojo.PageQuery">
           select * from user limit #{startIndex},#{pageSize}
        </select>
        
        
      4. 測試類

        @Test
        public void testFindPage2(){
          PageQuery pageQuery = new PageQuery(3, 3);
          List<User> users = userMapper.findPage2(pageQuery);
          users.forEach(System.out::println);
        }
        
        
      Map傳參

      如果不想自定義POJO,可以使用Map作為傳遞參數(shù)的載體,在SQL語句中綁定參數(shù)時使用Map的Key作為參數(shù)名即可。此方法推薦使用。

      1. 持久層接口方法

        List<User> findPage3(Map<String,Object> params);
        
        
      2. 映射文件

        <select id="findPage3" resultType="com.mybatis.pojo.User" parameterType="map">
           select * from user limit #{startIndex},#{pageSize}
        </select>
        
        
      3. 測試類

        @Test
        public void testFindPage3(){
          Map<String,Object> params = new HashMap();
          params.put("startIndex",0);
          params.put("pageSize",4);
          List<User> users = userMapper.findPage3(params);
          users.forEach(System.out::println);
        }
        
        

      MyBatis聚合查詢、主鍵回填

      查詢用戶總數(shù)
      1. 持久層接口方法

        int findCount();
        
      2. 映射文件

        <select id="findCount" resultType="int">
           select count(id) from user
        </select>
        
      3. 測試類

        @Test
        public void testFindCount(){
          System.out.println(userMapper.findCount());
        }
        
      主鍵回填

      有時我們需要獲取新插入數(shù)據(jù)的主鍵值。如果數(shù)據(jù)庫中主鍵是自增的,這時我們就需要使用MyBatis的主鍵回填功能。

      1. 持久層接口方法

        void add(User user);
        
      2. 映射文件

        <insert id="add" parameterType="com.mybatis.user.User">
          <!-- keyProperty:主鍵屬性名,keyColumn:主鍵列名,resultType:主鍵類型,order:執(zhí)行時機 -->
          <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
             SELECT LAST_INSERT_ID();
          </selectKey>
           insert into user(username,sex,address) values(#{username},#{sex},#{address})
        </insert>
        

        SELECT LAST_INSERT_ID():查詢剛剛插入的記錄的主鍵值,只適用于自增主鍵,且必須和insert語句一起執(zhí)行。

      3. 測試類

        @Test
        public void testAdd(){
          User user = new User("×××", "男", "北京");
          userMapper.add(user);
          session.commit();
          System.out.println(user.getId());
        }
        
        

      MyBatis配置文件

      在這里插入圖片描述

      < properties>標簽

      MyBatis配置文件結(jié)構(gòu):

      -configuration
          -properties(屬性)
              -property
          -settings(全局配置參數(shù))
              -setting
          -plugins(插件)
              -plugin
          -typeAliases(別名)
              -typeAliase
              -package
          -environments(環(huán)境)
              -environment
                  -transactionManager(事務(wù)管理)
                  -dataSource(數(shù)據(jù)源)
          -mappers(映射器)
              -mapper
              -package
      
      properties

      屬性值定義。properties標簽中可以定義屬性值,也可以引入外部配置文件。無論是內(nèi)部定義還是外部引入,都可以使用 ${name} 獲取值。

      例如:我們可以將數(shù)據(jù)源配置寫到外部的db.properties中,再使用properties標簽引入外部配置文件,這樣可以做到動態(tài)配置數(shù)據(jù)源。

      1. 編寫db.properties

        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/mybatis
        jdbc.username=root
        jdbc.password=root
        
        
      2. 在配置文件中引入db.properties

        <properties resource="db.properties"></properties>
        
        <environments default="mysql">
          <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
              <property name="driver" value="${jdbc.driver}"/>
              <property name="url" value="${jdbc.url}"/>
              <property name="username" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
            </dataSource>
          </environment>
        </environments>
        
        

      當然我們也可以將數(shù)據(jù)源數(shù)據(jù)通過<properties>配置到MyBatis配置文件內(nèi),但這樣做沒什么意義。

      <properties>
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis"></property>
        <property name="jdbc.username" value="root"></property>
        <property name="jdbc.password" value="root"></property>
      </properties>
      
      
      <environments default="mysql">
        <environment id="mysql">
          <transactionManager type="JDBC"></transactionManager>
          <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
          </dataSource>
        </environment>
      </environments>
      
      

      < settings>標簽

      <settings>是配置MyBatis運行時的一些行為的,例如緩存、延遲加載、命名規(guī)則等一系列控制性參數(shù)。后期我們會使用該標簽配置緩存和延遲加載等。

      < plugins>標簽

      <plugins>是配置MyBatis插件的。插件可以增強MyBatis功能,比如進行sql增強,打印日志,異常處理等。后期我們會使用該標簽配置分頁插件。

      < typeAliases>標簽

      MyBatis對常用類有默認別名支持,比如java.lang.Stirng的別名為string。除此之外,我們也可以使用<typeAliases>設(shè)置自定義別名。

      為一個類配置別名
      <typeAliases>
          <typeAlias type="全類名" alias="別名"></typeAlias>
      </typeAliases>
      

      此時我們即可在映射文件中使用自定義別名,如:

      1. 配置文件:

        <typeAliases>
            <typeAlias type="com.mybatis.pojo.User" alias="User">     </typeAlias>
        </typeAliases>
        
      2. 映射文件:

        <select id="findAll" resultType="User">
           select * from user
        </select>
        
      為一個所有包下的所有類配置別名
      <typeAliases>
        <package name="包名"></package>
      </typeAliases>
      

      此時該包下的所有類都有了別名,別名省略包名,和類名相同。如:

      1. 配置文件:

        <typeAliases>
          <package name="com.mybatis.pojo"></package>
        </typeAliases>
        
      2. 映射文件:

        <select id="findPage2" resultType="User" parameterType="PageQuery">
           select * from user limit #{startIndex},#{pageSize}
        </select>
        

      < environments>標簽

      <environments>可以為MyBatis配置數(shù)據(jù)環(huán)境。

      事務(wù)管理
      <environments default="mysql">
        <environment id="mysql">
          <!-- JDBC:使用JDBC的提交和回滾 MANAGED:不做事務(wù)處理-->
          <transactionManager type="JDBC"></transactionManager>
        </environment>
      </environments>
      
      連接池
      <environments default="mysql">
        <environment id="mysql">
          <transactionManager type="JDBC"></transactionManager>
          <!-- 連接池設(shè)置 -->
          <dataSource type="POOLED">
            <!-- 數(shù)據(jù)源設(shè)置... -->
          </dataSource>
        </environment>
      </environments>
      

      dataSource的type屬性:

      • POOLED:使用連接池管理連接,使用MyBatis自帶的連接池。
      • UNPOOLED:不使用連接池,直接由JDBC連接。
      • JNDI:由JAVAEE服務(wù)器管理連接,如果使用Tomcat作為服務(wù)器則使用Tomcat自帶的連接池管理。

      < mappers>標簽

      <mappers>用于注冊映射文件或持久層接口,只有注冊的映射文件才能使用,共有四種方式都可以完成注冊:

      1. 使用相對路徑注冊映射文件

        <mappers>
         <mapper resource="com/mybatis/mapper/UserMapper.xml"/>
        </mappers>
        
      2. 使用絕對路徑注冊映射文件

        <mappers>  
          <mapper url="file:///C:\Users\a\IdeaProjects\mybatiscase\mybatisDemo1\src\main\resources\com\mybatis\mapper\UserMapper.xml"/> 
        </mappers>
        
      3. 注冊持久層接口

        <mappers>  
          <mapper class="com.mybatis.mapper.UserMapper"/> 
        </mappers>
        
      4. 注冊一個包下的所有持久層接口

        <mappers>
          <package name="com.mybatis.mapper"/>
        </mappers>
        
      posted @ 2023-11-25 07:25  Gjq-  閱讀(31)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 在线精品视频一区二区三四| 精品久久久bbbb人妻| 亚洲av色夜色精品一区| 欧美在线人视频在线观看| 国产精品天天狠天天看| 国产免费午夜福利蜜芽无码| 国产精品一级久久黄色片| 在线视频精品中文无码| 亚洲性日韩精品一区二区 | 亚洲精品人成网线在线| 原平市| 色综合久久一区二区三区| 疯狂做受XXXX高潮国产| 亚洲中文字幕无码一久久区| 99精品热在线在线观看视| 国产va免费精品观看| 精品亚洲欧美无人区乱码| 商洛市| 亚洲一区二区av高清| 国产午夜精品福利视频| 潮喷无码正在播放| 蜜桃AV抽搐高潮一区二区| 久久热这里只有精品最新| 男女男免费视频网站国产| 国产成人综合色就色综合| 国产suv精品一区二区五| 最新亚洲人成无码网站欣赏网| 四虎永久免费高清视频| 成人免费A级毛片无码网站入口| 女人喷液抽搐高潮视频 | 亚洲熟妇少妇任你躁在线观看无码| 久久99国产精品尤物| 亚洲18禁私人影院| 深夜av在线免费观看| 国产三级精品福利久久| 午夜欧美精品久久久久久久| 999国产精品999久久久久久| 亚洲国产精品日韩专区av| 日本深夜福利在线观看| 蜜臀av久久国产午夜福利软件| 国产一区二区亚洲av|