当前位置: 首页>Python>正文

數據庫基礎知識整理,數據庫筆記整理

數據庫基礎知識整理,數據庫筆記整理

一 SQL語句

1.1、基礎語句

–注釋
/*
多行注釋
/
– 查詢一張表中的所有數據的所有字段 select * from 數據源;
– 查詢語法 : select 查詢的數據(
|字段名|字段1,字段 2…|偽列) from 數據源 別名;
–* 一條數據的所有字段值
–執行流程: from --> select

select * from dept;
SELECT * FROM EMP;

–1)
–查詢|檢索|獲取 所有員工的所有信息
–查詢的數據 : 員工的所有信息 *
–數據的來源 : 員工表 emp
–條件 : 無

select * from emp;

數據庫基礎知識整理,–2)
–查詢所有的員工名字
–查詢的數據 : 員工的姓名 ename
–數據的來源 : 員工表 emp
–條件 : 無

SELECT ename FROM EMP;

–3)

select empno, ename, mgr from emp;

–4)

select deptno from dept;

–查詢所有員工所在的部門編號
–查詢的數據 : 部門編號 deptno
–數據的來源 : emp,dept
–條件 : 無

–去重 distinct : 對結果集中完全相同的多條數據只顯示一條

select distinct deptno from emp;

mysql數據庫知識點。–5)

select distinct deptno from emp;
--select deptno from emp;

–6)

select distinct ename, deptno from emp;

–7)
–偽列 : 表達式,整數,字符串
–查詢表達式 2*3

select distinct 123*456 from emp;
select ename,sal,sal*12 from emp;

–8)
–取別名
– select 數據 (as) 別名,數據 別名… from 數據源 別名;
–“” 中的內容原封不動顯示
–如果別名為英文,默認大寫,如果想要原封不動顯示,前后添加一對""

select ename 員工姓名,sal "empSal",sal*12 as "年 薪" from emp e;
select e.* from emp e;

–9)
– ’ 字符串 ’

select deptno,dname,'xixihaha' "xixihaha" from dept;
select deptno,dname,'yjxxt' 公司名稱 from dept;

大一數據庫必考知識點,–10)
–字符串拼接 ||

select 'xixi'||'haha' from emp;
select 'YJX-'||ename 員工姓名 from emp;

–11)
–偽列 : 數據源中不存在的字段,可以在select后面查詢,假設存在
–偽列 : 表達式,整數,字符串

–12)
–虛表 : dual

select 789*654  from dual;
select distinct 789*654 from emp;

–13)

--null值與數字運算,結果為null
select ename,sal,comm,comm+1 from emp;
--null值與字符串拼接,結果為原字符串
select ename,sal,comm,comm||'1' from emp;

–處理null值 : nvl(值1,值2) 當值1為null,nvl函數的結果為值2,當值1不為null,nvl函數的結果為值1

select ename,sal,comm,nvl(comm,0)+1 from emp;

數據庫試題及答案解析。–13)
–結尾小練習

select ename,job,sal from emp where comm is null;

1.2、條件查詢

– 條件查詢 : select 要查詢的數據 from 數據源 where 行過濾條件 order by 排序字段1,排序字段2…;
– 執行流程 : from --> where --> select -> order by
– 條件判斷運算符 : = < > <= >= != <>
– 條件連接符 : and or not
– 區間判斷 : 條件1 and 條件2 | between 值1 and 值2(相當于>=與<=)

– 查詢20部門的員工信息
– 數據 : 員工信息 *
– 來源 : 員工表 emp
– 條件 : deptno = 20

select * from emp where deptno = 20; 
select ename, job, sal, deptno from emp where sal>1000;
select * from emp where deptno != 20;
select * from emp where deptno <> 20;
select * from emp where not deptno = 20;

–先過濾后查詢

select ename,job,sal*12 from emp  where sal*12 > 20000;
select ename,job,sal*12 n from emp  where n > 20000; --報錯
select ename,job,sal*12 r from emp;
select * from (select ename,job,sal*12 r from emp) where r>20000;

數據庫系統應用。– 查詢 any(任意一個) some(任意一個) all(所有)

select * from emp where sal> all(900,1000,1100);
select * from emp where sal< all(900,1000,1100);
select * from emp where sal> some(900,1000,1100);
select * from emp where job = 'SALESMAN';
select ename,sal from emp where sal=2000 or sal=3000;
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and 3000;
select * from emp where job='CLERK' and deptno=20;
select * from emp where job='CLERK' or deptno=20;
select * from emp where job!='CLERK';
select * from emp where job<>'CLERK';
select * from emp where not job='CLERK';
select * from emp where job!='CLERK' and deptno!=20;
select * from emp where not (job='CLERK' or deptno=20);

–存在傭獎金的員工名稱
– 判斷null值需要使用is

select * from emp where comm is not null;
select * from emp where not comm is null;
select * from emp where comm is null;

–集合函數 : 對結果集進一步操作
–union并集去重、 union all并集不去重、 intersect交集 、minus差集

select * from emp where sal>1500 or comm is not null;
select * from emp where sal>1500
union all
select * from emp where comm is not null;
select deptno  from dept
minus
select distinct deptno from emp;

–like 模糊匹配查詢
– 需要配合 %任意個任意字符 _一個任意字符

select * from emp where ename like 'A';--定值查詢,比使用=效率低
select * from emp where ename like '%A%';
select * from emp where ename like '_A%';
insert into emp(empno,ename,sal) values(1000,'t_%test',8989);
insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);
select * from emp where ename like '%A%%' escape('A');
SELECT * FROM EMP WHERE SAL=1500 OR SAL=2000 OR SAL=2500 OR SAL=5000;
SELECT * FROM EMP WHERE SAL IN (1500, 2000, 2500, 5000);

–排序 order by 排序字段1 desc降序|asc升序默認,排序字段2…
–對結果集中的數據做排序

select * from emp where deptno = 30 order by sal desc;
select * from emp where deptno = 30 order by sal desc, empno desc;

數據結構知識點總結pdf、– 查詢所有員工信息, 按照獎金升序排序 null
–nulls first 所有的null值在最前,nulls last所有null值在最后

select *  from emp order by comm asc nulls first;

1.3、exists存在

–exists (結果集) 存在即保留,存在即合理
– 從 from后數據源中拿出每一條數據,判斷是否滿足where后的條件,如果是exists就判斷exists()中的結果集中是否存在數據,存在當前判斷的這條數據就滿足跳進,不存在就過濾
–執行流程 : from --> where --> select --> order by

select * from emp where exists (select * from dept);
select * from emp where exists (select * from emp where comm is not null);
select * from emp where exists (select * from dept where deptno in (10,30) and dept.deptno = emp.deptno);
select *from emp ewhere exists (select *from dept dwhere deptno in (10, 30)and d.deptno = e.deptno);
select *from emp ewhere exists (select deptno, dnamefrom dept dwhere dname in ('SALES', 'ACCOUNTING')and e.deptno = d.deptno);
select *from emp ewhere exists (select deptno, dnamefrom dept dwhere dname in ('SALES', 'ACCOUNTING')and e.deptno != d.deptno);

1.4、子查詢

select * from emp;
select * from emp where 1=1;

–子查詢 : 查詢語句嵌套查詢語句
–當條件與要查詢的數據在不同的數據源,而兩個數據源之間存在一定的關聯方式,可以子查詢中轉查詢

MySQL考試知識點。–部門名稱為 SALES 或 ACCOUNTING 的雇員信息
–數據 : 員工信息 *
–來源 : 員工表 emp
–條件 : dname in (‘SALES’,‘ACCOUNTING’)
–查詢 SALES 或 ACCOUNTING的部門編號

select deptno from dept where dname in ('SALES','ACCOUNTING');
--在10,30部門的員工信息
select * from emp where deptno in (10,30) ;
select *from empwhere deptno in(select deptno from dept where dname in ('SALES', 'ACCOUNTING'));

– 查詢工資等級為 2的員工信息
–數據 : 員工信息 *
–來源 : 員工表 emp
–條件 : 工資等級為 2
–查詢2等級的最低薪與最高薪

select losal from salgrade where grade = 2;
select hisal from salgrade where grade = 2;
select * from emp where sal between 1201 and 1400;
select *from empwhere sal between (select losal from salgrade where grade = 2) and(select hisal from salgrade where grade = 2);
select *from empwhere deptno = (select deptno from dept where dname = 'SALES')and sal > 1500;
select sal from emp where ename='SMITH';
select deptno from emp where ename='SMITH';
select *from empwhere sal > (select sal from emp where ename = 'SMITH')and deptno = (select deptno from emp where ename = 'SMITH');

1.5、單行函數

select sysdate from dual;
select current_date from dual;

– 日期可以直接±

select sysdate+2 from dual;
select ename,hiredate,hiredate+3 from emp;
select ename,hiredate,hiredate+90 from emp;
select ename,hiredate,add_months(hiredate,-3) from emp;
select ename,months_between(sysdate,hiredate) from emp;
-- trunc 取整
select ename,trunc(months_between(sysdate,hiredate)) from emp;
select ename,last_day(sysdate) from emp;
select next_day(sysdate,'星期四') from dual;
--to_char
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select sysdate,to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
--to_date
select sysdate,to_date('2022年02月23日','yyyy"年"mm"月"dd"日"') from dual;

–nvl(值1,值2) 對null值判斷
–判定函數 decode(判定字段,值1,結果1,值2,結果2…,默認值) 對判定字段的值進行判定,如果值為值1,函數的結果為結果1,與值2相等,函數的結果為結果2…最終如果以上都不相等,最終取默認值

select deptno,dname,loc,decode(deptno,10,'十',20,'二十',30,'三十','無') from  dept;
select deptno,dname,loc,(case deptno when 10 then '十' when 20 then '二十' else '無' end) from  dept;
select * from emp where hiredate between to_date('1982-1-1','yyyy-mm-dd') and to_date('1982-12-31','yyyy-mm-dd');
select * from emp where to_char(hiredate,'yyyy') = '1982';
select ename,sal,deptno,decode(deptno,20,sal*1.1,sal) 漲薪后 from emp;
select ename,sal,deptno,decode(deptno,10,sal*1.1,20,sal*1.2,30,sal*0.99,40,sal*3) 漲薪后 from emp;

1.6、聚合函數

– 組函數 |聚合函數 | 多行函數 :多條記錄返回一個結果
– 確定要計算的數據然后才能使用組函數,對結果集,分組
– count() sum() max() min() avg()

–注意: 如果select后面一旦出現組函數的使用,不能與非分組字段一起使用

select count(*) from emp;
select count(empno) from emp;
select count(deptno) from emp;
select count(1) from emp;
select count(1) from dept;
select count(distinct deptno) from emp;
select count(1) from emp where deptno = 20;
select sum(sal) from emp;
select max(sal),min(sal) from emp;
select max(sal),min(sal) from emp where deptno = 30;
select avg(sal) from emp where deptno = 20;
select sum(comm) from emp;

–null值不參與組函數計算

select count(comm) from emp where comm is not null;
select max(sal) from emp;
select ename,sal from emp where sal = (最高薪水);
select ename,sal from emp where sal = (select max(sal) from emp);
select empno,ename,sal from emp where sal<(select avg(sal) from emp);

–思考

select avg(sal) from emp where deptno = 10;
select *from emp e1where sal > (select avg(sal) from emp e2 where e2.deptno = e1.deptno);

1.7、分組

– 分組 : 根據指定的規則對數據進行分組
– group by 分組字段
– 語法: select 數據 from 數據源 where 行過濾條件 group by 分組 having 組過濾信息 order by 排序字段;
– 執行流程 : from -> where -> group by -> having -> select -> order by
– 如果 select后面一旦出現組函數,不能使用非分組字段
– 如果一旦分組,只能使用分組字段或者組函數
– where中不能使用字段別名,不能使用組函數,因為執行流程的問題

select deptno,avg(sal) from emp group by deptno;
select deptno,max(sal) from emp group by deptno;
select  deptno,max(sal) from emp where deptno in(20,30) group by deptno;
select  deptno,max(sal) from emp group by deptno having deptno in(20,30);
select avg(sal) from emp where sal>1000 and deptno in(10,20) group by deptno;
select avg(sal) from emp where sal>1000 group by deptno having deptno in(10,20);
select deptno,max(sal) from emp group by deptno;
select deptno,avg(sal) from emp group by deptno having  avg(sal)>2000;

– 查詢最低平均工資的部門編號

select deptno,avg(sal) from emp group by deptno;
select min(avg(sal)) from emp group by deptno;
select deptno,avg(sal) from emp group by deptno having avg(sal)=(最低平均工資);
select deptnofrom empgroup by deptno
having avg(sal) = (select min(avg(sal)) from emp group by deptno);
select deptno,count(1) n from emp  group by deptno order by n ;
select job,max(sal) from emp group by job;
select deptno,avg(sal) from emp group by deptno having avg(sal) between 1500 and 2000;

1.8、行轉列

/*
id name course score

1 張三 語文 81
2 張三 數學 75
3 李四 語文 81
4 李四 數學 90
5 王五 語文 81
6 王五 數學 100
7 王五 英語 90
create table tb_student(
id number(4) ,
name varchar2(20),
course varchar2(20),
score number(5,2)
);
insert into tb_student values(1,‘張三’,‘語文’,81);
insert into tb_student values(2,‘張三’,‘數學’,75);
insert into tb_student values(3,‘李四’,‘語文’,81);
insert into tb_student values(4,‘李四’,‘數學’,90);
insert into tb_student values(5,‘王五’,‘語文’,81);
insert into tb_student values(6,‘王五’,‘數學’,100);
insert into tb_student values(7,‘王五’,‘英語’,90);
commit;
drop table tb_student cascade constraints;
*/

