我們使用jdbc在對數據操作的時候我們需要知道數據庫裏的數據類型和我們的java數據類型是如何對應的,這樣存取的時候纔不會出現不必要的錯誤,
我們就拿MySQL爲例
類型名稱 | 顯示長度 | 數據庫類型 | JAVA類型 | JDBC類型索引(int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |
紅色標註基本就是比較常用的數據類型了、其他的用到的情況並不是很多這個BLOB是用於存儲二進制的比如圖片什麼的
我們主要來說一下這個DATE和BLOB這兩個數據類型
日期類型DATE
這裏我們要注意jdbc數據庫裏面日期類型如果是date那麼他返回的java就應該是個java.sql.Date類型的
而Java.sql.Date是java.util.Date的子類我們不要混爲一談
Java.sql.Date 是不帶有時間的
java.util.Date是帶有時間的
如果我們錯誤的將java.util.Date 存到DATE數據類型裏那麼時間他就丟失了這個要格外注意
那我們如果要保持時間我們應該怎麼辦呢
setTimestamp 我們使用這個方法來存 他會將時間自動轉換爲TIMESTAMP這個類型
我們來看一下例子
- <pre name="code" class="java">public void insertTimeStamp() throws SQLException {
- Connection conn = null;
- //注意這個接口
- PreparedStatement stmt = null;
- ResultSet rs = null;
- try {
- conn = ConnCreate.getConnection("jdbc:mysql://localhost:3306/test",
- "root", "r66t");
- //注意這個sql 我們使用了一個?作爲一個佔位符
- String sql = "insert into user(id,name,birthday,money) values(5,'zhaowu',?,13000.00)";
- stmt = conn.prepareStatement(sql);
- //我們在這裏爲這個佔位符替換了值、他是按照1.2.3.4的順序來進行替換的
- stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
- stmt.execute();
- } finally {
- ConnCreate.close(conn, stmt, rs);
- }
- }</pre><br>
- <br>
- <pre></pre>
- <p></p>
- <pre></pre>
- <p></p>
- <p>這個結果我就不給大家貼上來了、自己可以去試一下我們可以PreparedStatement 這個接口在這裏被我使用了、我建議大家永遠都不要使用Statement這個藉口而使用我們PreparedStatement這個接口、原因有很多比如他是預編譯的執行速度比Statement要快,他繼承了Statement所有的方法還額外擴展了一些方法,還有使用它有利於我們的代碼可讀和可維護性。</p>
- <p>同時我們使用參數化查詢、不必每次都發送sql語句、從而減小數據庫的壓力、而他的使用方法和Statement是一樣只是多了一個設置參數的步驟、相關的方法可以自己去查看一下文檔即可。</p>
- <p></p>
- <p>最後我們貼一個BLOB類型的代碼</p>
- <p></p>
- <p></p>
- <pre name="code" class="java">public void insertBlob() throws SQLException, IOException {
- Connection conn = null;
- PreparedStatement stmt = null;
- ResultSet rs = null;
- try {
- conn = ConnCreate.getConnection(
- "jdbc:mysql://192.168.1.153:3306/bpf_test", "root",
- "123456");
- String sql = "insert into blob_test(id,info) values(?,?)";
- stmt = conn.prepareStatement(sql);
- stmt.setInt(1, 3);
- File file = new File(
- "e:\\kt_000091.jpg");
- FileInputStream fis = new FileInputStream(file);
- stmt.setBinaryStream(2, fis, (int) file.length());
- stmt.execute();
- fis.close();
- } finally {
- ConnCreate.closeConnection(conn, stmt, rs);
- }
- }
- public void queryBlob() throws SQLException, IOException {
- Connection conn = null;
- PreparedStatement stmt = null;
- ResultSet rs = null;
- try {
- conn = ConnCreate.getConnection(
- "jdbc:mysql://192.168.1.153:3306/bpf_test", "root",
- "123456");
- String sql = "select info from blob_test where id=3";
- stmt = conn.prepareStatement(sql);
- rs = stmt.executeQuery();
- if (rs.next()) {
- InputStream is = rs.getBinaryStream(1);
- File file = new File("e:\\a.jpg");
- OutputStream os = new FileOutputStream(file);
- int len = 0;
- byte[] buffers = new byte[1024];
- while ((len = is.read(buffers)) > 0) {
- os.write(buffers, 0, len);
- }
- os.flush();
- os.close();
- is.close();
- }
- } finally {
- ConnCreate.closeConnection(conn, stmt, rs);
- }
- }</pre>
- <pre></pre>
- <p>它用來將我們的圖片等轉化爲二進制的形式存放在數據庫裏面、我們怎麼存進去的只要按照規則在讀取出來就可以了。</p>
- <p>這裏我們jdbc的一些基本操作就已經說完了、我們在實際項目中還有很多比如如何開啓事物、調用存儲過程等等、以後記錄。</p>