Oracle:Mybatis,JDBC數(shù)據(jù)庫連接,增刪改查,提交事務(wù),解決端口號(hào)報(bào)錯(cuò)【詩書畫唱】

概括:
持久層框架的特點(diǎn)和創(chuàng)建Mybatis工程
PPT文本
示例(用mybatis框架像數(shù)據(jù)庫中插入一條數(shù)據(jù))
解決因?yàn)槎丝谔?hào)為1522或1521引發(fā)的IO錯(cuò)誤,查看端口號(hào)
sqlserver,mysql ,oracle各自默認(rèn)的不同的端口號(hào)
關(guān)于使用修改語句等時(shí)未提交事務(wù)后JDBC無法再修改這條數(shù)據(jù)這件事
sqlserver,mysql ,oracle各自默認(rèn)的不同的端口號(hào)
關(guān)于mybatis.xml配置文件的注意事項(xiàng)
Mybatis框架建表示例

解決因?yàn)槎丝谔?hào)為1522或1521引發(fā)的IO錯(cuò)誤,查看端口號(hào)?START
這個(gè)是有時(shí)eclipse的控制臺(tái)中會(huì)報(bào)出的錯(cuò)誤:

https://blog.csdn.net/Hellowenpan/article/details/79645173

當(dāng)然了我就沒這篇文章寫得那么麻煩了,
D:\oracle\product\10.2.0\db_1\network\ADMIN


解決因?yàn)槎丝谔?hào)為1522或1521引發(fā)的IO錯(cuò)誤,查看端口號(hào)?END
示例(用mybatis框架像數(shù)據(jù)庫中插入一條數(shù)據(jù))START

abatis
n.鹿砦,拒木,障礙物;


Mybatis框架建表示例 START
? ? ? ? ? ? ? ? ? ??
create table Userinfo(
? ? id number primary key,
? ? act varchar2(30) not null,
? ?pwd varchar2(30) not null,
? ?birth date
);
--drop sequence seq_Userinfo
create sequence seq_Userinfo
start with 1? ? ? ?--起始值是1
increment by 1? ? ?--增長的值? ?
maxvalue 999999999 --序列號(hào)的最大值
minvalue 1? ? ? ? ?--序列號(hào)的最小值
nocycle? ? ? ? ? ? --是否循環(huán)
cache 10;? ? ? ? ? --預(yù)存
insert into Userinfo values(seq_Userinfo.nextval,'黑黑','pwd1',to_date('2020-06-06','yyyy-mm-dd'));
insert into Userinfo values(seq_Userinfo.nextval,'紅紅','pwd2',to_date('2020-06-07','yyyy-mm-dd'));
insert into Userinfo values(seq_Userinfo.nextval,'藍(lán)藍(lán)','pwd3',to_date('2020-06-08','yyyy-mm-dd'));
--select * from Userinfo
Mybatis框架建表示例 END