select * from tb_student;

–使用一條sql語句,查詢每門課都大于80分的學生姓名
–數據 : name
–來源 : tb_student
–條件 : 所考課程數=課程總數 and 所有成績最小分數>80

select count(distinct course) from tb_student;select namefrom tb_studentgroup by name
having count(1) = (select count(distinct course) from tb_student) and min(score) > 80;
select name,decode(course, '語文', score) 語文,decode(course, '數學', score) 數學,decode(course, '英語', score) 英語from tb_student;select name,max(decode(course, '語文', score)) 語文,min(decode(course, '數學', score)) 數學,max(decode(course, '英語', score)) 英語from tb_student group by name;

1.9、連表查詢92

–表連接查詢 : 當要查詢的數據來自于多個數據源
–92 99
–92語法 select 數據 from 數據源1,數據源2… where 行過濾條件 group by 分組字段1,分組字段2… having 組過濾信息 order by 排序字段1,… desc|asc;
–執行流程 : from --> where --> group by --> having --> select --> order by

–笛卡爾積 : 交叉連接
–查詢所有員工的信息以及員工所在部門信息
–數據 : 員工信息* 部門信息*
–來源 : 員工表emp ,部門表 dept

select * from emp,dept;
select emp.*,dept.deptno,dept.dname from emp,dept;
select e.*,d.deptno,d.dname from emp e,dept d;

–表連接條件 : 過濾通過連表產生的不滿足要求的表連接數據
–等值連接 : 判斷兩個數據源中的某個字段值相等或者不相等
–非等值連接 : 判斷區間,判斷范圍的條件
–92語法中表 連接條件定義 在where后面
–如果要使用的字段來自于多個數據源中都存在,需要指明限定詞|出處

select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno=d.deptno;
select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno=d.deptno and e.deptno=20;

–非等值連接

select * from emp e,salgrade s where sal between losal and hisal;
select *from emp e, dept d, salgrade swhere e.deptno = d.deptnoand e.sal between s.losal and s.hisal;

–自連接 : 一張表作為兩個數據源使用
–查詢有上級的員工信息以及上級經理人信息
–數據 : 員工信息 經理人信息
–來源 : 員工表 emp e1 ,經理人表 emp e2

select * from emp e1,emp e2 where e1.mgr=e2.empno;

–內連接 : 滿足連接條件查詢到不滿足過濾掉
–外連接 : 某一個數據源中的數據不滿足連接條件的時候也能顯示
–左外連接 | 左連接 : from后面主表在左邊
–右外連接 | 右連接 : from后面主表在右邊
–主表 : 主表中的數據無論是否滿足連接條件都能顯示
–92語法 : 在連接條件位置,主表的對面添加(+)

–查詢所有員工信息以及上級經理人信息
–主表 : 員工表

select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
select * from emp e1,emp e2 where e1.mgr(+)=e2.empno;

1.10、連表查詢99

–連表查詢 99

–笛卡爾積 :

select * from emp,dept;
select * from emp cross join dept;

– 找出每個員工信息和所在部門信息

select ename,e.deptno,dname from emp e,dept d where e.deptno=d.deptno;

–99
–等值連接
–自然連接 : 自動做等值連接(同名字段|主外鍵字段) natural join
–注意: 在自然連接中同名字段的不能使用限定詞

select ename,deptno,dname from emp natural join dept;

–join …using(同名字段) 指定使用哪個同名字段做等值連接
–注意: 在join…using中同名字段的不能使用限定詞

select ename,deptno,dname from emp join dept using(deptno);

–既能夠做等值連接,也能做非等值連接
–數據源1 join 數據源2 on 連接條件;
–注意: 在join…on中同名字段的必須使用限定詞

select ename,e.deptno,dname from emp e join dept d on e.deptno = d.deptno;
select ename, e.deptno, dnamefrom emp ejoin dept don e.deptno = d.deptnowhere e.deptno = 30;

–非等值連接
– 查詢每個員工的工資,姓名,工種,工資等級

select ename,sal,job,grade from emp e join salgrade s on sal between losal and hisal;
select ename,sal,job,grade from emp e join salgrade s on sal between losal and hisal where deptno=20 and sal>1500;
select * from emp e1 inner join emp e2 on e1.mgr=e2.empno;
select *from emp e1join dept don e1.deptno = d.deptnojoin salgrade saon sal between losal and hisaljoin emp e2on e1.mgr = e2.empnowhere e1.deptno = 30order by e1.sal desc;

–內連接 : (inner) join
–外連接 : 主表中的數據無論是否滿足連接條件都顯示
–左外連接|左連接 : left join
–右外連接|右連接 : right join
–全連接 : 兩張表都是主表 full join
–所有員工存在的員工信息 與上級信息

–主表 : 員工

select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
select * from emp e1 right join emp e2 on e1.mgr=e2.empno;select * from emp e1 full join emp e2 on e1.mgr=e2.empno;

1.11、rowid 與rownum

–rowid與rownum
–偽列
–rowid行記錄的地址,行記錄的唯一標識
–實現沒有主鍵,唯一字段的表中完全相同數據的去重

select empno,ename,rowid from emp;

/* 測試數據
insert into tb_student values(1,‘張三’,‘語文’,81);
insert into tb_student values(2,‘張三’,‘數學’,75);
insert into tb_student values(3,‘李四’,‘語文’,81);
insert into tb_student values(4,‘李四’,‘數學’,90);
insert into tb_student values(5,‘王五’,‘語文’,81);
insert into tb_student values(6,‘王五’,‘數學’,100);
insert into tb_student values(7,‘王五’,‘英語’,90);
commit;
*/

SELECT * FROM TB_STUDENT;

–去重

