我们使用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这个类型
我们来看一下例子
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); } }
这个结果我就不给大家贴上来了、自己可以去试一下我们可以PreparedStatement 这个接口在这里被我使用了、我建议大家永远都不要使用Statement这个借口而使用我们PreparedStatement这个接口、原因有很多比如他是预编译的执行速度比Statement要快,他继承了Statement所有的方法还额外扩展了一些方法,还有使用它有利于我们的代码可读和可维护性。
同时我们使用参数化查询、不必每次都发送sql语句、从而减小数据库的压力、而他的使用方法和Statement是一样只是多了一个设置参数的步骤、相关的方法可以自己去查看一下文档即可。
最后我们贴一个BLOB类型的代码
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); } }
它用来将我们的图片等转化为二进制的形式存放在数据库里面、我们怎么存进去的只要按照规则在读取出来就可以了。
这里我们jdbc的一些基本操作就已经说完了、我们在实际项目中还有很多比如如何开启事物、调用存储过程等等、以后记录。