MyBatis01
標簽: mybatis
MyBatis
一.Mybatis是什么
MyBatis是一個ORM的數據庫持久化框架。
框架(Framework)是一個框子——指其約束性,也是一個架子——指其支撐性。
IT語境中的框架,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構
數據庫持久化:把內存中數據保存到數據庫中.
ORM:對象關系映射(Object Relational Mapping,簡稱ORM),是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術
常見的ORM持久化框架:
JPA Hibernate DataJpa MyBatis
MyBatis 是一個支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。
MyBatis 消除了幾乎所有的JDBC代碼和手工設置參數以及結果集的檢索。
MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。 SQL映射方式
二.MyBatis入門
1.導包
2.創建結構
3.配置Mybatis-config.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>
<!-- 開發環境-->
<environments default="development">
<!--
一個環境 id:為這個環境取唯一一個id名稱
-->
<environment id="development">
<!--
事務管理 type:JDBC(支持事務)/MANAGED(什么都不做)
mysql: innodb MyISAM
-->
<transactionManager type="JDBC" />
<!-- 數據源, 連接池 type(POOLED):MyBatis自帶的連接池 -->
<dataSource type="POOLED">
<!-- 連接數據庫的參數 四大金剛 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 這個mappers代表的是相應的ORM映射文件 -->
<mappers>
<mapper resource="cn/itsource/mybatis/domain/ProductMapper.xml" />
</mappers>
</configuration>
4.配置ProductMapper.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:命名空間
以后:通過namespace+id 調用對應的語句
-->
<mapper namespace="cn.itsource.mybatis.domain.ProductMapper">
<!--
select:表示查詢標簽
id: 代表給標簽取個名稱 必須唯一
resultType:返回值類型
-->
<select id="findAll" resultType="cn.itsource.mybatis.domain.Product">
select * from product
</select>
<!--新增 parameterType 參數類型
useGeneratedKeys:要得到主鍵
keyColumn:數據庫主鍵的列
keyProperty:對應實體類的屬性
-->
<insert id="save" parameterType="cn.itsource.mybatis.domain.Product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into product(productName,salePrice,costPrice,cutoff)
values(#{productName},#{salePrice},#{costPrice},#{cutoff})
</insert>
<!--修改-->
<update id="update" parameterType="cn.itsource.mybatis.domain.Product">
update product set productName=#{productName},salePrice=#{salePrice}
where id=#{id}
</update>
<!--刪除 long Mybatis內置別名 long java.util.Long remove(13)-->
<delete id="remove" parameterType="long">
delete from product where id=#{id}
</delete>
<!--查詢一條數據-->
<!--
#和 $區別:
(1) $ 取得對象里面的某個屬性 比如 ${id} Long getId
# 都可以
(2)重點 # select * from product where productName = ? 預編譯的對象
$ select * from product where productName = 羅技G500 拼接字符串方式
# 推薦使用 $ sql注入問題
(3)后面使用$的 orderby+limit 后面就不需要添加引號
-->
<select id="findOne" parameterType="cn.itsource.mybatis.query.ProductQuery" resultType="cn.itsource.mybatis.domain.Product">
select * from product where productName = #{productName}
</select>
<sql id="whereSql">
<where>
<if test="productName != null">
and productName = #{productName}
</if>
<if test="id != null">
and id = #{id}
</if>
</where>
</sql>
<select id="queryByCondition" parameterType="cn.itsource.mybatis.query.ProductQuery"
resultType="cn.itsource.mybatis.domain.Product">
select * from product
<include refid="whereSql"></include>
</select>
<!--批量刪除
delete from product where id in (12,15,16)
-->
<delete id="deleteBatch" parameterType="java.util.List">
delete from product where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
<!-- 批量添加
insert into product(productName,salePrice,costPrice)
values ('香蕉',3.99,1),('大香蕉',9.99,2.9)
List<Product>
-->
<insert id="insertBatch" parameterType="java.util.List">
insert into product(productName,salePrice,costPrice)
values
<foreach collection="list" item="product" separator=",">
(#{product.productName},#{product.salePrice},#{product.costPrice})
</foreach>
</insert>
<!--
update product set productName=#{productName} where id in(12,13,14)
map ("productName","xxxx")
map ("list",list)
-->
<update id="updateBatch" parameterType="map">
update product set productName=#{productName} where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
</mapper>
5.簡單的查詢測試
@Test
public void findall() throws IOException {
List<Product> products = new ProductServiceImpl().findAll();
}
三.MyBatis完成CRUD
1.抽取工具類
package cn.itsource.mybatis.util;
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 java.io.IOException;
import java.io.Reader;
public enum MybatisUtil {
INSTANCE;
private static SqlSessionFactory sqlSessionFactory;
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//抽取一個sqlsession
public SqlSession getsqlsession(){
return sqlSessionFactory.openSession();
}
}
2.ProductDaoImpl.java
package cn.itsource.mybatis.dao.impl;
import cn.itsource.mybatis.dao.IProductDao;
import cn.itsource.mybatis.domain.Product;
import cn.itsource.mybatis.query.ProductQuery;
import cn.itsource.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class ProductDaoImpl implements IProductDao {
@Override
public List<Product> findAll() throws IOException {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
List<Product> products = sqlsession.
selectList("cn.itsource.mybatis.domain.ProductMapper.findAll");
return products;
}
@Override
public void save(Product product) throws IOException {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.insert("cn.itsource.mybatis.domain.ProductMapper.save",product);
sqlsession.commit();
sqlsession.close();
}
@Override
public void update(Product product) throws IOException {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.insert("cn.itsource.mybatis.domain.ProductMapper.update",product);
sqlsession.commit();
sqlsession.close();
}
@Override
public void remove(Long id) throws IOException {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.delete("cn.itsource.mybatis.domain.ProductMapper.remove",id);
sqlsession.commit();
sqlsession.close();
}
@Override
public Product findOne(ProductQuery productQuery) throws Exception {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
Product product = (Product) sqlsession.selectOne("cn.itsource.mybatis.domain.ProductMapper.findOne", productQuery);
return product;
}
@Override
public List<Product> queryByCondition(ProductQuery productQuery) throws Exception {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
List<Product> products = sqlsession.selectList("cn.itsource.mybatis.domain.ProductMapper.queryByCondition",productQuery);
return products;
}
@Override
public void deletebatch(List ids) {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.delete("cn.itsource.mybatis.domain.ProductMapper.deleteBatch",ids);
}
@Override
public void insertbatch(List<Product> products) {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.insert("cn.itsource.mybatis.domain.ProductMapper.insertBatch",products);
}
@Override
public void updatebatch(Map map) {
SqlSession sqlsession = MybatisUtil.INSTANCE.getsqlsession();
sqlsession.insert("cn.itsource.mybatis.domain.ProductMapper.updateBatch",map);
}
}
3.CRUD測試類
package cn.itsource.mybatis.test;
import cn.itsource.mybatis.dao.impl.ProductDaoImpl;
import cn.itsource.mybatis.domain.Product;
import cn.itsource.mybatis.query.ProductQuery;
import cn.itsource.mybatis.service.impl.ProductServiceImpl;
import org.junit.Test;
import java.io.IOException;
import java.util.*;
public class MainTest {
@Test
public void findall() throws IOException {
List<Product> products = new ProductServiceImpl().findAll();
}
@Test
public void save() throws IOException {
Product product1 = new Product();
product1.setProductName("felt");
product1.setSalePrice(11.0);
product1.setCostPrice(12.0);
product1.setCutoff(0.5);
new ProductServiceImpl().save(product1);
System.out.println(product1);
}
@Test
public void update() throws IOException {
Product product1 = new Product();
product1.setId(21L);
product1.setProductName("felt");
product1.setSalePrice(11.0);
product1.setCostPrice(12.0);
product1.setCutoff(0.5);
new ProductServiceImpl().update(product1);
System.out.println(product1);
}
@Test
public void delete() throws IOException {
new ProductServiceImpl().remove(22L);
}
@Test
public void findone() throws Exception {
ProductQuery productQuery = new ProductQuery();
productQuery.setProductName("羅技G500");
System.out.println(new ProductServiceImpl().findOne(productQuery));
}
@Test
public void QueryByCondition() throws Exception{
ProductQuery productQuery = new ProductQuery();
// productQuery.setId(20L);
productQuery.setProductName("羅技G500");
System.out.println(new ProductServiceImpl().queryByCondition(productQuery));
}
@Test
public void DeleteBatch() throws Exception{
List<Long> ids = Arrays.asList(21L, 23L);
new ProductServiceImpl().deletebatch(ids);
}
@Test
public void InsertBatch() throws Exception{
List<Product> products = Arrays.asList(
new Product("RESISTANCE",200.00,100.00),
new Product("MIX",20.00,2.00));
new ProductServiceImpl().insertbatch(products);
}
@Test
public void updateBatch1() throws Exception{
Map map = new HashMap();
map.put("productName","aaaaaaaa");
map.put("list", Arrays.asList(24L,25L));
new ProductDaoImpl().updatebatch(map);
}
@Test
public void updateBatch2() throws Exception{
Product p1= new Product("無人知曉前路少了你",200.0,100.0);
p1.setId(24L);
Product p2= new Product("便少了一份方向",200.0,100.0);
p2.setId(25L);
List<Product> products = new ArrayList<>();
products.add(p1);
products.add(p2);
for (int i = 0;i<products.size();i++){
Product p = products.get(i);
new ProductDaoImpl().update(p);
}
}
}
4.ProductMapper.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:命名空間
以后:通過namespace+id 調用對應的語句
-->
<mapper namespace="cn.itsource.mybatis.domain.ProductMapper">
<!--
select:表示查詢標簽
id: 代表給標簽取個名稱 必須唯一
resultType:返回值類型
-->
<select id="findAll" resultType="cn.itsource.mybatis.domain.Product">
select * from product
</select>
<!--新增 parameterType 參數類型
useGeneratedKeys:要得到主鍵
keyColumn:數據庫主鍵的列
keyProperty:對應實體類的屬性
-->
<insert id="save" parameterType="cn.itsource.mybatis.domain.Product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into product(productName,salePrice,costPrice,cutoff)
values(#{productName},#{salePrice},#{costPrice},#{cutoff})
</insert>
<!--修改-->
<update id="update" parameterType="cn.itsource.mybatis.domain.Product">
update product set productName=#{productName},salePrice=#{salePrice}
where id=#{id}
</update>
<!--刪除 long Mybatis內置別名 long java.util.Long remove(13)-->
<delete id="remove" parameterType="long">
delete from product where id=#{id}
</delete>
<!--查詢一條數據-->
<!--
#和 $區別:
(1) $ 取得對象里面的某個屬性 比如 ${id} Long getId
# 都可以
(2)重點 # select * from product where productName = ? 預編譯的對象
$ select * from product where productName = 羅技G500 拼接字符串方式
# 推薦使用 $ sql注入問題
(3)后面使用$的 orderby+limit 后面就不需要添加引號
-->
<select id="findOne" parameterType="cn.itsource.mybatis.query.ProductQuery" resultType="cn.itsource.mybatis.domain.Product">
select * from product where productName = #{productName}
</select>
<sql id="whereSql">
<where>
<if test="productName != null">
and productName = #{productName}
</if>
<if test="id != null">
and id = #{id}
</if>
</where>
</sql>
<select id="queryByCondition" parameterType="cn.itsource.mybatis.query.ProductQuery"
resultType="cn.itsource.mybatis.domain.Product">
select * from product
<include refid="whereSql"></include>
</select>
<!--批量刪除
delete from product where id in (12,15,16)
-->
<delete id="deleteBatch" parameterType="java.util.List">
delete from product where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
<!-- 批量添加
insert into product(productName,salePrice,costPrice)
values ('香蕉',3.99,1),('大香蕉',9.99,2.9)
List<Product>
-->
<insert id="insertBatch" parameterType="java.util.List">
insert into product(productName,salePrice,costPrice)
values
<foreach collection="list" item="product" separator=",">
(#{product.productName},#{product.salePrice},#{product.costPrice})
</foreach>
</insert>
<!--
update product set productName=#{productName} where id in(12,13,14)
map ("productName","xxxx")
map ("list",list)
-->
<update id="updateBatch" parameterType="map">
update product set productName=#{productName} where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
</mapper>
四.mybatis使用細節
1.主鍵問題
有時候 保存一條數據之后,需要拿到這條數據的主鍵,拿到之后可以做后續事情
場景:
角色的保存
useGeneratedKeys=“true” keyColumn=“id” keyProperty=“id”
<insert id="save" parameterType="cn.itsource.mybatis.domain.Product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into product(productName,salePrice,costPrice,cutoff)
values(#{productName},#{salePrice},#{costPrice},#{cutoff})
</insert>
2.日志問題
1.導入日志的jar包
2.log4j.properties配置文件
#log4j.rootLogger=ERROR, stdout
#(了解)日志等級: OFF level > FATAL(致命) > ERROR(錯誤) > WARN (警告)>
# INFO (提示)> DEBUG (調試)> trace > ALL level(所有配置)
#輸出效果 如果你設置日志級別是trace,則大于等于這個級別的日志都會輸出
# 關閉日志輸出
#log4j.rootLogger=NONE
#log4j.rootLogger=NONE ERROR 為嚴重錯誤 主要是程序的錯誤、
# WARN為一般警告,比如session丟失、
# INFO為一般要顯示的信息,比如登錄登出、
# DEBUG為程序的調試信息
# TRACE 堆棧信息
# 掃描包 配置自己包
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
3.動態sql
具體用法以及案例,參照MyBatis完成CRUD
智能推薦
【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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...