SELECT DISTINCT ID,NAME,COURSE,SCORE FROM TB_STUDENT; --顯示去重
SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE; 
SELECT * FROM TB_STUDENT WHERE NOT ROWID IN (SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE);
DELETE FROM TB_STUDENT WHERE NOT ROWID IN (SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE);

–rownum : 結果集中行記錄的序號
–一個結果集就存在一份rownum
–rownum從1開始,每次+1,有規律,有順序

select deptno,dname,rownum from dept order by deptno desc;

–如果存在排序之后,rownum序號被打亂,可以在select外部再次嵌套select語句,外部的select語句的rownum就是有規律的,可以作為判斷使用的

select empno,ename,sal,n,rownum num from (select empno,ename,sal,rownum n from emp order by sal desc);

–在oracle數據庫中可以使用rownum實現分頁查詢

–如果想要對rownum進行判斷,需要針對一條已經確定的rownum進行判斷,解決方案,外部嵌套select

select empno,ename,sal,n,rownum num from (select empno,ename,sal,rownum n from emp order by sal desc);

–分頁 : 每頁顯示數據個數 n = 3 當前顯示第幾頁 i 起始位置rownum : rownum> (i-1)n; 結束位置rownum : rownum<=in

select *from (select empno, ename, sal, rownum numfrom (select empno, ename, sal, rownum n from emp order by sal desc))where num <= 6and num > 3;

1.12、表設計

–表設計
–明確表的作用 表名
—明確表中的字段
–字段名
–字段類型 : number char varchar2 date
–字段約束 :
–主鍵約束(唯一+非空)
–唯一約束
–非空約束
–默認約束
–檢查約束
–外鍵約束 Emp Dept
–涉及到兩張表
–父表|主表
–子表|從表 : 子表中添加一個外鍵字段,關聯主表的主鍵字段
–外鍵字段的值只能為主表中主鍵字段已有的值
select * from emp;
select * from dept;

–設計表的三范式 :
–最終的目的避免數據重復冗余
–1NF–>列不可再分最小原子 (避免重復);
–2NF–>主鍵依賴(確定唯一);
–3NF–>消除傳遞依賴(建立主外鍵關聯 拆分表);**

–分析 : 分析訂單模塊,使用 excel表格
– 訂單
– 用戶
– 商品

–表與表之間的關系 :
–一對一關系 : 用戶表 身份證信息表
–主外鍵關聯關系
–一對多|多對一 : 班級表 學生表
–主外鍵關聯關系 : 在多的一方設置外鍵,關聯一的一方的主鍵
–多對多 : 訂單與商品 學生與選課
–中間表 : 定義兩張表的關聯關系

1.13、DDL

–DDL 數據定義語言 了解能做修改
–create表創建 drop刪除表 alter修改表結構

–create表創建
–創建表(不加約束)

create table tb_user(userid number(5),username varchar2(30),userpwd varchar2(20),age  number(3) ,gender char(1 char) ,email  varchar2(30),regtime date
);

–數據類型(默認字節數) , varchar2(1 char)一個字符

comment on table tb_user is '用戶表';
comment on column tb_user.userid is '流水號,主鍵';
comment on column tb_user.username is '用戶名';
comment on column tb_user.userpwd is '密碼';
comment on column tb_user.age is '年齡';
comment on column tb_user.gender is '性別';
comment on column tb_user.email is '郵箱';
comment on column tb_user.regtime is '注冊日期';
--創建表(同時創建約束+默認名稱)
create table  tb_user(--主鍵約束userid number(5) primary key,--非空約束username varchar2(30) not null, --檢查約束 userpwd varchar2(20) check(length(userpwd) between 4 and 18), --默認約束  檢查約束age number(3) default(18) check(age>=18),--默認約束  檢查約束gender char(3) default('男') check(gender in('男','女')),--唯一約束email  varchar2(30) unique,--默認約束regtime date default(sysdate)
);
--創建表(同時創建約束+指定名稱) 在字段的后面指定約束名直接添加
create table  tb_user(--主鍵約束userid number(5) constraint pk_user primary key,--非空約束username varchar2(30) constraint nameNotNull not null, --檢查約束 userpwd varchar2(20) constraint ckPwd check(length(userpwd) between 4 and 18), --默認約束  檢查約束age number(3) default(18) constraint ck_age check(age>=18),--默認約束  檢查約束gender char(3) default('男') check(gender in('男','女')),--唯一約束email  varchar2(30) unique,--默認約束regtime date default(sysdate)
);
--創建表(同時創建約束+指定名稱) 在結構結束之前為當前表中指定字段添加約束
create table  tb_user(userid number(5),username varchar2(30),userpwd varchar2(20) constraint nn_user_pwd not null , age number(3) default(18) ,gender char(3) default('男'),email  varchar2(30),regtime date default(sysdate),constraint pk_user_id  primary key (userid),constraint name_not_null check(username is not null),constraint ck_user_name check(length(username)between 4 and 20) , constraint ck_user_pwd check(length(userpwd) between 4 and 18), constraint ck_user_age check(age>=18),constraint ck_user_gender  check(gender in('男','女')),constraint uq_user_email unique(email)
);
--追加約束
alter table tb_user add constraint pk_user_id  primary key (userid);
alter table tb_user add constraint ck_user_name check(length(username)between 4 and 20) ; 
alter table tb_user add constraint ck_user_pwd check(length(userpwd) between 4 and 18); 
alter table tb_user add constraint ck_user_age check(age>=18);
alter table tb_user add constraint ck_user_gender check(gender in('男','女')); 
alter table tb_user add constraint uq_user_email unique(email);
--默認與非空
alter table tb_user modify age default 18;
alter table tb_user modify username not null;--已有表中拷貝結構
--create table 表名 as select 字段列表 from 已有表 where 1!=1; 
--拷貝結構 emp
create table emp_his as select ename,sal from emp where 1!=1; 
--拷貝結構 emp +數據
create table emp_his2 as select ename,sal from emp where sal>2000;
--刪除表
drop table emp_his;
--主外鍵關系下的兩張表的刪除 : --刪除從表 : 直接刪除 drop table student--刪除主表 : 不能直接刪除    --1)先刪除所有從表,再刪除主表--2)刪除主表的同時級聯刪除主外鍵約束 drop table clazz cascade constraints;
drop table tb_txt cascade constraints;
drop table tb_user cascade constraints;
drop table student cascade constraints;
--外鍵約束
create table clazz(cid number(5)  primary key,cname varchar2(30)
)create table student(sid number(5)  primary key,sname varchar2(30) not null,--所在班級編號--外鍵約束-- 1)cid number(5) references clazz(cid)-- 2)cid number(5) constraint fk_cid references clazz(cid)cid number(5)--3) constraint fk_cid foreign key(cid) references clazz(cid) 
)
--4)
alter table student add constraint pk_stu_cid  foreign key(cid) references clazz(cid) ;--物理約束 :  表結構上為字段添加約束,推薦主外鍵約束可以定義物理約束
--邏輯約束 : 在后端邏輯代碼上添加判斷,邏輯,檢查等約束建議定義為邏輯約束--測試數據 
insert into tb_user values(111,null,'1234',18,'女','xxxx',sysdate);select * from student;--alter
--修改表名
rename student to haha_stu;

1.14、視圖與索引

–視圖與索引
–視圖 : 建立在結果集與表之間的虛擬表
–物理視圖 : 真是存儲數據
–邏輯視圖 : 不會真是存儲數據,數據來資源數據源
–簡化封裝sql

–權限問題 :
–登錄sys管理員賬號
–授權: grant dba to 賬戶名;
–回收: revoke dba from 賬戶名;

create or replace view vw_xixi_haha as select empno,ename,sal,deptno from emp with read only;

select * from vw_xixi_haha;

update emp set sal  = 1000 where empno = 7369;update vw_xixi_haha set sal  = 800 where empno = 7369;

–刪除視圖
drop view vw_xixi_haha;

–查詢每個部門的經理人平均薪資最小的部門名稱

select distinct mgr from emp where mgr is not null;
select deptno, avg(sal) avg_salfrom empwhere empno in (select distinct mgr from emp where mgr is not null)group by deptno;
select min(avg(sal))from empwhere empno in (select distinct mgr from emp where mgr is not null)group by deptno;
select deptnofrom (select deptno, avg(sal) avg_salfrom empwhere empno in (select distinct mgr from emp where mgr is not null)group by deptno)where avg_sal = (最小平均薪資);
select deptnofrom (select deptno, avg(sal) avg_salfrom empwhere empno in (select distinct mgr from emp where mgr is not null)group by deptno)where avg_sal =(select min(avg(sal))from empwhere empno in (select distinct mgr from emp where mgr is not null)group by deptno);
select dnamefrom deptwhere deptno =(select deptnofrom (select deptno, avg(sal) avg_salfrom empwhere empno in(select distinct mgr from emp where mgr is not null)group by deptno)where avg_sal =(select min(avg(sal))from empwhere empno in(select distinct mgr from emp where mgr is not null)group by deptno));create or replace view vw_mgr as select distinct mgr from emp where mgr is not null;
select * from vw_mgr; 
select dnamefrom deptwhere deptno = (select deptnofrom (select deptno, avg(sal) avg_salfrom empwhere empno in (select * from vw_mgr)group by deptno)where avg_sal = (select min(avg(sal))from empwhere empno in (select * from vw_mgr)group by deptno));

–索引 :
–提高查詢效率
–相當于目錄
–索引是透明的,一個字段上是否添加了索引對字段的使用沒有任何影響
–大數據量前提下,做查詢才會提高效率,如果頻繁做增刪,反而會降低效率,索引也是數據庫的對象之一,需要維護
–唯一性較好,少量修改,大量查詢適合添加索引
–oracle數據庫自動為主鍵添加索引

select * from emp where sal>1500;     
create index index_sal on emp(sal);
drop index index_sal;

