mybatis01
mybatis簡記
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>
緩存
? [回到頂部](# mybatis學習筆記(eclipse))
智能推薦
【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控制器代碼...
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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...