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

    標簽: mybatis學習  mybatis配置文件  查詢查不出全部的信息

    MyBatis概念

    mybatis是一個ORM框架,是一個基于Java的持久層框架。
    mybatis會對jdbc的操作過程進行封裝,使得開發者只需要關注SQL本身,而無需去花費精力去處理 注冊驅動、獲取鏈接、設置參數、結果集解析、 釋放資源等工作,可以簡化jdbc開發成本。

    簡單來講,MyBatis是一個用于操作數據庫的開源框架,(作用和傳統的JDBC類似),它底層就是一個JDBC封裝的組件。
    mybatis就是對jdbc的操作過程進行封裝,使得開發者只需要關注SQL。

    MyBatis相關的概念

    ORM:Object Relational Mapping

    ORM是通過使用描述對象和數據庫之間的映射關系的元數據,將程序中的對象持久化到關系型數據庫中。是一種思想。
    hibernate、mybatis都是對象關系映射的框架。

    JPA:Java Persistence API

    是Java持久化接口的意思,它是JavaEE關于ORM思想的一套標準接口,僅僅是一套接口,不是具體的實現。

    mybatis架構

    mybatis架構
    ps:MyBatis雖然實現了JPA但是它并不是一個完完全全的ORM組件,而是一個基于SQL開發的半ORM組件。
    而Hibernate是一個完完全全的ORM組件,它是完全基于對象來操作數據庫中的記錄。
    所以mybatis比hibernate更為簡單。

    MyBatis環境搭建

    1.新建java項目,導入jar包mybatis-3.2.7.jar和 junit等等
    好多包
    2.在這里我配置了一個日志文件,打印日志(資源文件)
    日志文件內容
    3.配置mybatis全局配置文件
    這是一個殼,不要改(也許可能會改)

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

    這是內容

    <!-- 運行環境: 與spring整合后就不需要了
    default: 運行哪個環境,里面是id-->
    <environments default="mysql">
    <environment id="mysql">
    <!-- 事務管理 -->
    <transactionManager type="JDBC"></transactionManager>
    <!-- 數據源 -->
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?
    characterEncoding=utf-8"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    </dataSource>
    </environment>
    </environments>
    <!-- 加載映射文件 -->
    <mappers>
    <mapper resource="UserMapper.xml"/>
    </mappers>
    

    以上是最簡單的版本,后面會介紹更多的功能。

    開始寫功能例子

    1.先寫一個pojo類,也就是實體類(這個隨便給你們個例子)
    屬性
    這是屬性,需要生成get、set方法,有參、無參構造,再重寫一下toString方法

    2.寫一個mapper.xml文件,這是一個映射文件,寫sql語句的,需要在全局配置文件中配置(就是在mybatis.xml文件中配置<mapper></mappper>,配置上面有)

    <?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的作用:分割sql -->
    <mapper	namespace="UserMapper">
    </mapper>
    

    這是一個殼,namespace的作用就是如果有多個mapper,就用他來分辨。
    而下面這個就是里面的內容

    <!-- 入門程序:根據id查詢用戶信息 
    		id:唯一的(本namespace下唯一),用于標識映射文件的sql,稱為statement的id
    		parameterType:輸入參數類型;支持的類型包括java基本類型、pojo對象、hashmap
    		resultType:輸出結果類型;指定的為單條記錄的類型,(也就是說如果返回多條記錄,是單條記錄的類型)
    		#{}:占位符  	特點(注意):如果輸入參數類型是基本類型的,則#{}里面可以是任意參數。或者是#{value}最規范,如果是pojo類型,那么必須和里面的變量名一致
    		
    	-->
    	<select id="selectById" parameterType="int" resultType="com.cbb.pojo.User">
    		select * from user where id = #{id}
    	</select>
    	
    	<!-- 模糊查詢
    		${}使用的是sql拼接,沒有進行sql注入的處理。應該少使用
    		如果輸入參數是基本類型的,則${}里面只能是${value},
    	 -->
    	<select id="selectByName" parameterType="String" resultType="com.cbb.pojo.User" >
    		<!-- select * from user where userName like '%${value}%' -->
    		select * from user where userName like CONCAT("%",#{username},"%")
    	</select>
    	
    	<!-- 如果添加的方法有錯誤,以前的也不會執行 -->
    	<!-- 新增用戶 -->
    	<insert id="addUser" parameterType ="com.cbb.pojo.User"  useGeneratedKeys="true" keyProperty="id">
    		insert into user(username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
    	</insert>
    	
    	<!-- 修改  userName 必須和類里面的相同,因為是映射類里面的 -->
    	<update id="updateUser" parameterType="com.cbb.pojo.User">
    		update user set userName = #{userName}, sex = #{sex} where id = #{id}
    	</update>
    	
    	<!-- 刪除 -->
    	<delete id="deleteUser" parameterType="int">
    		delete from user where id = #{id}
    	</delete>
    

    增刪改查用不一樣的標簽,連模糊查詢都有了(主要是為了防止sql注入做的特別演示,也就是用concat,而注釋掉的有可能被注入)。里面的注釋著重記一下。

    3.寫一個測試用例,寫一個class就行。
    然后這就是main方法,里面是全部流程

    public static void main(String[] args) {	
    		try {
    			//1.加載mybatis的運行環境   io流的方式讀取全局配置文件
    			InputStream is = Resources.getResourceAsStream("mybatis.xml");
    			
    			//2.創建會話工廠
    			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    			
    			//3.獲取會話
    			SqlSession sqlSession = sqlSessionFactory.openSession();
    			
    			//4.通過會話操作數據庫
    			//第一個參數:statement的id 具體執行的sql   寫法是:namespace.id
    			//第二個參數:值
    			User user = sqlSession.selectOne("UserMapper.selectById", 1);
    			System.out.println("user:"+user);
    			sqlSession.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}		
    	}
    

    **動態代理對象調用 sqlSession.selectOne()和 sqlSession.selectList()是根據 mapper 接
    口方法的返回值決定,如果返回 list 則調用 selectList 方法,如果返回單個對象則調用
    selectOne 方法。**上面用的是selectOne(),下面有selectList()的例子

    ps:下面這張圖是使用junit插件,有興趣可以了解一下,很簡單,而且你肯定會用到,不論測試還是開發

    public class UserMTest {
    	private SqlSession sqlSession;
    	
    	@Before
    	public void init() throws IOException {
    		//初始化、加載環境、創建會話工廠、獲取會話
    		//1.加載mybatis的運行環境   io流的方式讀取全局配置文件
    		InputStream is = Resources.getResourceAsStream("mybatis.xml");
    		
    		//2.創建會話工廠
    		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    		
    		//3.獲取會話
    		sqlSession = sqlSessionFactory.openSession();
    	}
    	
    	@Test
    	public void selectById() {
    		//4.通過會話操作數據庫
    		//第一個參數:statement的id 具體執行的sql   寫法是:namespace.id
    		//第二個參數:值
    		User user = sqlSession.selectOne("UserMapper.selectById", 1);
    		System.err.println("user:"+user);
    	}
    	/** 
    	 * 方法描述: 模糊查詢用例
    	 */
    	@Test
    	public void selectByName() {
    		List<User> list = sqlSession.selectList("UserMapper.selectByName", "三");
    		System.err.println(list);
    	}
    	
    	/** 
    	 * 方法描述: 新增用戶測試用例
    	 */
    	@Test
    	public void addUser() {
    		User user = new User();
    		user.setUserName("jack");
    		user.setAddress("寨里");
    		user.setBirthday(new Date());
    		user.setSex("男");
    		int i = sqlSession.insert("UserMapper.addUser", user);
    		sqlSession.commit();
    		System.err.println(i);
    		//這里是一個特別的地方,我們在mapper.xml文件中設置的我們可以獲取到他的id
    		System.err.println(user.getId());
    	}
    	
    	@Test
    	public void delete() {
    		int i = sqlSession.delete("UserMapper.deleteUser", 52);
    		sqlSession.commit();
    		System.err.println("刪除"+i);
    		System.out.println("aaaaa");
    	}
    
    	/** 
    	 * 方法描述:修改一個用戶信息
    	 */
    	@Test
    	public void updateUser() {
    		User user = new User();
    		user.setId(51);
    		user.setUserName("rose");
    		user.setSex("女");
    		int i = sqlSession.update("UserMapper.updateUser", user);
    		sqlSession.commit();
    		System.err.println(i);
    	
    	}
    	
    	@After
    	public void after() {
    		sqlSession.close();
    	}
    	
    	
    	
    }
    

    這是引入的包

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.ibatis.annotations.Delete;
    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.After;
    import org.junit.Before;
    import org.junit.Test;
    

    注意:session增刪改操作后要commit提交,如果不用commit提交,不會報錯,但數據庫不會改變。所有操作最后都要close關閉session。增刪改查也調用的不一樣的方法
    例子到此結束
    ——————————————————

    你想想,每次都要初始化、加載環境、創建會話工廠、獲取會話,豈不是很麻煩,所以我們可以把他封裝到一個類中

    創建工具類
    package com.cbb.utils;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    /** 
     * 類描述:實現會話工廠的單例模式
     * 作者: 地鐵與人海
     * 創建日期:2019年3月7日
     * 修改人:
     * 修改日期:
     * 修改內容:
     * 版本號: 1.0.0   
     */
    
    public class SqlSessionFactoryUtil {
    
    	private static SqlSessionFactory sqlSessionFactory;//會話工廠
    	
    	static {
    		System.err.println("static靜態代碼塊");
    		//初始化、加載環境、創建會話工廠、獲取會話
    		//1.加載mybatis的運行環境   io流的方式讀取全局配置文件
    		InputStream is;
    		try {
    			is = Resources.getResourceAsStream("mybatis.xml");
    			//2.創建會話工廠
    			sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}	
    	}
    	/** 
    	 * 方法描述:獲取會話工廠
    	 * @return
    	 */
    	public static SqlSessionFactory getSqlSessionFactory() {
    		return sqlSessionFactory;
    	}
    	
    }
    

    這就是我創建的工具類,就是創建著玩,用起來也就省了一兩步
    這是使用

    public class LoginTest {
    	private SqlSession sqlSession;
    	
    	@Before
    	public void init() {
    		sqlSession = SqlSessionFactoryUtil.getSqlSessionFactory().openSession();
    	}
    	
    	/** 
    	 * 方法描述: 模糊查詢用例
    	 */
    	@Test
    	public void selectByName() {
    		List<User> list = sqlSession.selectList("t_UserMapper.selectByName", "a");
    		System.err.println(list);
    	}
    }
    

    會話工廠與會話的簡介

    SqlSessionFactory: 會話工廠。通過全局配置文件創建的,由SqlSessionFactoryBuild對象創建。
    作用:創建會話。
    特點:會話工廠一旦創建,就會在應用程序的執行期間一直存在。我們就不需要重復的來創建這個 會話工廠了。所
    以我們應該 把它的實現方式設計為 單例模式的。
    SqlSession: 會話。 作用:操作數據庫。
    特點:線程不安全的。應該把會話聲明為局部的。

    全局配置文件的其他配置

    起別名

    起別名
    這樣,我們可以將mapper里面的resultType=“com.cbb.pojo.User"改為你起的名字"user”
    功能照常運行。

    批量加載映射文件

    普通加載
    上面是只加載一個mapper配置文件
    下面是批量加載配置文件,加載一整個包里面的配置文件
    批量加載

    下面這個我沒用過,是粘貼過來的,有引用出處。
    一個沒實驗過的功能,在此只是做一個介紹
    我一直以為上面那張圖片的地址是我復制時的網址,今天想回去看一下發現那是我的。
    上面這個是加在mybatis的配置文件中的,
    當你得pojo對象的字段名和數據庫中的表的字段名不一致時,你使用select * 就會只查出相符的字段,此時需要使用起別名的方法進行查詢。
    一般不一樣的原因在于,字段名是由兩個單詞組成的,比如在java中是userName,而在數據庫中是user_name,
    此時如果我們想使用select*,可以在配置上加上上面這個配置,他自動會給你轉換java和數據庫的字段名,就不需要起別名了。
    還有下面這一些配置

    <settings>
    
    		<!-- 全局映射器啟用緩存 -->
    		<setting name="cacheEnabled" value="true"/>
    
    		<!-- 查詢時,關閉關聯對象即時加載以提高性能 -->
    		<setting name="lazyLoadingEnabled" value="true"/>
    
    		<!-- 對于未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
    		<setting name="multipleResultSetsEnabled" value="true"/>
    
    		<!-- 允許使用列標簽代替列名 -->
    		<setting name="useColumnLabel" value="true"/>
    
    		<!-- 不允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 -->
    		<setting name="useGeneratedKeys" value="false"/>
    
    		<!-- 給予被嵌套的resultMap以字段-屬性的映射支持 FULL,PARTIAL -->
    		<setting name="autoMappingBehavior" value="PARTIAL"/>
    
    		<!-- Allows using RowBounds on nested statements -->
    		<setting name="safeRowBoundsEnabled" value="false"/>
    
    		<!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. -->
    		<setting name="mapUnderscoreToCamelCase" value="true"/>
    
    		<!-- MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT
                local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. -->
    		<setting name="localCacheScope" value="SESSION"/>
    
    		<!-- Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values
                like NULL, VARCHAR or OTHER. -->
    		<setting name="jdbcTypeForNull" value="OTHER"/>
    
    		<!-- Specifies which Object's methods trigger a lazy load -->
    		<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    
    		<!-- 設置關聯對象加載的形態,此處為按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 -->
    		<setting name="aggressiveLazyLoading" value="false"/>
    		<setting name="logImpl" value="STDOUT_LOGGING"/>
    
    	</settings>
    
    
    	<typeAliases>
    		<!-- 注:model表對象配置,請按照  model 包   中的順序進行錄入,并做好注釋. -->
    
    	</typeAliases>
    
    	<plugins>
    		<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
    			<!--主鍵自增回寫方法,默認值MYSQL,詳細說明請看文檔 -->
    			<property name="IDENTITY" value="MYSQL" />
    			<!--通用Mapper接口,多個通用接口用逗號隔開 -->
    			<property name="mappers" value="com.github.abel533.mapper.Mapper" />
    		</plugin>
    	</plugins>
    

    上面我也不太懂,多見諒。
    如有疑問,可以問我
    END

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

    智能推薦

    【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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

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