1.15、事務與DML

–事務
–事務是指作為單個邏輯工作單元執行的一組相關操作。這些操作要求全部完成或者全部不完成。
–使用事務是為了保證數據的安全有效。
–要求了解: 什么是事務,事務作用,事務特點|特性,事務隔離級別,幻讀,臟讀…,事務的成功與失敗

–事務的開啟: 執行DML中的insert delete update默認開啟事務
–事務的結束 :
– 成功
–手動提交 :使用 commit
– 正常執行完成的 DDL 語句:create、alter、drop
– 正常執行完 DCL 語句 GRANT、REVOKE
– 正常退出的 SQLPlus 或者 SQL Developer 等客戶端
– 如果人工要使用隱式事務,SET AUTOCOMMIT ON (只針對一個連接)
– 失敗
–意外退出,強制斷電
–手動提交 :使用 rollback

insert into dept values(50,'后勤部','北京');
create table xixi(id number(5)
)select * from dept;
--insert
--insert into 表名 values(值列表);
insert into  dept values(60,'教學部','上海');
--insert into 表(指定列) values(值列表);
insert into dept(deptno,dname) values(70,'營銷部');
--insert into 表名 select 查詢列 from 源表 where 過濾數據; 
insert into emp_his2 select ename,sal from emp where deptno = 30;
--insert into 表(指定列) select 查詢列 from 源表 where 過濾數據; 
insert into emp_his2(ename) select ename from emp where deptno = 10;select * from dept;
select * from emp;
select * from emp_his2;delete from emp_his2;
--update 表名 set 字段=值 [,....] where  過濾行記錄;
update dept set loc='三亞' where deptno = 70;
update dept set dname='A'||dname,loc='青島' where deptno in (50,60,70);--update 表名 set (字段列表) =(select 字段列表 from 源表 where 過濾源表記錄) where 更新記錄的條件手動更改字段值:
update dept set (dname,loc) =(select ename,job from emp where empno=7369) where deptno in (50,60);
--刪除一個或多個或所有數據
--delete from 表名; 刪除一張表中所有數據
delete from emp_his2;
----delete from 表名 where 行過濾條件; 滿足條件的數據刪除
delete dept where deptno = 70;
--刪除主外鍵約束關系下的兩張表中的數據:--從表中的數據可以直接正常刪除 empdelete from emp where empno = 7369;--刪除主表中數據 : --主表中沒有被從表引用的數據,可以直接刪除delete from dept where deptno = 50;--主表中已被從表引用的數據,不能直接刪除delete from dept where deptno = 10;--解決方案: --1.刪除從表中引用了當前主表數據的那些從表刪除,然后再刪除當前主表數據->默認delete from emp where deptno = 10;delete from dept where deptno = 10;--2.刪除主表數據的同時,為從表所有引用了當前主表數據的那些從表數據的外鍵字段設置為null--需要為從表中外鍵字段設置約束的時候 on delete set nulldelete from clazz where cid = 55;--3.刪除主表數據的同時,直接刪除從表所有引用了當前主表數據的那些從表數據--需要為從表中外鍵字段設置約束的時候 on delete cascadedelete from clazz where cid = 55;
create table clazz(cid number(5)  primary key,cname varchar2(30)
);create table student(sid number(5)  primary key,sname varchar2(30) not null,--外鍵約束--cid number(5) references clazz(cid) on delete set nullcid number(5) references clazz(cid) on delete cascade
);
insert into clazz values(55,'java55');
insert into clazz values(54,'java54');insert into student values(1001,'zhangsan',55);
insert into student values(1002,'lisi',55);
insert into student values(1003,'wangwu',54);select * from clazz;
select * from student;drop table student;
drop table clazz;

1.16、序列與數據截斷

–數據截斷 :

create table tb_student(sid number(5)  primary key,sname varchar2(30) not null
);
truncate table tb_student;
select * from tb_student;

–與delete區別:
–數據截斷沒有事務管理,而delete可以通過事務管理
–數據截斷不能操作主表,從表結構上檢查如果存在從表,不能截斷 ,但是delete可以刪除,可能存在3種方案

       truncate table dept;

–序列 :
–工具 ,管理流水號
–管理類似主鍵字段的值,數值型的,有變化規律的
–序列沒有與表與字段綁定,序列的 刪除不影響之前的使用
–第一次使用序列需要先獲取下一個最新值

 create sequence seq_deptno start with 70  increment by 1; 
 select seq_deptno.currval from dual;
 select seq_deptno.nextval from dual;
 drop sequence seq_deptno;select * from dept;insert into dept values(seq_deptno.nextval,'','');

二 JDBC

2.1、JDBC的基本流程

_/*
JDBC基本流程:
1.加載驅動(選擇數據庫)
2.獲取連接(與數據庫建立連接)
3.準備SQL
4.構建處理塊(封裝發送SQL)
5.發送SQL,得到結果
6.處理結果
7.連接關閉
*/

_

public class Class001_JDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加載驅動(選擇數據庫)Class.forName("oracle.jdbc.driver.OracleDriver");//2.獲取連接(與數據庫建立連接)Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","SCOTT","TIGER");//3.準備SQLString sql = "SELECT * FROM DEPT";//4.構建處理塊(封裝發送SQL)Statement state = conn.createStatement();//5.發送SQL,得到結果ResultSet result = state.executeQuery(sql);//6.處理結果while(result.next()){int deptno = result.getInt(1);String dname = result.getString("dname");String loc = result.getString(3);System.out.println(deptno+"-->"+dname+"-->"+loc);}//7.連接關閉conn.close();}
}

2.2.1、JDBC流程優化

_/*
JDBC基本流程優化
1.異常的捕獲
2.軟編碼方式定義數據庫的參數信息
*/

_

public class Class002_JDBC {public static void main(String[] args) {Properties pro = new Properties();try {pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));} catch (IOException e) {e.printStackTrace();}//1.加載驅動(選擇數據庫)try {Class.forName(pro.getProperty("driver"));} catch (ClassNotFoundException e) {e.printStackTrace();}//2.獲取連接(與數據庫建立連接)Connection conn = null;Statement state = null;ResultSet result = null;try {conn = DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("username"),pro.getProperty("password"));//3.準備SQLString sql = "SELECT * FROM DEPT";//4.構建處理塊(封裝發送SQL)state = conn.createStatement();//5.發送SQL,得到結果result = state.executeQuery(sql);//6.處理結果while(result.next()){int deptno = result.getInt(1);String dname = result.getString("dname");String loc = result.getString(3);System.out.println(deptno+"-->"+dname+"-->"+loc);}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7.關閉if(result!=null){try {result.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(state!=null){try {state.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}}
}

2.2.1.1、db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=SCOTT
password=TIGER

2.2.2、封裝工具類-JDBCUtils

_/*
JDBC封裝工具類
加載驅動
獲取連接
資源關閉
*/

_

