Mybatis01:Mybatis概念及環境搭建
1.Mybatis概念
1.Mybatis特點
? 1.屬于持久層框架 持久化(將內存中的對象數據轉移到數據庫的過程稱為持久化)
? Mybatis Hibernate Spring-Data-Jpa
? 2.半自動化 ORM 框架
? ORM:對象關系映射思想
? 面向對象OOP 關系型數據庫
? 類(User) t_user
? 成員變量 字段
? 類對象 記錄
? 半自動化 VS 自動化
? Mybatis-半自動化:
? 1.表需要手動進行設計
? 主表 從表
? 2.應用程序提供sql -基本功(以查詢為主
? 單表查詢-(條件過濾 排序 分組 子查詢 聚合查詢-聚合函數)
? 多表連接查詢
? )
? 3.依賴數據庫平臺
? 優點:上手簡單(基于原生的JDBC封裝) 優化比較靈活 適合做互聯網項目
? Hibernate-自動化ORM 框架
? 1.表可以通過框架自動化創建
? 2.省掉基本的sql (基本的添加 查詢 更新 刪除)
? 3.不依賴數據庫平臺
? 缺陷:學習成本較高 優化難度較大 適用于傳統的軟件( OA | 圖書館管理系統 | ERP。。 ) 不適合大型的互聯網項目(電商 金融項目)
2.什么是 MyBatis?
? MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
? 1.支持定制化sql (程序員編寫sql)
? 2.支持存儲過程調用(數據庫端腳本)
? 3.映射處理(結果映射)
屏蔽原生的jdbc 代碼( Connection PS ResultSet 資源關閉 )
XML 配置 | 注解配置
2.Mybatis環境搭建
目錄圖:
表的結構圖:
1.構建Maven普通工程:maven-archetype-quickstart
2.pom.xml 添加依賴坐標
<!-- mybatis jar 包依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- log4j 日志打印 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<build>
<!--
Maven 項目
如果源代碼(src/main/java)存在xml properties tld 等文件 maven 默認不會自動編譯該文件到輸出目錄
如果要編譯源代碼中xml properties tld 等文件 需要顯式配置resources 標簽
-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
3.resources文件夾中添加日志文件 log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t]-%m%n
4.resources文件夾中添加配置文件 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc.user=root
jdbc.password=root
5.數據庫表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL,
`user_pwd` varchar(255) DEFAULT NULL,
`flag` varchar(255) DEFAULT NULL,
`create_time` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;
6.添加User對象實體類
public class User {
private Integer id;
private String userName;
private String userPwd;
private String flag;
private Date createtime;
}
7.在 java目錄下新建一個 mappers 包添加Sql映射文件 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">
<!--
1.命名空間配置 namespace: 值全局唯一 包名+文件名(不包含后綴如:.xml),格式:com.mage.mappers.UserMapper
2.配置 Mapped Statement
3.查詢標簽:select 又稱為statement statement 配置
id 值聲明 statement 唯一標識,同一命名空間(同一文件)下不可重復
parameterType 輸入參數即占位符的數據類型 類型可以是 基本數據類型,字符串,javabean ,map,list,數組 等
resultType 輸出結果 類型可以是基本數據類型,字符串,javabean,map等
標簽體:statement 描述 即待執行的 sql語句
#{id} 占位符 變量名為 id/value 均可 ${value} 變量名必須為 value 如果是字符串拼接形式 無法避免sql注入
-->
<mapper namespace="com.mage.mappers.UserMapper">
<select id="queryUserById" parameterType="int" resultType="com.mage.vo.User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
</mapper>
8.resources文件夾中添加全局配置文件mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架頭文件聲明,類似 spring 環境,均需要加入頭文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 添加數據庫連接相關配置信息 -->
<configuration>
<!--引入外部配置文件-->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<!-- 加入事務控制 -->
<transactionManager type="jdbc" />
<!-- 配置數據庫連接信息 -->
<dataSource type="pooled">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper 加載指定Sql映射配置文件 文件數量可配置多個-->
<mappers>
<!--resource:包路徑 格式:xxx/xxx/xxx/xxxMapper.xml-->
<mapper resource="com/mage/mappers/UserMapper.xml" />
</mappers>
</configuration>
9.添加測試代碼
@Test
public void test01() throws IOException {
/*步驟:
* 1.加載全局配置文件 構建sqlSessionFactory
* 2.獲取會話sqlSession
* 3.調用方法執行查詢
* 4.關閉查詢
*/
/*加載配置到內存 注意:org.apache.ibatis.io.Resources*/
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
/*
*創建SqlSessionFactory對象hibernate也是如此,必須先獲取SqlSessionFactory實例化對象
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
*打開會話
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
/**獲取session以便操作數據庫
* 參數一:指定UserMapper.xml映射文件id必須加入命名空間
* 參數二:指定輸入參數
* 參數statment對應:namespace.statementId
*/
User user = sqlSession.selectOne("com.mage.mappers.UserMapper.queryUserById", 75);
System.out.println(user);
/*
*操作完數據庫關閉session
*/
sqlSession.close();
}
10.啟動測試
3.mybatis中的Mapper.xml中sql入參,結果參數配置
- 入參: 基本類型(包裝類型)、String、Date、JavaBean、Map、List、數組
- 結果參數:基本類型(4類8種) String Date JavaBean List Map List
1.Mybatis映射sql 入參配置
基本類型
<!--使用sql標簽,將sql語句中頻繁使用的字段統一管理和使用,直接通過id屬性來調用-->
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<select id="queryUserById" parameterType="int" resultType="com.mage.vo.User">
select <include refid="user_columns"/>
from user
where id=#{userId}
</select>
String 類型
<select id="queryUserByUserName" parameterType="string" resultType="com.mage.vo.User">
select <include refid="user_columns"/>
from user
where user_name=#{userName}
</select>
JavaBean 類型
<select id="queryUserByUserNameAndUserPwd" parameterType="com.mage.query.UserQuery" resultType="com.mage.vo.User">
<!--
userName,userPwd 為 UserQuery 類成員變量名
-->
select <include refid="user_columns"/>
from user
where user_name=#{userName} and user_pwd=#{userPwd}
</select>
Map 類型
<select id="queryUserByUserNameAndUserPwdMap" parameterType="map" resultType="com.mage.vo.User">
<!--
uname map 中key 的名稱
password map 中key 的名稱
-->
select <include refid="user_columns"/>
from user
where user_name=#{uname} and user_pwd =#{password}
</select>
數組類型
<!--
collection 值 array|list 當數組放在map 中傳入時collection值此時為key的名稱!!!
-->
<update id="updateUserPasswordByIds" >
update user set user_pwd="111111" where id in
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</update>
2.Mybatis映射sql 結果參數配置
結果參數:基本類型(4類8種) String Date JavaBean List Map List<Map>
resultType:String Date JavaBean map
resultMap:屬于一個標簽id 值 為另一個resultMap 標簽的id
基本類型
<select id="countUser" resultType="int">
select count(1)
from user
</select>
日期類型
<select id="queryUserCreateTimeByUserId" parameterType="int" resultType="date">
select create_time
from user
where id=#{userId}
</select>
JavaBean
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<select id="queryUserByUserName" parameterType="string" resultType="com.mgae.vo.User">
select <include refid="user_columns"/>
from user
where user_name=#{userName}
</select>
Map
<select id="queryUsersByUserNameLikeMap" parameterType="string" resultType="map">
select <include refid="user_columns"/>
from user
where user_name like concat('%',#{userName},'%')
</select>
List
<select id="queryUsersByUserNameLike" parameterType="int" resultType="com.mgae.vo.User">
select <include refid="user_columns"/>
from user
where user_name like concat('%',#{userName},'%')
</select>
ResultMap 接收結果
<!--
當前文件 id 唯一且不可重復
-->
<resultMap id="user_map" type="User">
<!--
column:返回的列名
property:User 對象成員變量
-->
<result column="id" property="id"></result>
<result column="user_name" property="userName"></result>
<result column="user_pwd" property="userPwd"></result>
<result column="flag" property="flag"></result>
<result column="create_time" property="createTime"></result>
</resultMap>
<select id="queryUserById02" parameterType="int" resultMap="user_map">
select id, user_name, user_pwd, flag, create_time
from user
where id=#{userId}
</select>
4.Mybatis的xml配置文件中常見元素配置
(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
1.properties標簽
1.給某些外部屬性賦值且可以動態替換
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
2.加載外部配置文件
<!--引入外部配置文件-->
<properties resource="jdbc.properties"/>
2.typeAlias標簽
1.類型別名是為 Java 類型設置一個短的名字,它只和 XML 配置有關,存在的意義僅在于用來減少類完全限定名的冗余,書寫方便
<typeAliases>
<!--配置1:指定具體類取別名-->
<typeAlias type="com.mage.vo.User" alias="user"/>
<typeAlias type="com.mage.query.UserQuery" alias="userquery"/>
<!--配置2:指定某個包路徑下的所有類取別名,別名默認是類名(推薦使用)-->
<package name="com.mage.vo"/>
<package name="com.mage.query"/>
</typeAliases>
對應mybatis項目中的java目錄下的Mapper.xml映射文件中sql入參和結果參數配置可以做出相應的書寫改變
<!--使用sql標簽,將sql語句中頻繁使用的字段統一管理和使用,直接通過id屬性來調用-->
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<!--在mybatis.xml中添加別名標簽,sql映射文件中入參和結果參數可以用類名代替,不必寫包名+類名-->
<select id="queryUserById" parameterType="int" resultType="User">
select <include refid="user_columns"/>
from user
where id=#{userId}
</select>
<select id="queryUserByUserNameAndUserPwd" parameterType="UserQuery" resultType="User">
<!--
userName,userPwd 為 UserQuery 類成員變量名
-->
select <include refid="user_columns"/>
from user
where user_name=#{userName} and user_pwd=#{userPwd}
</select>
3.mappers標簽
mappers 映射器(四種配置):精確定位我們配置的sql映射文件的所在位置,進行后續的CRUD操作!
<!— sqlmapper 配置文件路徑 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!—url 絕對路徑形式-->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!—接口 列表配置形式 注解 sql-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!—映射包下所有接口-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
4.settings標簽
<settings>
<!--
數據庫字段(帶有_字符的字段) 自動轉換為駝峰命名
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
本次分享就到這里,如果文章有小問題,歡迎評論區留言,如果文章對你有幫助,請各位收藏并給我點個贊,如果你想學習更多,請關注我!謝謝!
智能推薦
MyBatis01:第一個程序
轉載自:狂神說MyBatis01:第一個程序 起意 最近在學習MyBatis,看了狂神的教程,感覺簡單易懂。 這篇文章在狂神的文章上,加了一點自己的認識。 希望之后可以慢慢養成寫博客的習慣。 什么是MyBatis? MyBatis 是一款優秀的持久層框架 MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集的過程(和jdbc比較) MyBatis 可以使用簡單的 XML 或...
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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...