import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
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 com.jy.bean.Userinfo;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//? ? ? ? String drivername = "oracle.jdbc.driver.OracleDriver";
//? ? ? ? //oracle數(shù)據(jù)庫的默認(rèn)端口號(hào)1521
//? ? ? ? //連接的數(shù)據(jù)庫名字是orcl數(shù)據(jù)庫
//? ? ? ? String url = "jdbc:oracle:thin:@localhost:1521:orcl";
//? ? ? ? String username = "j190802";
//? ? ? ? String pwd = "orcl";
//? ? ? ??
//? ? ? ? Connection conn = null;
//? ? ? ? PreparedStatement pstm = null;
//? ? ? ? ResultSet rs = null;
//? ? ? ??
//? ? ? ? try {
//? ? ? ? Class.forName(drivername);
// conn = DriverManager.getConnection(url,username,pwd);
// pstm = conn.prepareStatement("select * from userinfo where id = ?");
// pstm.setInt(1, 8);
// rs = pstm.executeQuery();
// List<Userinfo>rmUserinfo = new ArrayList<Userinfo>();
// while(rs.next()) {
// Userinfo u = new Userinfo();
// //ID是userinfo表的主鍵
// u.setId(rs.getInt("ID"));
// u.setAct(rs.getString("ACT"));
// System.out.println(rs.getString("ACT"));
// u.setPwd(rs.getString("PWD"));
// u.setBirth(rs.getString("BIRTH"));
// rmUserinfo.add(u);
// }
//
// String sql = "insert into userinfo values(?,?,?,to_date(?,'yyyy-mm-dd'))";
// pstm = conn.prepareStatement(sql);
// Userinfo u = new Userinfo();
// u.setId(11);
// u.setAct("haha");
// u.setPwd("09876");
// u.setBirth("2000-7-3");
// pstm.setInt(1, u.getId());
// pstm.setString(2, u.getAct());
// pstm.setString(3, u.getPwd());
// pstm.setString(4, u.getBirth());
// int count = pstm.executeUpdate();
// System.out.println(count);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// try {
// if(rs != null) {
// rs.close();
// }
// if(pstm != null) {
// pstm.close();
// }
// if(conn != null) {
// conn.close();
// }
// } catch(Exception e) {
// e.printStackTrace();
// }
// }
//獲取主配置文件的路徑
String path = "mybatis.xml";
//讀取mybatis.xml中的配置信息,就是讀取四大連接字符串的內(nèi)容
Reader config;
try {
config = Resources.getResourceAsReader(path);
SqlSessionFactory factory =?
new SqlSessionFactoryBuilder().build(config);
//數(shù)據(jù)庫的操作對象session
SqlSession session = factory.openSession();
//調(diào)用selectAll
//執(zhí)行路徑就是映射文件的namespace屬性+'.'+id
String exePath = null;
// exePath = "com.jy.dao.UserinfoDao.selectAll";
// List<Userinfo>list = session.selectList(exePath);
// for(Userinfo u : list) {
// System.out.println(u.getAct());
// }
// exePath = "com.jy.dao.UserinfoDao.selectById";
// Userinfo u = session.selectOne(exePath,8);
// System.out.println(u.getAct());
exePath = "com.jy.dao.UserinfoDao.add";
Userinfo u = new Userinfo();
u.setId(13);
u.setAct("帥哥");
u.setPwd("666666");
u.setBirth("2000-6-06");
Integer count = session.insert(exePath,u);
//新增修改和刪除一定記得提交事務(wù)
session.commit();
System.out.println(count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

package com.jy.bean;
public class Userinfo {
? ? private Integer id;
? ? private String act;
? ? private String pwd;
? ? private String birth;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
}

<?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">
<!-- namespace就是空間名,它必須在整個(gè)項(xiàng)目中都是唯一的 -->
<mapper namespace="com.jy.dao.UserinfoDao">
? ? <!-- id必須是唯一的 -->
? ? <!-- 創(chuàng)建一個(gè)List<Userinfo>集合,變量名叫rmUserinfo -->
? ? <resultMap type="com.jy.bean.Userinfo" id="rmUserinfo">
? ? ? ? <!-- userinfo表的主鍵是id -->
? ? ? ? <!-- property指的是Userinfo類的屬性名,
? ? ? ? ? ? ?column指的是userinfo表的列名 -->
? ? ? ? <!-- u.setId(rs.getInt("ID")) -->
? ? ? ? <id property="id" column="ID" />
? ? ? ? <!-- u.setAct(rs.getInt("ACT")) -->
? ? <result property="act" column="ACT"/>
? ? <result property="pwd" column="PWD"/>
? ? <result property="birth" column="BIRTH"/>
? ? </resultMap>
? ? <!-- public List<Userinfo>selectAll() -->
? ? <select id="selectAll" resultMap="rmUserinfo">
? ? ? ? select * from userinfo
? ? </select>
? ??
? ? <!-- public Userinfo selectById(Integer id) -->
? ? <!-- mybatis框架中,占位符?使用#{}來代替 -->
? ? <select id="selectById" resultMap="rmUserinfo">
? ? ? ? select * from userinfo where id = #{id}
? ? </select>
? ??
? ? <!-- public Integer add(Userinfo u) -->
? ? <!-- 因?yàn)閰?shù)的類型是Userinfo,所以占位符中的字符串就必須是對應(yīng)的屬性名
? ? ? ? ?(屬性名區(qū)分大小寫) -->
? ? <insert id="add" parameterType="com.jy.bean.Userinfo">
? ? ? ? insert into userinfo values(#{id},#{act},#{pwd},to_date(#{birth},'yyyy-mm-dd'))
? ? </insert>
</mapper>

<?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="oracleConf">? ? ? ? ? ? ? ? ?
? ? ? ? <!-- oracle配置 -->?
? ? ? ? <environment id="oracleConf">??
? ? ? ? ? ? <transactionManager type="JDBC">?
? ? ? ? ? ? ? ? <property name="closeConnection" value="false"/>
? ? ? ? ? ? </transactionManager>?
? ? ? ? ? ? <!-- 配置數(shù)據(jù)源 -->? ? ? ?
? ? ? ? ? ? <dataSource type="POOLED">
? ? ? ? ? ? ? ? <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>? ?
? ? ? ? ? ? ? ? <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>?
? ? ? ? ? ? ? ? <property name="username" value="X"/>?
? ? ? ? ? ? ? ? <property name="password" value="sshcPwd"/>??
? ? ? ? ? ? </dataSource>? ??
? ? ? ? </environment>
? ? </environments>?
? ? <!-- 實(shí)體映射文件集合 -->?
? ? <mappers>
? ? ? ? <mapper resource="com/jy/bean/UserinfoSqlMap.xml"/>
? ? </mappers>
</configuration>



示例(用mybatis框架像數(shù)據(jù)庫中插入一條數(shù)據(jù))END
關(guān)于mybatis.xml配置文件的注意事項(xiàng) START

關(guān)于mybatis.xml配置文件的注意事項(xiàng) END
教你找下載Oracle后就自帶的jdbc包 START
D:\oracle\product\10.2.0\db_1\jdbc\lib



教你找下載Oracle后就自帶的jdbc包 END
持久層框架的特點(diǎn)和創(chuàng)建Mybatis工程 START















PPT文本:
什么是MyBatis:
MyBatis是支持普通SQL查詢,存儲(chǔ)過程和高級映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
? ? 像這種支持SQL查詢的框架叫持久層框架,與之類似功能的還有Hibernate框架。

持久層框架的特點(diǎn):
Hibernate和Mybatis等都具備一些共同點(diǎn):
從配置文件(通常是XML配置文件中)得到 sessionfactory。
由sessionfactory產(chǎn)生 session。
在session中完成對數(shù)據(jù)的增刪改查和事務(wù)提交等。
在用完之后關(guān)閉session 。?
在java對象和數(shù)據(jù)庫表之間有做映射的配置文件,通常是xml 文件。

使用MyBatis:
jar包下載地址為:http://mvnrepository.com/artifact/org.mybatis/mybatis

一個(gè)簡單的Mybatis示例:
在數(shù)據(jù)庫中創(chuàng)建表stuinfo。
在工程中導(dǎo)入MyBatis框架包和數(shù)據(jù)庫驅(qū)動(dòng)包。
創(chuàng)建MyBatis框架的配置文件mybatis.xml。
創(chuàng)建stuinfo的javabean類和映射文件stuinfoMap.xml。(映射文件也在src目錄下,最好和它所映射的javabean類在一起方便管理。)
創(chuàng)建測試類,在main方法中進(jìn)行測試。

導(dǎo)入MyBatis框架包和數(shù)據(jù)庫驅(qū)動(dòng)包:
Mybatis框架支持一個(gè)框架中使用多種不同的數(shù)據(jù)庫,即在框架中同時(shí)使用兩種以上的數(shù)據(jù)庫,原則是需要用哪個(gè)數(shù)據(jù)庫,就導(dǎo)入哪種數(shù)據(jù)庫的jar包。
請?jiān)陧?xiàng)目中導(dǎo)入Mybatis框架包和數(shù)據(jù)庫驅(qū)動(dòng)包。