public class JDBCUtils {private static Properties pro = new Properties();static{//加載流try {pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));} catch (IOException e) {e.printStackTrace();}//加載驅動try {Class.forName(pro.getProperty("driver"));} catch (ClassNotFoundException e) {e.printStackTrace();}}//獲取連接public static Connection getConnection() throws SQLException {Connection conn = null;conn = DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("username"),pro.getProperty("password"));return conn;}//關閉資源public static void close(Connection conn, Statement state){close(conn,state,null);}public static void close(Connection conn, Statement state, ResultSet result){if(result!=null){try {result.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(state!=null){try {state.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

2.3、用戶基本操作

_/*
用戶基本操作:
用戶注冊 insert
用戶登錄 select
根據用戶名與密碼同時查找,找到結果返回true,沒找到結果返回false
根據用戶名查找,找到密碼與用戶號輸入的密碼比較是否相等,返回true|false
修改用戶數據 update
注銷用戶 delete

注意: 事務默認自動提交預處理塊:1.預先編譯,提高效率2.防止SQL注入sql語句不是通過字符串的連接符直接拼接,而是通過預處理塊內部拼接,拼接之前檢查傳入的數據注意: 建議使用預處理塊代替靜態處理塊

*/

_

public class Class003_User {public static void main(String[] args) {System.out.println(login("zhangsan","1234")?"成功":"失敗");;}//登錄//預處理塊 PreparedStatementpublic static boolean login(String username,String password){boolean flag = false;Connection conn = null;PreparedStatement state = null;ResultSet result = null;//1.獲取連接try {conn = JDBCUtils.getConnection();//2.準備sqlString sql = "select * from t_user where username=? and password =?";//3.構建預處理塊state = conn.prepareStatement(sql);//4.為?賦值state.setString(1,username);state.setObject(2,password);//5.執行,得到結果result = state.executeQuery();//5.處理結果if(result.next()){flag = true;}}catch(SQLSyntaxErrorException e){System.out.println("遇到SQL注入了....");} catch (SQLException throwables) {throwables.printStackTrace();} finally {//6.關閉資源JDBCUtils.close(conn,state,result);}//7.返回結果return flag;}//靜態處理塊 Statement/*public static boolean login(String username,String password){boolean flag = false;Connection conn = null;Statement state = null;ResultSet result = null;//1.獲取連接try {conn = JDBCUtils.getConnection();//2.準備sqlString sql = "select * from t_user where username='"+username+"' and password = "+password;//3.封裝處理塊state = conn.createStatement();//4.執行,得到結果result = state.executeQuery(sql);//5.處理結果if(result.next()){flag = true;}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//6.關閉資源JDBCUtils.close(conn,state,result);}//7.返回結果return flag;}*///注冊public static boolean reg(String username,String password){boolean flag = false;Connection conn = null;Statement state = null;//1.獲取連接try {conn = JDBCUtils.getConnection();//2.準備sqlString sql = "insert into t_user values('"+username+"',"+password+")";//3.封裝處理塊state = conn.createStatement();//4.執行,得到結果int rows = state.executeUpdate(sql);//5.處理結果if(rows>0){flag = true;}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//6.關閉資源JDBCUtils.close(conn,state);}//7.返回結果return flag;}
}

2.4應用實例

_/*
轉賬操作
A --> SAL-500
B --> SAL+500
需要控制在同一個事務中,設置手動提交,校驗之后提交或者回滾
*/

_

public class Class004_Transfer {public static void main(String[] args) {System.out.println(transfer());;}//預處理塊 PreparedStatementpublic static boolean transfer(){boolean flag = false;Connection conn = null;PreparedStatement state1 = null;PreparedStatement state2 = null;//1.獲取連接try {conn = JDBCUtils.getConnection();//設置手動提交conn.setAutoCommit(false);//2.準備sqlString sql1 = "update emp set sal=sal-500 where empno =7499";String sql2 = "update emp set sal=sal+500 where empno =7369";//3.構建預處理塊state1 = conn.prepareStatement(sql1);state2 = conn.prepareStatement(sql2);//4.為?賦值//5.執行,得到結果int rows1 = state1.executeUpdate();int rows2 = state2.executeUpdate();//5.處理結果if(rows1>0 && rows2>0){flag = true;conn.commit();}else{conn.rollback();}}catch(SQLSyntaxErrorException e){System.out.println("遇到SQL注入了....");} catch (SQLException throwables) {throwables.printStackTrace();}//7.返回結果return flag;}
}

三 mybatis

3.1、核心配置文件

<?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><!-- 加載外部的properties文件 --><properties resource="db.properties" /><!-- settings標簽 --><settings><!-- 設置MyBatis使用log4j日志支持 --><setting name="logImpl" value="LOG4J"/></settings><!--用于指定使用哪一個開發環境default : 用于指定使用的環境的id屬性值--><environments default="dev"><!--environment : 用于配置開發環境id : 環境的唯一標識--><environment id="dev"><!--transactionManager 事務管理器type="JDBC" 采用jdbc相同的事務管理機制--><transactionManager type="JDBC"/><!--dataSource : 用來配置數據庫連接參數type="POOLED" 采用連接池技術--><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/><property name="username" value="SCOTT"/><property name="password" value="YJXXT"/></dataSource></environment></environments><!--掃描SQL映射文件--><mappers><mapper resource="com/yjxxt/mappers/DeptMapper.xml"/></mappers>
</configuration>

配置typeAliases標簽

9.1. 使用方式
9.1.1. 給User類定義別名為u
9.1.2. 省略alias屬性, 表示類別名為類名, 大小寫不敏感
9.1.3. 可以通過package標簽給整個包下的所有類定義別名,別名為類名
9.2. Mybatis的內建別名
下面是一些為常見的 Java 類型內建的類型別名。它們都是不區分大小寫的,注意,為了應對原始類型的
命名重復,采取了特殊的命名風格。
<typeAliases>
<typeAlias type="com.yjxxt.pojo.User" alias="u"/>
</typeAliases>
<typeAliases>
<typeAlias type="com.yjxxt.pojo.User"/> alias屬性不寫,默認類名,不區分大小寫
</typeAliases>
<typeAliases>
<package name="com.yjxxt.pojo"/> <!-- 包下所有的類默認類名 -->
</typeAliases>
<select id="queryAll" resultType="u">
select id,uname,upwd,birthday from t_user
</select>
<select id="queryById" resultType="User">
select id,uname,upwd,birthday from t_user where id=125
</select>

3.2、log4j日志

# Set root category priority to INFO and its only appender to CONSOLE.
# log4j.rootCategory=DEBUG, CONSOLE
log4j.rootCategory=INFO, CONSOLE, LOGFILE# 單獨設置SQL語句輸出級別為DEBUG
# 方法級別設置(SQL語句)
# log4j.logger.com.yjxxt.mappers.DeptMapper.queryDept=DEBUG
# 類級別設置(SQL映射文件)
# log4j.logger.com.yjxxt.mappers.DeptMapper=DEBUG
# 類級別設置(SQL映射文件)
log4j.logger.com.yjxxt.mappers=DEBUG# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=- %m %n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender 
log4j.appender.LOGFILE.File=d:/test.log 
log4j.appender.LOGFILE.Append=true 
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l %n

3.3.1、IDEA實體類映射表


public class Dept {private int deptno;private String dname;private String loc;public Dept() {}public Dept(int deptno, String dname, String loc) {this.deptno = deptno;this.dname = dname;this.loc = loc;}public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}@Overridepublic String toString() {return "Dept{" +"deptno=" + deptno +", dname='" + dname + '\'' +", loc='" + loc + '\'' +'}';}
}

3.3.2、SQL映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 命名空間要求 : 唯一的,SQL映射文件的唯一標識定義方式 :1.隨意定義,只要不重復即可,不推薦,不便于后期維護2.推薦使用包名.文件名 -> 推薦
-->
<mapper namespace="com.yjxxt.mappers.DeptMapper"><!--select 定義查詢語句id : 唯一標識,一個命名空間下的唯一resultType : 結果類型parameterType : 入參類型--><select id="queryDept" resultType="com.yjxxt.pojo.Dept">select * from dept</select><!--根據部門編號查詢部門信息--><select id="queryDeptById" resultType="com.yjxxt.pojo.Dept" parameterType="int">SELECT * FROM DEPT WHERE DEPTNO = #{ID}</select><!--根據部門位置查詢部門信息--><select id="queryDeptByLoc" resultType="com.yjxxt.pojo.Dept" parameterType="String">SELECT * FROM DEPT WHERE LOC = #{LOC}</select>
</mapper>

3.3.3、測試

//測試類
/*Mybatis環境搭建步驟 :1.新建項目,項目下新建目錄lib,涉及到的jar包放入lib目錄下,右鍵add as lib..mybatis核心jar包mybatis依賴的jar包數據庫的驅動包2.編寫核心配置文件3.編寫SQL映射文件,編寫實體類4.測試*/
public class Class001_Dept {public static void main(String[] args) throws IOException {//1.加載核心配置文件InputStream is = Resources.getResourceAsStream("mybatis.xml");//2.構建SqlSessionFactory實例SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.獲取會話SqlSession session = factory.openSession();//4.執行sql//selectList("命名空間.id")List<Dept> list = session.selectList("com.yjxxt.mappers.DeptMapper.queryDept");list.forEach(System.out::println);//5.關閉會話session.close();}
}

3.3.a、執行流程

mybatis.xml->②實體類->③映射實體類的Mapper.xml->④測試類

①mybatis.xml

1.根元素約束
2.a.加載外部properties文件
2.b.設置log4j日志設置項
3.選擇開發環境
4.配置數據庫連接參數
5.掃描SQL映射文件
(注:
最好復制粘貼
減少手寫錯誤
每條路徑都需要準確且都能查詢到,否則報錯無法向下執行)

實體類

1.公共的類、私有的屬性、公共的訪問方式、重寫toString等

映射實體類的Mapper.xml

1.與①相同的根約束
2.設置命名空間 包名.文件名
3.定義查詢語句等
3.1. id=“query表名(by表頭)”
3.2. resultType=“實體類的路徑地址”
3.3. parameterType=“表頭下字段對應的數據類型”

eg.<select id="queryDeptByLoc" resultType="com.yjxxt.pojo.Dept" parameterType="String">SELECT * FROM DEPT WHERE LOC = #{LOC}</select>

測試類

1.a. 加載核心配置文件
InputStream is = Resources.getResourceAsStream(“mybatis.xml”);
1.b. 構建SqlSessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
1.c. 獲取會話
SqlSession session=factory.openSession();
2. 執行sql
List list = session.selectList(“com.yjxxt.mappers.DeptMapper.queryDept”);
list.forEach(System.out::println);
3. 關閉會話
session.close();

3.3.4、3個查詢方法

/*測試3個查詢方法 :- selectList("命名空間.id")  用戶查詢多條數據情況,返回一個List集合, 沒有查到數據返回空集合,不是null- selectOne("命名空間.id") 用于查詢單條數據,返回一個數據, 如果沒有查到返回null- selectMap("命名空間.id",key的字段名) 用于查詢多條記錄情況,  返回Map集合, 需要指定那個屬性作為key, sql查詢結果作為value,指定的字段值作為key, 如果查不到, 返回一個空map集合,不是null*/
public class Class002_Method {public static void main(String[] args) throws IOException {//1.加載核心配置文件InputStream is = Resources.getResourceAsStream("mybatis.xml");//2.構建SqlSessionFactory實例SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.獲取會話SqlSession session = factory.openSession();//4.執行sql//selectList("命名空間.id")List<Dept> list = session.selectList("com.yjxxt.mappers.DeptMapper.queryDept");list.forEach(System.out::println);System.out.println("--------------------------------------------------");//selectList("命名空間.id",入參)List<Dept> list2 = session.selectList("com.yjxxt.mappers.DeptMapper.queryDeptByLoc","NEW YORK");list2.forEach(System.out::println);System.out.println("--------------------------------------------------");//selectOne("命名空間.id")//selectOne("命名空間.id",入參)Dept dept = session.selectOne("com.yjxxt.mappers.DeptMapper.queryDeptById",10);System.out.println(dept);System.out.println("--------------------------------------------------");//selectMap("命名空間.id","作為key的字段名")//selectMap("命名空間.id",入參,"作為key的字段名")Map<Integer,Dept> map = session.selectMap("com.yjxxt.mappers.DeptMapper.queryDeptByLoc","NEW YORK","deptno");System.out.println(map);//5.關閉會話session.close();}
}

3.3.5、封裝工具類-SessionUtils

/*封裝獲取會話的工具類*/
public class SessionUtils {private static SqlSessionFactory factory = null;static{try {factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSession(){SqlSession session = null;if(factory!=null){session = factory.openSession(); //手動提交//session = factory.openSession(true); //自動提交}return session;}
}

3.3.5a、測試類

/*測試工具類的使用*/
public class Class003_Test {public static void main(String[] args) throws IOException {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.執行sql//selectList("命名空間.id")List<Dept> list = session.selectList("com.yjxxt.mappers.DeptMapper.queryAll");list.forEach(System.out::println);//3.關閉會話session.close();}
}

3.3.5b、測試增刪改

對Dept表:

①mybatis無變化

②實體類無變化

③映射項

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--測試增刪改查selectinsertupdatedelete注意: 增刪改結果類型默認影響函數
-->
<mapper namespace="com.yjxxt.mappers.DeptMapper"><!--查詢所有部門信息--><select id="queryAll" resultType="dept">SELECT * FROM DEPT</select><!--新增一條部門數據--><insert id="insertDept" parameterType="Dept">insert into dept values(#{deptno},#{dname},#{loc})</insert><!--根據部門編號修改部門名稱--><update id="updateDept" parameterType="Dept">update dept set dname=#{dname} where deptno = #{deptno}</update><!--根據部門編號刪除部門信息--><delete id="deleteDept" parameterType="int">delete from dept where deptno = #{deptno}</delete>
</mapper>

④測試類

/*測試增刪改事務 :需要手動提交的 : 需要通過session設置提交|回滾 --> 默認手動提交設置自動提交 factory.openSession(true);*/
public class Class004_CRUD {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.執行sql//insert/*int rows = session.insert("com.yjxxt.mappers.DeptMapper.insertDept",new Dept(80,"網管部2","北京"));System.out.println(rows);*///update//int rows = session.update("com.yjxxt.mappers.DeptMapper.updateDept",new Dept(80,"網管部2222","北京"));//deleteint rows = session.delete("com.yjxxt.mappers.DeptMapper.deleteDept",80);if(rows>0){session.commit(); //事務提交}else{session.rollback(); //回滾}//3.關閉會話session.close();}
}

對EMP表:

(前面步驟相同省略)

/*測試入參類型*/
public class Class002_Param {public static void main(String[] args) throws IOException, ParseException {//1.獲取SqlSessionSqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession();//2.執行sql//基本數據類型|包裝類 : 根據員工編號查詢員工信息Emp emp = session.selectOne("com.yjxxt.mappers.EmpMapper.queryEmpById",7369);System.out.println(emp);System.out.println("----------------------------");//String : 根據員工姓名查詢員工信息List<Emp> list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpByName","SMITH");list.forEach(System.out::println);System.out.println("----------------------------");//Date : 根據員工入職日期查詢員工信息list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpByDate",new SimpleDateFormat("yyyy/MM/dd").parse("1981/12/3"));list.forEach(System.out::println);System.out.println("----------------------------");//Javabean : 根據員工姓名與員工的薪資查詢員工信息Emp e = new Emp();e.setDeptno(8888);e.setEname("SMITH");e.setSal(800);list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpByNameSal",e);list.forEach(System.out::println);System.out.println("----------------------------");//Map : 根據員工薪資與員工的部門編號查詢員工信息Map map = new HashMap<>();map.put("deptno",10);map.put("sal",1500);list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpBySalDeptno",map);list.forEach(System.out::println);System.out.println("----------------------------");//Map : 根據員工薪資與員工的部門編號查詢員工信息int[] arr = {7369,7499,9999};list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpByNoSome",arr);list.forEach(System.out::println);//3.關閉會話session.close();}
}

3.3.5c、測試結果類型

①mybatis文件中增加掃描項

<mappers><mapper resource="com/yjxxt/mappers/EmpMapper.xml"/> --增加
</mappers>

②實體類

public class Emp {private int empno;private String ename;private int mgr;private String job;private Date hiredate;private double comm;private double sal;private int deptno;public Emp() {}public Emp(int empno, String ename, int mgr, String job, Date hiredate, double comm, double sal, int deptno) {this.empno = empno;this.ename = ename;this.mgr = mgr;this.job = job;this.hiredate = hiredate;this.comm = comm;this.sal = sal;this.deptno = deptno;}public int getEmpno() {return empno;}public void setEmpno(int empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public int getMgr() {return mgr;}public void setMgr(int mgr) {this.mgr = mgr;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public double getComm() {return comm;}public void setComm(double comm) {this.comm = comm;}public double getSal() {return sal;}public void setSal(double sal) {this.sal = sal;}public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", mgr=" + mgr +", job='" + job + '\'' +", hiredate=" + hiredate +", comm=" + comm +", sal=" + sal +", deptno=" + deptno +'}';}
}

③映射項

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--測試結果類型 : resultType基本數據類型|包裝類  String Date Javabean  Map  List  List<Map>注意: 返回List集合,resultType定義集合的泛型類型
-->
<mapper namespace="com.yjxxt.mappers.EmpMapper"><!--基本數據類型|包裝類 : 根據員工編號查詢員工薪資--><select id="querySalByNo" parameterType="int" resultType="double">select sal from emp where empno = #{empno}</select><!--String : 根據員工編號查詢員工姓名--><select id="queryNameByNo" parameterType="int" resultType="String">select ename from emp where empno = #{empno}</select><!--Date : 根據員工編號查詢員工入職日期--><select id="queryDateByNo" parameterType="int" resultType="date">select hiredate from emp where empno = #{empno}</select><!--Map : 根據員工編號查詢員工信息--><select id="queryEmpByNo" parameterType="int" resultType="map">select * from emp where empno = #{empno}</select><!--List<Map> : 根據員工姓名模糊查詢--><select id="queryEmpByNameLike" parameterType="String" resultType="map">select * from emp where ename like '%'||#{ename}||'%'</select>
</mapper>

④測試類

/*測試結果類型*/
public class Class001_Result {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.執行sql//基本數據類型|包裝類/*double sal = session.selectOne("com.yjxxt.mappers.EmpMapper.querySalByNo",7369);System.out.println(sal);*///String/*String name = session.selectOne("com.yjxxt.mappers.EmpMapper.queryNameByNo",7369);System.out.println(name);*///Date/*Date date = session.selectOne("com.yjxxt.mappers.EmpMapper.queryDateByNo",7369);System.out.println(date);*///Map/*Map<String,Object> map = session.selectOne("com.yjxxt.mappers.EmpMapper.queryEmpByNo",7369);System.out.println(map);*///List<Map>List<Map<String,Object>> list = session.selectList("com.yjxxt.mappers.EmpMapper.queryEmpByNameLike","A");list.forEach(System.out::println);//3.關閉會話session.close();}
}

3.3.6、接口綁定方案

以下實現接口時默認已經以javabean規范創建了與表對應的實體類
接口的命名與映射文件一致 (表名Mapper.java | 表名Mapper.xml)
實體類命名與對應表名一致 (表名.java)
Dept類

public class Dept {private int id;private String name;private String loc;public Dept() {}public Dept(int id, String name, String loc) {this.id = id;this.name = name;this.loc = loc;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}@Overridepublic String toString() {return "Dept{" +"id=" + id +", name='" + name + '\'' +", loc='" + loc + '\'' +'}';}
}

Emp類

public class Emp {private int empno;private String ename;private double sal;private String job;private double comm;private int mgr;private Date hiredate;private int deptno;//屬性: javabean : 員工對象所在的部門信息private Dept pddDept;public Emp() {}public Emp(int empno, String ename, double sal, String job, double comm, int mgr, Date hiredate, int deptno) {this.empno = empno;this.ename = ename;this.sal = sal;this.job = job;this.comm = comm;this.mgr = mgr;this.hiredate = hiredate;this.deptno = deptno;}public Dept getPddDept() {return pddDept;}public void setPddDept(Dept pddDept) {this.pddDept = pddDept;}public int getEmpno() {return empno;}public void setEmpno(int empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public double getSal() {return sal;}public void setSal(double sal) {this.sal = sal;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public double getComm() {return comm;}public void setComm(double comm) {this.comm = comm;}public int getMgr() {return mgr;}public void setMgr(int mgr) {this.mgr = mgr;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", sal=" + sal +", job='" + job + '\'' +", comm=" + comm +", mgr=" + mgr +", hiredate=" + hiredate +", deptno=" + deptno +", pddDept=" + pddDept +'}';}
}

3.3.6.1、實現方式

1)同名接口

/*接口綁定方案下的接口 :*/
public interface DeptMapper {// 查詢所有的部門信息public List<Dept> queryAll();
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--1.接口與SQL映射文件名字要保持一致,并放在同一個包下2.SQL映射文件的命名空間namespace定義為與之綁定的接口的包名.類名3.SQL標簽的id屬性值與接口中所對應的抽象方法的方法名保持一致4.SQL語句的參數與返回值要求與對應的抽象方法的參數與返回值保持一致
-->
<mapper namespace="com.yjxxt.mappers.DeptMapper"><!--查詢所有的部門信息--><select id="queryAll" resultType="Dept">select * from dept</select>
</mapper>

3)mybatis添加項

<!--掃描接口 : 接口綁定方案-->
<mappers><!--<mapper class="com.yjxxt.mappers.DeptMapper"/><mapper class="com.yjxxt.mappers.EmpMapper"/>--><package name="com.yjxxt.mappers"/>  <!--包掃描-->
</mappers>

4)接口測試類

/*測試接口綁定方案步驟 :1.定義接口,定義抽象功能2.定義與接口綁定的SQL文件,定義SQL語句,按照要求進行定義3.核心配置文件中通過Mapper掃描接口4.在java代碼中通過獲取接口實現類對象調用功能*/
public class Class001_InterfaceBind {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.獲取接口實現類對象--> 指定哪一個接口DeptMapper mapper = session.getMapper(DeptMapper.class); 	//(接口名.class)//3.調用方法List<Dept> list = mapper.queryAll();list.forEach(System.out::println);//4.關閉會話session.close();}
}

3.3.6.2、測試有參查詢

1)同名接口

//測試帶有參數的查詢
public interface EmpMapper {//根據員工編號查詢員工信息Emp queryEmpById(int empno);//根據薪資與部門一起查詢List<Emp> queryEmpBySalDeptno(@Param("sal") double sal,@Param("dno") int deptno);
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--測試帶有參數的查詢
-->
<mapper namespace="com.yjxxt.mappers.EmpMapper"><!--根據員工編號查詢員工信息--><select id="queryEmpById" resultType="emp" parameterType="int">select * from emp where empno = #{empno}</select><!--根據薪資與部門一起查詢--><select id="queryEmpBySalDeptno" resultType="Emp"><!--sql中如果出現多參數傳遞,可以實現,默認占位符的名字為 : [arg0,arg1|param1,param2]--><!--select * from emp where sal > #{arg0} and deptno = #{arg1}--><!--select * from emp where sal > #{param1} and deptno = #{param2}-->select * from emp where sal > #{sal} and deptno = #{dno}</select>
</mapper>

3)mybatis添加項

采用包掃描時同包下的文件都會錄入,無需修改

4)接口測試類

/*測試有參數的查詢*/
public class Class002_Param {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.獲取接口實現類對象--> 指定哪一個接口EmpMapper mapper = session.getMapper(EmpMapper.class);//3.調用方法//1個參數Emp emp = mapper.queryEmpById(7369);System.out.println(emp);System.out.println("-----------------------");//多個參數List<Emp> list = mapper.queryEmpBySalDeptno(1500,30);list.forEach(System.out::println);//4.關閉會話session.close();}
}

3.3.6.3、測試接口下實現CRUD

1)同名接口

/*接口綁定方案下實現CRUD :*/
public interface DeptMapper2 {//插入一個新的部門信息int insertDept(Dept dept);//根據部門編號修改部門名稱int updateDept(@Param("deptno") int deptno, @Param("dname") String dname);//根據部門編號刪除int deleteDept(int deptno);
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--接口綁定方案下實現CRUD
-->
<mapper namespace="com.yjxxt.mappers.DeptMapper2"><!--插入一個新的部門信息--><insert id="insertDept" parameterType="dept">insert into dept values(#{deptno},#{dname},#{loc})</insert><!--根據部門編號修改部門名稱--><update id="updateDept">update dept set dname = #{dname} where deptno = #{deptno}</update><!--根據部門編號刪除--><delete id="deleteDept" parameterType="int">delete from dept where deptno = #{deptno}</delete>
</mapper>

3)mybatis添加項

采用包掃描時同包下的文件都會錄入,無需修改

4)接口測試類

/*接口綁定方案下實現CRUD*/
public class Class002_Update {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.獲取接口實現類對象--> 指定哪一個接口DeptMapper2 mapper = session.getMapper(DeptMapper2.class);//3.調用方法//1個參數//int rows = mapper.insertDept(new Dept(66,"六部","上海"));//int rows = mapper.updateDept(66,"六六六部");int rows = mapper.deleteDept(66);System.out.println(rows>0?"操作成功":"失敗");//4.關閉會話session.close();}
}

3.3.6.4、測試接口下實現動態Sql

1)同名接口

/*測試動態SQL*/
public interface EmpMapper {/*兩個參數的實參都無效,查詢所有員工信息如果員工姓名參數有效,部門編號無效,根據員工姓名查詢員工信息如果員工姓名參數無效,部門編號有效,根據員工部門編號查詢員工信息如果兩個參數有效,根據員工姓名以及部門編號一起查詢員工信息參數無效 : =null | =''|=0*/List<Emp> queryEmp(@Param("ename") String ename,@Param("deptno") int deptno);/*兩個參數都無效,查詢所有的員工信息如果員工編號有效,無論員工姓名是否否有效,都只根據員工編號查詢如果員工編號無效,員工姓名有效,根究員工姓名查詢*/List<Emp> queryEmpByIdName(@Param("empno") int empno,@Param("ename") String ename);//根據員工編號修改員工姓名,如果存在有效的員工薪資,修改姓名與薪資int updateEmp(Emp emp);//根據員工姓名模糊查詢員工信息List<Emp> queryEmpByNameLike(String ename);//根據多個員工編號查詢員工信息List<Emp> queryEmpByIdSome(List<Integer> list);
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--測試帶有參數的查詢
-->
<mapper namespace="com.yjxxt.mappers.EmpMapper"><!--封裝--><sql id="empField">empno,ename,hiredate,job,sal,comm,deptno</sql><!--if..while--><select id="queryEmp" resultType="emp">select * from emp <!--where 1=1--><!--where : 代替恒等式 where 1=1在有條件的時候回自動在當前select語句中拼接where關鍵字在沒有條件的時候,不會拼接where關鍵字--><where><!--if 標簽用戶做條件判斷test : 用于設置判斷條件,類似if語句的()會自動幫助把第一個滿足條件的if標簽中的and關鍵字去掉--><if test="ename!=null and ename!=''">and ename=#{ename}</if><if test="deptno!=0">and deptno=#{deptno}</if></where></select><!--choose...when...otherwise--><select id="queryEmpByIdName"  resultType="emp">select * from emp<where><choose> <!--相當于switch--><when test="empno!=0"> <!--case-->and empno = #{empno}</when><when test="ename!=null and ename!=''"> <!--case-->and ename=#{ename}</when></choose></where></select><!--set--><!--<update id="updateEmp" parameterType="Emp">update emp&lt;!&ndash;set :用戶維護epdate語句的set自語句,與where標簽類似如果滿足條件,自動添加set關鍵字如果不滿足,不拼接set如果最后一個自語句存在多余的,會自動去掉多余的逗號,&ndash;&gt;<set>ename = #{ename},<if test="sal!=0">sal=#{sal}</if></set>where empno = #{empno}</update>--><!--trim--><update id="updateEmp" parameterType="Emp">update emp<!--trim1. prefix, 在前面添加內容2. prefixOverrides, 從前面去除內容3. suffix, 向后面添加內容4. suffixOverrides, 從后面去除內容--><trim prefix="set" suffixOverrides=",">ename = #{ename},<if test="sal!=0">sal=#{sal}</if></trim>where empno = #{empno}</update><!--bind--><select id="queryEmpByNameLike" parameterType="string" resultType="emp"><bind name="ename" value="'%'+ename+'%'"/>select empno,ename,hiredate,job,sal,comm,deptno from emp where ename like #{ename}</select><!--foreach--><select id="queryEmpByIdSome" resultType="emp">select <include refid="empField"/> from emp where empno in<foreach collection="list" item="item" separator="," open="(" close=")">#{item}</foreach></select>
</mapper>

3)mybatis添加項

采用包掃描時同包下的文件都會錄入,無需修改
_
_
_
_

4)接口測試類

/*測試動態SQL*/
public class Class001_IfWhile {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.獲取接口實現類對象--> 指定哪一個接口EmpMapper mapper = session.getMapper(EmpMapper.class);//3.調用方法//List<Emp> list = mapper.queryEmp("",0);//List<Emp> list = mapper.queryEmpByIdName(0,"");//list.forEach(System.out::println);/*Emp emp = new Emp();emp.setEmpno(9999);emp.setEname("SMITH");mapper.updateEmp(emp);*//*List<Emp> list = mapper.queryEmpByNameLike("A");list.forEach(System.out::println);*/List<Emp> list = mapper.queryEmpByIdSome(List.of(7369,7499));list.forEach(System.out::println);//4.關閉會話session.close();}
}

3.3.6.5、單表查詢時字段名與屬性名不一致

1)同名接口

/*測試字段名與屬性名不一致情況*/
public interface DeptMapper {List<Dept> queryAll();
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--測試字段名與屬性名不一致情況如果查詢時使用 resultType 屬性, 表示采用 MyBatis 的Auto-Mapping(自動映射)機制, 即相同的列名(結果集中的字段名)和屬性名會自動匹配.1)通過resultMap標簽自定義表與javabean類型的映射情況不同名的字段必須手動設置映射關系同名的字段可以不設置,默認會根據自動映射機制找同名2)為字段起別名要求字段的別名與類型對應的屬性名保持一致
-->
<mapper namespace="com.yjxxt.mappers.DeptMapper"><!--方法一、自定義結果的映射關系--><resultMap id="deptMap" type="Dept"><!--id : 定義主鍵字段與屬性的映射關系--><id column="deptno" property="id"/><!--id : 定義非主鍵字段與屬性的映射關系--><result column="dname" property="name" /><!--<result column="loc" property="loc" />--></resultMap><!--resultMap--><!--<select id="queryAll" resultMap="deptMap">select * from dept</select>--><!--方法二、別名實現--><select id="queryAll" resultType="dept">select deptno id,dname name,loc from dept</select>
</mapper>

3)核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--根元素-->
<configuration><!-- 加載外部的properties文件 --><properties resource="db.properties" /><!--為類型定義別名--><typeAliases><package name="com.yjxxt.pojo"/></typeAliases><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--定義數據庫的連接參數--><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--掃描接口綁定方案--><mappers><!--掃描一個指定的接口--><!--<mapper class="com.yjxxt.mappers.DeptMapper"/>--><!--掃描一個包下的所有接口--><package name="com.yjxxt.mappers"/></mappers>
</configuration>

4)接口測試類

