MyBatis學習筆記(一)
1.相關介紹
持久層將業務數據存儲到磁盤,具備長期的存儲能力
優點:在斷電情況下不會發生數據丟失;磁盤比較廉價,擴容內存性價比高。
缺點:慢(相對于內存),一般場景還好,對于秒殺的大量數據操作不適合。秒殺場景用Redis。
用Redis的原因:
他是基于內存的高性能Key-value數據庫,所有數據緩存在內存中。內存讀取速度非常快。采用單線程,避免不必要的上下文切換和競爭條件。使用多路復用I/O,非阻塞I/O。
Sql與Nosql存儲方式:
一般的傳統數據庫存儲方式是左側,Nosql是以右側方式存儲。
Q: 往往硬盤容量要遠遠大于內存的容量,會不會導致存儲數據的時候內存不夠,這種情況該怎么應付?如果數據量特別大,但是熱存儲卻比較小,用Nosql的意義何在?若是熱數據用Nosql用,冷數據用sql是不是代碼又非常復雜?
A: Redis2.0實現了冷熱數據分離 ?為什么沒有繼續深入,
2MyBatis
核心組件:
SqlSessionFactoryBuilder
,SqlSessionFactory
,SqlSession
,SQL Mapper
SqlSessionFactoryBuilder
:根據配置和代碼生成SqlSessionFactory
。若用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>
<porperties resource="jdbc.properties">
</porperties>
<!-- 別名 -->
<typeAliases>
<typeAlias alias="role" type="com.chen.model.User"/>
</typeAliases>
<!-- 環境配置 -->
<environments default="develepment">
<environment id="develepment">
<!-- 事務類型 -->
<transactionManager type="JDBC"/>
<!-- 數據庫連接 -->
<dataSource type="POOLED">
<property name="drive" value="${database.driver}"/>
<property name="uri" value="${database.uri}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com.chen.mapper.UserMapper.xml"/>
</mappers>
</Configuration>
可以看到MyBatis配置有很多參數。
注意:MyBatis配置項的順序不能顛倒。
typeAliases:定義別名
還可以使用:
<typeAliases>
<package name="com.chen.model.User"/>
</typeAliases>
別名就是user
Environment
: 數據庫描述
Mappers
:添加數據查詢的配置
Q:可以看到dataSource里邊的屬性都用了${database.XXX}來接受數據,而不是直接提供參數,而參數是通過<porperties resource="jdbc.properties"></porperties>
調用jdbc.properties
文件,如下:
database.driver="org.postgresql.Driver"
database.uri="jdbc:postgresql://xxxxxxxxxxxxx"
database.username="username"
database.password="password"
這樣的好處?
A: 方便參數修改,而不會引起代碼的重新編譯,更利于日后維護和修改。
Settings
設置:
常用到的是:
cacheEnable:
配置緩存,影響所有映射器中配置緩存的全局開關
lazyLoadingEnabled
:延遲加載的全局開關。 設置為true時,關閉關聯對象提供性能。
AggressiveLazyLoading
:設置為false時,不會加載關聯字段,提高性能。
SqlSessionFactory
:創建 SqlSession
SqlSession
:創建獲取Mapper接口,控制數據庫事務,數據交互
SQL Mapper
:接口 + XML
接口只需要寫查詢的抽象方法就行:
model
package com.chen.model;
public class User {
private long id;
private String username;
private String password;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return username;
}
public void setUserName(String username) {
this.username = username;
}
public String getPassWord() {
return password;
}
public void setPassWord(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + username + ", passWord=" + password + "]";
}
}
映射器接口:
package com.chen.mapper;
import java.util.List;
import com.chen.model.User;
public interface UserMapper {
/** 增 */
int insertUser(User user);
/** 刪 */
int deleteUser(long id);
/** 改 */
int updateUser(User user);
/** 查 */
User findUserById(long id);
/** 查 */
List<User> findUsers(String username);
}
映射器配置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">
<mapper namespace="com.chen.mapper.RoleMappaer">
<insert id="insertUser" parameterType="User">
insert into
t_user(username,passWord)
values( #{username}, #{password})
</insert>
<delete id="deleteUser" parameterType="long">
delete from t_user
where id = #{id}
</delete>
<update id="updateUser" parameterType="User">
update t_user
set username = #(username),
password = #{password}
where id = #{id}
</update>
<select id="findUserById" parameterType="long">
select *
from t_user
where id = #{id}
</select>
<select id="findUsers" parameterType="String">
select *
from t_user
where username like concat('%', #{username}, '%')
</select>
</mapper>
namespace為接口的全限定名。
用這種方式而不用注解的原因:注解會導致代碼可讀性差,不利于日后維護和修改。Xml方式更加靈活。
創建SqlSessionFactory和創建SqlSession如下:
package com.chen.utils;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryUtils {
private static final Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;
private static SqlSessionFactory sqlSessionFactory = null;
private SqlSessionFactoryUtils() {
}
/**
* SqlSessionFactoryBuilder使用Builder創建SqlSessionFactory
* 使用單例模式,節省數據庫資源的消耗
* @return
*/
public static SqlSessionFactory getSqlSesseionFactory() {
synchronized (LOCK) {
if(sqlSessionFactory != null) {
return sqlSessionFactory;
}
String resource = "mybatis-config.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return sqlSessionFactory;
}
}
/** SqlSessionFactory使用openSession()方法 獲取SqlSession */
public static SqlSession openSqlSession() {
if(sqlSessionFactory == null) {
sqlSessionFactory = getSqlSesseionFactory();
}
return sqlSessionFactory.openSession();
}
}
按上面運行,找不到mybatis-confog.xml文件,定位的錯誤地方是Reader處:
String resource = "mybatis-config.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
代碼不同是使用的Reader,可能是版本升級SqlSessionFactoryBuilder().build() 里邊沒有InputStream的參數類型,很尷尬。
InputStream inputStream= Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
若沒問題,通過下面就可以跑通項目:
package com.chen.main;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.chen.mapper.UserMapper;
import com.chen.model.User;
import com.chen.utils.SqlSessionFactoryUtils;
public class TestMain {
public static void main(String[] args) {
Logger LOGGER = Logger.getLogger(TestMain.class);
SqlSession sqlSession = null;
try {
sqlSession = SqlSessionFactoryUtils.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1L);
LOGGER.info(user.toString());
}catch(Exception e) {
LOGGER.info(e.getMessage(),e);
}finally {
if(sqlSession != null)
sqlSession.close();
}
}
}
3.總結:
MyBatis最大的成功之處有三點:
- 不屏蔽Sql
- 提供強大、靈活的映射機制
- 提供Mapper的接口編程,接口+xml 就能創建映射器
Q:為什么這三點事他的成功之處?
A:
不屏蔽SQL:
在映射器的xml配置中可以配置自己制定的sql語句,他很精確地定位了需要執行的語句。而像Hibernate自動生成規則,甚至不需要程序員精通Sql。
提供強大、靈活的映射機制:沒看
Q:MyBatis的定位
作為數據交互層,通過Mybatis來訪問數據庫。
Q:與mongoDB的區別
mongo不需要自己寫sql語句,也不需要配置映射器,直接調用MongoOperation里邊的方法就行。mongo作為Nosql可以存儲對象,數據存儲在緩存中,存取速度比mybatis快。
MyBaties需要自己寫映射器與映射規則,數據存儲在磁盤中,存取速度慢。
智能推薦
Mybatis學習筆記(一)
1、環境描述 java版本:1.8 開發工具:idea 2018版 mysql:8.x版本 mybatis:3.4.6版本 lombok mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。 本文將圍繞它來介紹Mybatis的入門案例。 2、項目結構 2.1 配置文件 在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾...
MyBatis學習筆記(一)
一、MyBatis介紹 MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記...
Mybatis學習筆記一
Mybatis學習筆記一 概述 Mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和 statement 中sql 的動態參數進行映射生...
MyBatis學習筆記(一)
1 、對原生態jdbc程序中問題總結 jdbc編程步驟: 1、 加載數據庫驅動 2、 創建并獲取數據庫鏈接 3、 創建jdbc statement對象 4、 設置sql語句 5、 設置sql語句中的參數(使用preparedStatement) 6、 通過statement執行sql并獲取結果 7、 對sql執行結...
Mybatis學習筆記(一)
嗷嗷 環境統一 JDK1.8 Mysql5.7 maven3.6.1 簡介 什么是mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。 iBATIS一詞來源于“internet”和...
猜你喜歡
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...