日期:2014-05-16  浏览次数:20603 次

jdbc笔记
连接数据的步骤
注册驱动
建立连接
创建执行sql的语句
执行语句
处理执行的结果
释放资源

1、加载驱动
2、写类
主要方法:
static void test() {
//注册驱动
//注册管理器,可以注册很多驱动。DriverManager里面有一个vector列表,会把所有的驱动都加入到该列表中
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");按:分割开来
//Class.forName("com.mysql.jdbc.Driver");把类装载到jvm里面.从classpath里面去找,推荐使用这个方式
//关联到类的初始化过程
//当类被加载到虚拟机的时候,会调用静态代码块。在mysql的driver类中有一个静态代码块,是注册驱动的。

//建立连接
//连接的时候会使用url在vector中区匹配,如果有就建立连接。
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306:jdbc","root","");
//url格式:JDBC:子协议:子名称//主机名:端口/数据库

//创建执行sql的语句
Statement st = conn.createStatement();

//执行语句
ResultSet rs = st.executeQuery("select * from user");

//处理结果
User user = new User();
while(rs.next()) {
user.setName(rs.getString("name"));
user.setBirthday(rs.getDate("birthDay"));
user.setMoney(rs.getDouble("money"));
}
//释放资源
rs.close();
st.close();
conn.close();
//以上程序只是简单的连接,不严谨。需要改进。
}


//以模板方式获取连接
static void template() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
st = conn.createStatement();
rs = st.executeQuery("select * from user");
User user = new User();
while(rs.next()) {
user.setName(rs.getString("name"));
user.setBirthday(rs.getDate("birthday"));
user.setMoney(rs.getDouble("money"));
}
} catch (Exception) {
} finally {
try {
if(rs!=null) {
rs.close();
}
} finally {
try{
if(st!=null) {
st.close();
}
}finally{
if(conn!=null){
conn.close();
}
}
}
}

}
//工具类的使用,把class用final 修饰,不让继承,不让实例化,使用private实现构造函数。
public final class JdbcUiils{
private static String url = "";
private static String user = "";
private static String password = "";
private JdbcUtils(){}
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
throw new ExceptionInitializerError(e);
}
}
public static Connection getConnection()throws SQLException{
return DriverManager.getConnection(url,user,password);
}
public static void free(ResultSet rs,Statement st,Connection conn){
try{
if(rs!=null)
rs.close();
}catch(SQLException e1){
e1.printStackTrace();
} finally{
try{
if(st!=null)st.close();
}catch(SQLException e2){
e2.printStackTrace();
}finally{
conn.close();
}
}
}
}

//数据库的CRUD
static void read() {
}
static void create() {
String sql = "insert into user(name,birthday,money) values('name1','1987-01-01',400)";
String sql1 = "update user set money = money+2";
String sql2 = "delete from user where id>4";
st.executeUpdate(sql);//返回影响的行数,不管是增加,修改,删除。
}

//数据库注入问题;
select * from user where name = "or 1 or"
select * from user where name = '' or true or '';//什么条件都能满足.
//使用预编译语句PreareStatement,该接口继承Statement,不管增删改查都推荐使用preparestatement语句。
String sql = "select * from user where name=?";
PrepareStatement ps = conn.prepareStatement(sql);
ps.setString(1,name);
ps.executeQuery();
ResultSet rs = ps.executeQuery();

//数据类型与日期问题;
preparestatement和resultset有很多设置的数据类型;
sql.date从util.date继承过来的.
sql.date只有日期,没有时间。util.date有日期和时间。
String sql = "insert into user(name,birthday,money) values (?,?,?)";
ps = conn.preparestatement(sql);
ps.setString(1,name);
ps.setDate(2,new java.sql.Date(birthday.getTime()));
ps.setFloat(3,money);