/*測試字段名與屬性名不一致情況*/
public class Class001_Test {public static void main(String[] args) throws IOException {//獲取回話SqlSession session = SessionUtils.getSession();//獲取接口的實現類對象DeptMapper mapper = session.getMapper(DeptMapper.class);//通過實現類對象調用重寫后的方法List<Dept> list = mapper.queryAll();//關閉回話session.close();}
}

3.3.6.6、多表查詢時字段名與屬性名不一致(一對一|多對一)

第一步:對一個實體類的私有屬性設置為javabean類型

public class Emp {private int empno;private String ename;private double sal;private String job;private double comm;private int mgr;private Date hiredate;private int deptno;//屬性: javabean : 員工對象所在的部門信息private Dept pddDept;

第二步:對sql映射文件標簽中
設置標簽定義javabean類型屬性與字段的映射關系
實現多表連接查詢

<!--自定義結果集中的字段與javabean類中屬性的映射關系--><resultMap id="EmpDept" type="Emp"><!--主鍵字段與屬性的映射關系--><id column="empno" property="empno"></id><!--非主鍵字段與屬性的映射關系--><result column="ename" property="ename"></result><result column="job" property="job"></result><result column="mgr" property="mgr"></result><result column="hiredate" property="hiredate"></result><result column="sal" property="sal"></result><result column="comm" property="comm"></result><result column="deptno" property="deptno"></result><!--association : 定義javabean類型屬性與字段的映射關系--><association property="pddDept" javaType="Dept"><id property="id" column="deptno" /><result property="name" column="dname" /><result property="loc" column="loc" /></association></resultMap>

1)同名接口

/*resultMap 的關聯方式實現多表查詢(一對一|多對一)*/
public interface EmpMapper {//查詢每一個員工信息以及員工所在的部門信息List<Emp> queryEmpDept();
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--關系映射查詢resultMap 的關聯方式實現多表查詢(一對一|多對一)
-->
<mapper namespace="com.yjxxt.mappers.EmpMapper"><!--自定義結果集中的字段與javabean類中屬性的映射關系--><resultMap id="EmpDept" type="Emp"><!--主鍵字段與屬性的映射關系--><id column="empno" property="empno"></id><!--非主鍵字段與屬性的映射關系--><result column="ename" property="ename"></result><result column="job" property="job"></result><result column="mgr" property="mgr"></result><result column="hiredate" property="hiredate"></result><result column="sal" property="sal"></result><result column="comm" property="comm"></result><result column="deptno" property="deptno"></result><!--association : 定義javabean類型屬性與字段的映射關系--><association property="pddDept" javaType="Dept"><id property="id" column="deptno" /><result property="name" column="dname" /><result property="loc" column="loc" /></association></resultMap><select id="queryEmpDept" resultMap="EmpDept">select empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc from emp join dept on emp.deptno = dept.deptno</select>
</mapper>

3)核心配置文件

采用包掃描時同包下的文件都會錄入,無需修改

4)接口測試類