創(chuàng)建MyBatis框架的配置文件mybatis.xml:
為了簡單起見,我們暫時(shí)將Mybatis的配置文件放在src目錄下。
注意:當(dāng)進(jìn)行框架整合以后,這個(gè)文件可能會(huì)被刪除掉。該文件名沒有特殊要求。以下代碼片段是框架對數(shù)據(jù)庫連接字符串進(jìn)行處理。


創(chuàng)建javabean:
根據(jù)stuinfo表的字段創(chuàng)建一個(gè)javabean,該javabean的類名為Stuinfo,即表名首字母大寫,駝峰式命名。


創(chuàng)建javabean的映射文件:
在前面創(chuàng)建的Stuinfo類所在的包中,繼續(xù)創(chuàng)建映射文件,注意該文件的名字最好遵守項(xiàng)目團(tuán)隊(duì)制定的規(guī)范,例如規(guī)定該文件名是以被映射的java類名拼接上SqlMap.xml而成的。


添加映射文件到mybatis.xml中:
對于映射文件,如果你不通過代碼告訴Mybatis框架它在哪里,是沒有辦法讀取到的,所以,我們還需要通過修改mybatis.xml文件告訴框架該如何找到映射文件。
打開mybatis.xml,添加如下的代碼:


檢查:
工程的文件層次結(jié)構(gòu)如下:


