• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • mybatis01

    標簽: ssm  mybatis  mysql

    mybatis學習筆記(eclipse)

    概述

    mybatis針對dao層的良好管理框架,傳統的對于JDBC的操作繁瑣冗余,mybatis通過映射配置文件的方式良好的管理JDBC驅動,還支持注解配置

    JDBC驅動

    import java.sql.DriverManager.*;
    import org.junit.*;
    
    class Test{
        @Test
        public void test1(){
            //1.加載驅動程序
            Class.forName("com.mysql.jdbc.Driver");
            //2. 獲得數據庫連接
            Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
            //3.操作數據庫,實現增刪改查
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");
            //如果有數據,rs.next()返回true
            while(rs.next()){
                System.out.println(rs.getString("user_name")+" 年齡:"+rs.getInt("age"));
            }
        }
    }
    

    mybatis的一個簡單構建

    文件配置(Maven管理項目)

    dao

    src/main/java/dao/IUserDao.java

    package org.mybati.dao;
    
    import java.util.List;
    
    //import org.apache.ibatis.annotations.Select;
    import org.mybati.domain.User;
    
    public interface IUserDao {
    	/**
    	 * 	查詢所有
    	 * 
    	 * @return
    	 */
    	List<User> findAll();
    }
    
    
    domain

    src/main/java/domain/User.java

    JavaBean(User) MySql field
    String username username
    String address address
    id id
    xml 的Configurations(必須)

    src/main/resources/SqlConfiguration.xml

    <configuration>
    	<!-- url可以代替resource : file:///c/.../jdbcConfig.properties -->
    	<properties resource="jdbcConfig.properties"></properties>
    
    	<settings>
    		<!-- 開啟動態加載 -->
    		<setting name="lazyLoadingEnabled" value="true" />
    	</settings>
    
    	<!-- 指定 resultType="user" resultType="usEr"均可以 -->
    	<typeAliases>
    		<!-- <typeAlias type="org.mybati.domain.User" alias="user"/> -->
    		<!-- 自動尋找package name 下面的javabean 類,自動起別名 -->
            <package name="org.mybati.domain" />
    	</typeAliases>
    
    	<!--default="MySQL"選中mysql環境-->
    	<environments default="mysql">
    		<environment id="mysql">
    			<!-- 驅動管理 -->
    			<transactionManager type="JDBC"></transactionManager>
    			<!-- UNPOOLED:非連接池 -->
    			<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>
    
    	<mappers>
    		<!-- 映射配置文件,對于IUserDao 接口的代理實現
    		<mapper class="org.mybati.dao.IUserDao"/> 
    		<mapper resource="org/mybati/dao/IUserDao.xml"/> 
    		-->
    		<!-- 自動尋找目錄下的配置文件 -->
    		<package name="org.mybati.dao" />
    	</mappers>
    </configuration>
    
    xml 的mapper 映射配置(非注解配置)

    src/main/resources/dao/IUserDao.xml(此文件路徑為上一步指定)

        <!--
    		mapper:
    		詳細位置在SqlConfiguration.mappers.mapper或者
    		SqlConfiguration.mappers.package.name中已經限定好
    	-->
    <mapper namespace="全限定類名">
    	<!--sql語句-->
        <!--id="接口中的相關的方法名"-->
        <!--resultType="查詢到的數據庫包裝成Bean(User)"-->
        <select id="findAll" resultType="Bean">
        	select * from user
        </select>
    </mapper>
    
    測試類

    src/test/java/test/myBatis.java

    讀取配置文件

    @Before

    InputStream is = Resources.getResourceAsStream(“SqlConfiguration.xml”);

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

    SqlSession session = sqlSessionFactory.openSession(false);

    獲取代理對象

    IUserDao userDao = session.getMapper(IUserDao.class);

    @After

    session.commit();//提交事務

    is.close();

    session.close();

    @Test

    代理對象操作數據庫(實際實際上時Mapper映射實現的)

    List users = userDao.findAll();

    mybatis的crud(mapper)

    大綱


    在這里插入圖片描述

    ?

    在這里插入圖片描述
    在這里插入圖片描述

    插入
    <insert id="function" parameterType="user">
    	insert into user(username,addess) values(#{username},#{address})
    </insert>
    

    function:

    function(paramater),parameter即是要插入的參數

    parameterType:

    與function中的parameter保持一致,此處user ,User, uSer, usEr, useR均無區別,究其原因是

    中指定的別名(同)

    #{username}

    JNDI 語法

    #{username} =>?#{getUsername} =>#{user.getUsername}

    更新
    <update id="updateUser" parameterType="user">
    		update user
    		set
    		username=#{username},address=#{address},sex=#{sex},birthday=#{birthday}
    		where id=#{id}
    </update>
    
    刪除
    <delete id="deleteUser" parameterType="Integer">
    		delete from user where
    		id>#{id}
    </delete>
    

    #{id}

    parameterType=“Integer”

    接受一個Integer

    模糊查找
    <select id="findByName" resultType="user">
    		select * from user where
    		username like #{name};
    </select>
    

    #{name}

    可以接受模糊輸入 :%馬%,查詢username中所有帶馬的信息

    動態SQL語句
    <select id="findInIds" resultType="user" parameterType="query">
    	<include refid="defaultSelect"></include>
    	<where>
    		<if test="ids!=null and ids.size()>0">
    			<foreach collection="ids" open="and id in (" close=")" item="itemId" separator=",">
    				#{itemId}
    			</foreach>
    			</if>
    	</where>
    </select>
    

    多表連接查詢

    table:

    user account

    JavaBean

    User Account

    方法一

    AccountUser extend Account

    <select>之后,封裝到AccountUser 即可:resultType=“accountUser”

    <select id="findAllWithUser" resultType="accountUser">
       	select a.*, u.username,
       	u.address from user u, account a where u.id= a.uid
    </select>
    
    方法二

    內部類(一對一)

    	<resultMap type="accountCounterPart" id="accountUserMap">
    		<!-- 從表屬性 -->
    		<id property="id" column="aid" />
    		<result property="uid" column="uid" />
    		<result property="money" column="money" />
    		<!-- 內部類外鍵屬性 user:要關聯的表,uid:本表的外鍵 -->
    		<!-- 主表 -->
    		<association property="user" column="uid">
    			<id property="id" column="id" />
    			<result property="username" column="username" />
    			<result property="address" column="address" />
    			<result property="sex" column="sex" />
    			<result property="birthday" column="birthday" />
    		</association>
    	</resultMap>
    
    	<select id="findAll" resultMap="accountUserMap">
    		select
    		u.*, a.id as aid, a.uid, a.money
    		from
    		account as a, user as u
    		where
    		a.uid = u.id
    	</select>
    
    

    內部類(一對多)

    	<resultMap type="userCounterPart" id="userAccountMap">
    		<!-- 主鍵 -->
    		<id property="id" column="id" />
    		<result property="username" column="username" />
    		<result property="address" column="address" />
    		<result property="sex" column="sex" />
    		<result property="birthday" column="birthday" />
    		<!-- ofType:accounts 中的類型 -->
    		<collection property="accounts" ofType="account">
    			<id property="id" column="aid" />
    			<result property="uid" column="uid" />
    			<result property="money" column="money" />
    		</collection>
    	</resultMap>
    	<select id="UserToAccount" resultMap="userAccountMap">
    		SELECT
    		u.*, a.id AS
    		aid,a.uid,a.money
    		FROM
    		ACCOUNT a RIGHT OUTER JOIN USER u
    		ON
    		u.id = a.uid
    	</select>
    

    [resultMap是什么?](#### resultMap)

    延遲加載

    [延遲加載配置](# xml 的Configurations(必須))(ctrl + 鼠標左鍵)

    	<resultMap type="userAccount" id="loadingMap">
    		<id property="id" column="id" />
    		<result property="username" column="username" />
    		<result property="address" column="address" />
    		<result property="sex" column="sex" />
    		<result property="birthday" column="birthday" />
    		<!-- 需要延遲加載的屬性user(accounts) -->
    		<!-- 通過什么去加載:user(id) -->
    		<!-- 加載的sql語句 -->
    		<association property="accounts" column="id"
    			select="org.mybati.dao.IUserDao.lazyLoading">
    		</association>
    	</resultMap>
    
    	<select id="lazyLoading" parameterType="INT"
    		resultType="account">
    		select *
    		from account where uid = #{id}
    	</select>
    
    	<select id="findAll" resultMap="loadingMap">
    		select * from user
    	</select>
    

    resultMap

    JavaBean(User) SQLField(User)
    username _username
    address _address
    id _id

    如圖,JavaBean中的變量與SQL中的field不匹配,則從數據庫中查詢到的數據不能夠直接簡單的封裝到User中,這個時候則需要Map映射

    <resultMap>
    	<id property="Bean屬性名" column="Sql字段名">主鍵</id>
        <result property="Bean屬性名" column="Sql字段名">其他</result>
        <result property="username" column="_username">其他</result>
    </resultMap>
    

    緩存

    二級緩存
    二級緩存
    一級緩存
    一級緩存
    SqlFactoryBuilder
    SqlSessionFactory
    SqlSession1
    SqlSession2
    代理對象
    代理對象

    ? [回到頂部](# mybatis學習筆記(eclipse))

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

    智能推薦

    【Mybatis01】實現縮小版銀行轉賬+分頁查詢功能

    一、實現轉賬 1.1 項目實現圖和結構圖 1.1.1 pojo實體類 !分頁查詢表 1.2 全局文件mybatis.xml的編寫 1.3 mapper.xml的編寫(用來進行查詢!!!) 1.3.1分析: (確保轉賬用戶的正確性)因為需要確認轉賬用戶的賬號密碼輸入正確,所以需要根據賬號和密碼進行表查詢并且拿出查出來的對象,以作后續的余額更改操作! (確保入帳用戶的正確性)同上述,查表,取出對象! ...

    MyBatis(01)

    攔截器和過濾器的區別 1.攔截器是SpringMvc框架的組件,而過濾器是java提供的API 2.攔截器只能攔截目標為DispatcherServlet的請求 過濾器范圍廣,過濾目標可以是任何資源 3.功能上攔截器功能更強,和SpringMvc配合更方便 過濾器只和javaEEAPI相關,功能稍弱 小結 如果實現http協議級別的基本攔截過濾,就使用過濾器 如果實現對SpringMvc控制器代碼...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

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