/*測試字段名與屬性名不一致情況*/
public class Class002_EmpDeptTest {public static void main(String[] args) throws IOException {//獲取回話SqlSession session = SessionUtils.getSession();//獲取接口的實現類對象EmpMapper mapper = session.getMapper(EmpMapper.class);//通過實現類對象調用重寫后的方法List<Emp> list = mapper.queryEmpDept();list.forEach(System.out::println);//關閉回話session.close();}
}

3.3.6.7、多表查詢時字段名與屬性名不一致(一對多)

1)同名接口

/*resultMap 的關聯方式實現多表查詢(一對 多)部門與員工 : 一對多*/
public interface DeptMapper {//查詢所有部門信息以及每個部門所在的員工List<Dept> queryAll();
}

2)同名sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!---->
<mapper namespace="com.yjxxt.mappers.DeptMapper"><!--自定義結果的映射關系--><resultMap id="deptMap" type="Dept"><!--id : 定義主鍵字段與屬性的映射關系--><id column="deptno" property="id"/><!--id : 定義非主鍵字段與屬性的映射關系--><result column="dname" property="name" /><result column="loc" property="loc" /><!--屬性為List集合,使用collection標簽定義 ofType:集合中數據的類型--><collection property="empList" javaType="List"ofType="Emp"><id property="empno" column="empno" /><result property="ename" column="ename" /><result property="job" column="job" /><result property="mgr" column="mgr" /><result property="hiredate" column="hiredate" /><result property="sal" column="sal" /><result property="comm" column="comm" /><result property="deptno" column="deptno" /></collection></resultMap><select id="queryAll" resultMap="deptMap">select dept.deptno,dname,loc,empno,ename,job,mgr,hiredate,sal,comm from dept left join emp on emp.deptno = dept.deptno</select>
</mapper>

