JDBC的进化2
好了,换了个新屏幕,原来的电脑屏幕,过年的时候擦玻璃,玻璃掉下来给砸的裂开了(玻璃1点事情都没有),新屏幕感觉就是爽,也不枉我花了280大洋买的LG的完善屏。战役力立马感觉飙升20%。闲话就不多说了,继续进化JDBC。 1.JDBC的进化2―增删改查获得连接对象后,我们是这样想的,我们要将我们的sql语句通过这个连接发送到数据库,然后让数据库将结果返回给我们。 @Test
public void testJdbcInsert() throws Exception{
Connection conn = JDBCUtils.getConnection();
Statement statm = conn.createStatement();
String sql = "insert into customers values(21,'yushen1','yushem@123.com','1998⑶⑵',null)";
boolean b = statm.execute(sql);
System.out.println(b);
statm.close();
conn.close();
} 我将异常抛出去了,固然这里不是很公道,但是这都是不重点。重点是履行成功了(通过查看数据库发现的确插入了),但是这里的返回值是false,咦,不公道啊,明明成功了,怎样会是false?查看API,别的不看,我们直接看它的返回值,“true if the first result is a ResultSet object; false if it is an update count or there are no results ”,原来如此,如果是结果是1个ResultSet对象它就返回true,如果是没有结果集或是1个count,返回false。联系学过的sql,我们知道select查询后的结果是1张数据表,而别的DML操作后,仅仅是对表进行了修改,得到的是1个类似这样的结果“1 row(s) affected”。而这时候候问题就来了,我们怎样知道得到的1个结果集还是1个count,这样就不利于后续的操作了。进化吧! 2.JDBC的进化2―增删改2.1JDBC的进化2―增删改1原始的问题我们已明白了,我们的解决办法就是将修改(增删改)操作和查询操作分开,看看上面的3个方法,秒懂了,是否是。先来处理简单的,修改,由于它的返回值是1个受影响的行数,我们通过判断这个行数是不是为0,就可以判断修改是不是履行成功。 // update
@Test
public void testJdbcUpdate(){
Connection conn = null;
Statement statm = null;
try {
conn = JDBCUtils.getConnection();
statm = conn.createStatement();
String sql = "update customers set name = 'woshiyushen' where id = 21";
int rows = statm.executeUpdate(sql);
if( rows > 0){
System.out.println("success!");
} else {
System.out.println("failed");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(statm,conn);
}
} 暂且我们将修改进化到这里,后续将其进化。将其封装成1个方法,放到我的工具类中。 // statement : insert,update,delete
public static int update(String sql) {
Connection conn = null;
Statement statm = null;
int rows = 0;
try {
conn = getConnection();
statm = conn.createStatement();
rows = statm.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(statm,conn);
}
return rows;
} 3.JDBC的进化2―查(重点)3.JDBC的进化2―查1先来查1个 @Test
public void testOrderSelect1() {
// get connection
Connection conn = null;
// create Statement object
Statement statm = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
statm = conn.createStatement();
// executeQuery,and return a ResultSet object
String sql = "select order_id,order_name,order_date from `order`";
rs = statm.executeQuery(sql);
// read the rs
while (rs.next()) {
int orderId = rs.getInt("order_id");
String orderName = rs.getString("order_name");
Date orderDate = rs.getDate("order_date");
// put the resultset to a class
Order order = new Order(orderId,orderName,orderDate);
System.out.println(order);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// close conn
JDBCUtils.close(rs,statm,conn);
}
} 我自己英语水平也不是很高,可能存在很多的语法问题,大家将就的看,我也会不断的学习改进。这里直接将结果集的处理也写出来了,这里又触及到1个思想:ORM(Object Relational Mapping):对象关系映照,拿我自己的话来理解就是,1张表对应1个类,1列对应1个属性,1行对应1个数据,仔细想一想,是否是这样的,可能我们1开始想将读出来的数据存到数组,集合中,但是用1个对象来存是否是更好1点?在说说ResultSet,API中是这样说的,“A table of data representing a database result set”包括1个数据库结果集的数据表,得到的是可以认为是1张表,它提供1个光标,通过next()方法,将光标下移,光标所指代表1行。然后我们从这1行中取出数据,存到对象中。 3.JDBC的进化2―查2我们想提供1种通用的解决办法,就好比2.1JDBC的进化2―增删改1中我们将其封装成方法,只通过1些参数就可以就获得对象。想要获得这个对象,而我们不知道具体是哪一个对象,只能在运行时才能肯定具体获得甚么对象……反射!反射!!!对!那我们来写这个通用的查询方法。 public <T> T get(String sql,Class<T> clazz) {
T t = null;
// 1.get the connection
Connection conn = null;
// 2.on the base of conn,create Statement object
Statement statm = null;
// 3.excute sql command,and get the ResultSet object
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
statm = conn.createStatement();
rs = statm.executeQuery(sql);
// get the ResultSetMetaData object
ResultSetMetaData rsmd = rs.getMetaData();
// 4.read the data from Result object,and write to a generic object
while (rs.next()) {
// 4.1through reflect get the T object t...
t = clazz.newInstance();
// 4.2 read the rs'data to t
// 4.21 get the columnCount througth the ResultSetMetaData
int columnCount = rsmd.getColumnCount();
// 4.22 get the every columnName and columnVal
for (int i = 1; i <= columnCount; i++) {
// 4.23 get the columnName
String columnName = rsmd.getColumnLabel(i);
// 4.24 get the columnVal from rs
Object cloumnVal = rs.getObject(columnName);
// 4.25 set the columnName and columnVal to t througth
// generic
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t,cloumnVal);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5.close the connection
JDBCUtils.close(rs,conn);
}
// 6. return the t
return t;
} 这里需要两个参数,sql就不用多提了,要说的是第2个参数 到这里的时候,你脑海里是否是会有这样1个层次: 描写类的类(通过反射获得的Class) 往下1个层次: 具体的类 这略微的进化1下。 3.JDBC的进化2―查3既然我们说,可以通过属性来为其设置值,我们那末我们也能够同getXXX()和setXXX()为属性赋值。而Apache为我们提供了这样的类库(commons-beanutils⑴.8.0.jar,commons-logging⑴.1.1.jar,我会随后上传,大家注意看我评论,进行下载使用)。 public <T> List<T> getAll(String sql,Class<T> clazz) {
List<T> list = new ArrayList<T>();
Connection conn = null;
Statement statm = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
statm = conn.createStatement();
rs = statm.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
T t = clazz.newInstance();
int cloumnCount = rsmd.getColumnCount();
for (int i = 1; i <= cloumnCount; i++) {
String cloumnName = rsmd.getColumnLabel(i);
Object cloumnVal = rs.getObject(cloumnName);
PropertyUtils.setProperty(t,cloumnName,cloumnVal);
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs,conn);
}
return list;
} 这里是获得多行,返回多个对象,用List来寄存。 做了两个测试: @Test
public void test1() {
String sql = "SELECT order_id orderId,order_name OrderName,order_date orderDate FROM `order` WHERE order_id > 1";
List<Order> orders = getAll(sql,Order.class);
for (Order order : orders) {
System.out.println(order);
}
}
@Test
public void test() {
String sql = "SELECT order_id orderId,order_date orderDate FROM `order` WHERE order_id = 1";
Order order = get(sql,Order.class);
System.out.println(order);
} 提示1下,别名的使用,数据库和Java程序命名规范可能有所不同,所以为了保证对应的列名和属性名相同,我们就要用到别名。(getColumnLabel() 优先返回别名) 另附1些练习: 2.向数据库表中添加1些数据 3.插入1个新的 student 信息 请输入考生的详细信息 Type: IDCard: ExamCard: StudentName: Location: Grade: 信息录入成功! ok,今天就进化到这里吧。明天继续。LG的屏的确挺不错的! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |