发表于: 2016-09-10 12:39:57

12 2331


一、今天完成

基于JDBC的数据库读写

输入:VMware上的MYSQL
输出:控制台
建立最简单的数据库CRUB,内容放在一个文件里,创建连接数据库、操作调用放在main方法中,不同的操作实现单独创建方法。
1.import导入JAR包
import java.sql.*;
2.注册JDBC驱动
private static String driver = "com.mysql.jdbc.Driver";
...
main中
Class.forName(driver);
3.打开链接
private static String url = "jdbc:mysql://192.168.1.182:3306/codetrainclass";
private static String username = "admin";
private static String password = "admin";
...
main中
Connection con = DriverManager.getConnection(url, username, password);
4.执行增/改/查/删
String insertSql = "INSERT INTO enroll(student_name, create_time, update_time) VALUES(?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(insertSql );
stmt.setString(1, "王五");
stmt.setLong(2, 20160909);
stmt.setLong(3, 20160909);
int i = stmt.executeUpdate();
updateSql = "UPDATE enroll SET update_time = ? WHERE student_name = ? "
PreparedStatement stmt = con.prepareStatement(updateSql );
long currentTime = new Date().getTime();
stmt.setLong(1, currentTime);
stmt.setString(2, "欧阳一丁");
int i = stmt.executeUpdate();
String selectSql = "SELECT * FROM enroll where columnName = ?"
String columnName = "student_name"
PreparedStatement stmt = con.prepareStatement(selectSql);
stmt.setString(1, "王五");
ResultSet rs = stmt.executeQuery();
deleteSql = "DELETE FROM enroll WHERE columnName = ? ";
String columnName = "create_time"
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setLong(1, 20160909);create_time
int i = stmt.executeUpdate();
5.从结果集中提取数据
*假设不知道DB中的表结构,如何把查询结果打印到console上?
1)ResultSetMetaDataMap调取表结构保存到Map中
2)设计一个方法A让不同的列类型使用不同的ResultSet.getXXX并打印到控制台上
师兄解释涉及mybatis逆向工程,暂延后学习
*假设DB表结构已知,如何把查询结果打印到console上?
1)用循环ResultSet.next把指针切到下一行
2)用ResultSet.getXXX获取各列的值

3)打印本行值

while (rs.next()){
   int id = rs.getInt("student_id");
   String name = rs.getString("student_name");
   long firstTime = rs.getLong("create_time");
   long lastTime = rs.getLong("update_time");
   java.util.Date fDate = new java.util.Date(firstTime);
   java.util.Date lDate = new java.util.Date(lastTime);
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd=HH:mm");

   System.out.println(id + ": " + name + " " + sdf.format(fDate) + " " + sdf.format(lDate) + " " );
}
6.清理环境
关闭ResultSet、Statement、Connection
MYSQL-java类型对应

二、明天计划

1.用Mybatis替代;

2.了解两者异同、效率;

3.时间充裕开始学习SPRING。


三、遇到问题

1.假设不知道DB中的表结构,是否可以获取并用来定义变量,保存返回查询结果

2.sql语句?传参是否可传列名

3.Connection、PreparedStatement、ResultSet不释放会怎么样

4.如何将虚拟机IP静态,且方便访问(未解答)


四、收获

1.成功使用JDBC对MYSQL进行CRUB。

2.百度范例中,Connection、PreparedStatement、ResultSet都进行了close释放。那么不释放回发生什么?分析mysql侧有相应的连接池,如果关闭Connection,将导致资源长时间占用。但JDBC中因为没有连接池API,猜测只要关闭了Connection,那么因为程序结束,PreparedStatement、ResultSet也会被垃圾回收器回收掉内存资源。
3.编写时,为复用性尝试了
String selectSql = "SELECT * FROM enroll where ? = ?"
 将列名用PreparedStatement.setString()作为参数设置,拼接语句实际为
String selectSql = "SELECT * FROM enroll where 'student_name' = '王五'"
 经丁杰师兄提醒,改为用一个String变量替代?传列名
String selectSql = "SELECT * FROM enroll where "+columnName+" = ?"
4.给JDBC设定sql语句PreparedStatement为动态的(可传参),Statement为静态的(不可传参)



返回列表 返回列表
评论

    分享到