3)核心配置文件

采用包掃描時同包下的文件都會錄入,無需修改
_
_
_


_

4)接口測試類

/*測試多表查詢(一對多)*/
public class Class001_Test {public static void main(String[] args) throws IOException {//獲取回話SqlSession session = SessionUtils.getSession();//獲取接口的實現類對象DeptMapper mapper = session.getMapper(DeptMapper.class);//通過實現類對象調用重寫后的方法List<Dept> list = mapper.queryAll();list.forEach(System.out::println);//關閉回話session.close();}
}

3.3.6.8、接口注解開發

1)同名接口

/*接口注解開發*/
public interface DeptMapper {// 查詢所有的部門信息@Select("select * from dept")public List<Dept> queryAll();//插入一個新的部門信息int insertDept(Dept dept);//根據部門編號修改部門名稱int updateDept(@Param("deptno") int deptno, @Param("dname") String dname);//根據部門編號刪除int deleteDept(int deptno);
}

2)同名sql映射文件

簡單無參sql語句可以直接用注解編寫無需創建該文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yjxxt.mappers.DeptMapper"><!--查詢所有的部門信息--><!--<select id="queryAll" resultType="Dept">select * from dept</select>--><!--插入一個新的部門信息--><insert id="insertDept" parameterType="dept">insert into dept values(#{deptno},#{dname},#{loc})</insert><!--根據部門編號修改部門名稱--><update id="updateDept">update dept set dname = #{dname} where deptno = #{deptno}</update><!--根據部門編號刪除--><delete id="deleteDept" parameterType="int">delete from dept where deptno = #{deptno}</delete>
</mapper>

3)核心配置文件

采用包掃描時同包下的文件都會錄入,無需修改
_
_
_
_

4)接口測試類

/*測試注解開發*/
public class Class001_Anno {public static void main(String[] args) {//1.獲取會話SqlSession session = SessionUtils.getSession();//2.獲取接口實現類對象--> 指定哪一個接口DeptMapper mapper = session.getMapper(DeptMapper.class);//3.調用方法List<Dept> list = mapper.queryAll();list.forEach(System.out::println);mapper.deleteDept(70);//4.關閉會話session.close();}
}

https://www.nshth.com/python/338849.html
>

相关文章:

  • 數據庫基礎知識整理
  • mysql數據庫知識點
  • 大一數據庫必考知識點
  • 數據庫試題及答案解析
  • 數據庫系統應用
  • 數據結構知識點總結pdf
  • MySQL考試知識點
  • 數據庫軟件
  • 國二python難嗎,python字符串(二)
  • 電腦軟件下載app,在電腦上體驗了 16 款手機 App 后,我很失望
  • elasticsearch中文文檔,Elastic安全分析新利器 —— Event Query Language (EQL) 介紹
  • 數據結構與算法python,[FreeCodeCamp筆記] Python 數據結構和算法1 二分搜索 Binary Search
  • 黑蘋果macOS系統鏡像工具,MacOS Monterey 12.2.1 (21D62) OC 0.7.8 / Cl 5144 / PE 三分區原版黑蘋果鏡像
  • 51單片機畢業設計論文,【畢業設計】基于單片機無線充電的4軸飛行器 -物聯網 嵌入式 stm32
  • 數據庫基礎知識整理,數據庫筆記整理
  • python運行不報錯又無任何結果輸出,linux 正確錯誤輸出_報告錯誤的正確方法
  • 計算機組成原理第六版課后答案,杭電計算機組成原理實驗九R-I,杭電計組實驗9-實現R-I型指令的CPU設計實驗.doc
  • python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用
  • 數據庫視圖是什么,【SpringMVC】SpringMVC模型數據+視圖解析器
  • mp3格式轉換器,FFmpeg支持的音頻和視頻編解碼格式
  • 音樂學校招生要求,學校的音樂樓
  • c語言輸入兩個數輸出較大數,C語言求兩個數的較大值
  • 定義一個函數求三個數的最大值,輸入兩個整數,要求輸出其中值較大者。要求用函數求出最大值
  • MySQL學習 DAY1
  • 一個眼神一個微笑就讓人滿足,看得到的微笑
  • centos7安裝MySQL,centos7下載spark連接mysql數據庫提取數據(pyspark,Scala,python獨立執行)
  • node.js開發,從零開始nodejs系列文章-nodejs到底能干什么
  • python控制軟件自動化,Python實現網站自動登錄---傻瓜教程
  • get all of,resent = msg.get_all('Resent-Date') AttributeError: 'str' object h
  • opencv人體動作識別,torchvision使用keypoint rcnn 進行人體關鍵點定位
  • 深度卷積神經網絡原理與實踐,卷積神經網絡resent網絡實踐
  • 服務器,win服務器系統路由器,Windows server 2012 之路由功能
  • 小青蛙走迷宮的問題
  • 漢諾塔-小青蛙
  • 小青蛙oracle跟蹤,在小青蛙TOAD中用oracle語句寫
  • 音頻頻譜分析儀安卓版,[Android]自定義繪制一個簡易的音頻條形圖,附上對MP3音頻波形數據的采集與展現
  • 連乘符號∏的運算法則,∏這個是什么符號?
  • 用例失敗jenkins卻構建成功,jenkins 構建異常_jenkins構建失敗的原因是什么?