測試:
創(chuàng)建一個(gè)帶有main方法的測試類,在方法中添加如下的代碼:


總結(jié):
比較我們以前寫的JDBC代碼和使用mybatis框架的代碼,說說他們的差別。

作業(yè):
搭建一個(gè)Mybatis框架項(xiàng)目,通過Mybatis框架查詢出被連接數(shù)據(jù)庫中某個(gè)表的所有數(shù)據(jù)。(使用oracle或者sqlserver試試)
持久層框架的特點(diǎn)和創(chuàng)建Mybatis工程 END
主配置文件和加載properties配置文件 START


Mybatis框架中有三種配置文件:
主配置文件(mybatis.xml)
數(shù)據(jù)庫配置文件(db.properties)
映射文件(SqlMap.xml)
注意:在框架中,除了使用xml文件進(jìn)行配置以外,還有一種配置文件也使用得很廣泛,那就是properties文件。

















在MyBatis中可以通過配置environment元素的子元素transactionManage來指定事務(wù)管理器類型:
1、JDBC:直接簡單使用了JDBC的提交和回滾設(shè)置。它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
2、MANAGED:幾乎沒做什么。它從來不提交或回滾一個(gè)連接。而它會(huì)讓容器來管理事務(wù)的整個(gè)生命周期(比如Spring或JEE應(yīng)用服務(wù)器的上下文)。默認(rèn)情況下它會(huì)關(guān)閉連接。然而一些容器并不希望這樣,因此如果你需要從連接中停止它,將closeConnection屬性設(shè)置為false。

environment元素的子元素dataSource元素使用基本的JDBC數(shù)據(jù)源接口來配置JDBC連接對象的資源。通過它的type屬性來指定內(nèi)建的數(shù)據(jù)源類型,type屬性包含三種配置:
UNPOOLED:實(shí)現(xiàn)每次被請求時(shí)簡單打開和關(guān)閉連接。
POOLED:JDBC連接對象的數(shù)據(jù)源連接池的實(shí)現(xiàn),用來避免創(chuàng)建新的連接實(shí)例時(shí)必要的初始連接和認(rèn)證時(shí)間。當(dāng)前Web應(yīng)用程序用來快速響應(yīng)請求很流行的方法。
JNDI:實(shí)現(xiàn)為了使用如Spring或應(yīng)用服務(wù)器這類的容器,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè)JNDI上下文的引用。





主配置文件和加載properties配置文件?END
講義 START

Struts2:升級servlet為action。
Mybatis:持久層框架,數(shù)據(jù)庫框架。減少jdbc樣板代碼的編寫。
jdbc連接ORACLE數(shù)據(jù)庫:
"1、數(shù)據(jù)庫驅(qū)動(dòng)包(安裝oracle數(shù)據(jù)庫時(shí)就有了
【安裝目錄】\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar)"
"2、四大連接字符串
drivername=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=j190802
password=orcl"
3、編寫代碼
搭建Mybatis框架步驟:
1、導(dǎo)入框架包:mybatis-3.3.0.jar
2、將主配置文件mybatis.xml文件放到src目錄下(主配置文件名不要改)
針對于每個(gè)表進(jìn)行操作:
3、創(chuàng)建對應(yīng)表的bean類
4、創(chuàng)建表的映射文件
5、在主配置文件中注冊映射文件
講義 END
sqlserver,mysql ,oracle各自默認(rèn)的不同的端口號(hào) START
?sqlserver默認(rèn)端口號(hào)為:1433
URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname"
DRIVERNAME:"com.microsoft.jdbc.sqlserver.SQLServerDriver";
mysql 默認(rèn)端口號(hào)為:3306
URL:jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk
DRIVERNAME:"com.mysql.jdbc.Driver";
oracle 默認(rèn)端口號(hào)為:1521
URL:"jdbc:oracle:thin:@localhost :1521:orcl";
DRIVERNAME:"oracle.jdbc.driver.OracleDriver";
sqlserver,mysql ,oracle各自默認(rèn)的不同的端口號(hào) END
關(guān)于使用修改語句等時(shí)未提交事務(wù)后JDBC無法再修改這條數(shù)據(jù)這件事 START


