mysql-connector-java-xxx-bin.jar包的使⽤
Class.forName("sql.jdbc.Driver")的作⽤
第⼀步、将mysql连接包放在lib⽬录上,并右键Build Path——Add to Build Path,即可将其加载进eclipse中的引⽤包Reference Library下,作为提供ava中连接数据库的驱动。
第⼆步、编写代码,Student实体对象类、JDBC类以及测试类。
Student类:
package com.xiaoxiao.jdbc;
public class Student {
public static int id;
public static String name;
public static int age;
public Student(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}
public static int getId() {
return id;
}
public static void setId(int id) {
Student.id = id;
}
public static String getName() {
return name;
}
public static void setName(String name) {
Student.name = name;
}
public static int getAge() {
return age;
}
public static void setAge(int age) {
Student.age = age;
}
}
JDBC类:
package com.xiaoxiao.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.xiaoxiao.forExemple.Person;
public class JDBC {
Connection connection;              //连接数据库的连接对象
PreparedStatement preparedStatement;  //预编译语句
ResultSet resultSet;                  //获得的结果集
//编辑数据库连接池:mysql数据库连接驱动(sql.jdbc.Driver)、JDBC url地址、登录名和密码
public Connection getConnection(){
String url="jdbc:mysql://localhost:3306/family";
String userName="root";
String password="1234";
try {
Class.forName("sql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("不到驱动");
e.printStackTrace();
}
try {
Connection(url,userName,password);
if (connection!=null) {
}
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
return connection;
}
/*
* 1、执⾏静态SQL语句。通常通过Statement实例实现。这应该是某个指定的sql语句
* 2、执⾏动态SQL语句。通常通过PreparedStatement实例实现。但这应该是多条(much manty)sql语句
* 3、执⾏数据库存储过程。通常通过CallableStatement实例实现。
*/
public void querySql(){
System.out.println("开始在数据库查询sql语句");
String sql = "select * from student ";
connection =getConnection(); //连接数据库
try {
preparedStatement=connection.prepareStatement(sql); //获取预编译的sql语句
//            创建Statement对象并设置参数(问题:这⾥明明设置的是prepareStatement对象,怎么成了Statement对象呢,难道是⼀次性执⾏sql语句的原因)
resultSet =uteQuery(sql); //执⾏sql语句
()){
String String(1);
String String(2);
String String(3);
System.out.println(id+"\t"+name+"\t"+age+"\t"+"你是我⼼⽬中英雄"); //遍历resultSet⾥的所有sql语句,并将其id,name,age的属性值全转化为字符串的形式⽤图表的形式打印出来
}
} catch (SQLException e) {
System.out.println("查询数据库失败了");
e.printStackTrace();
}finally {
//            停⽌执⾏sql语句,关闭⽣成sql语句的进程以及关掉与数据库交互的连接,进⽽达到释放资源内存的作⽤
try {
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void queryStudentById(int id){
System.out.println("------------这究竟是⼀个怎样的⽅法!-----------------");
String sql = "select name,age from student where id=?";
connection =getConnection();
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, id);  //设置占位符对应的值
resultSet = uteQuery(); //这⾥为什么不能添加参数sql
()){
Student student = new Student();
student.setId(id);
student.String(1));  //这⾥的String()是个什么⿁
student.Int(2));
System.out.println(student);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void addSql(){
String sql="INSERT INTO family.student(id,name,age) VALUES(?,?,?)";
connection =getConnection();
try {
preparedStatement =connection.prepareStatement(sql); //错误: Duplicate entry '3' for key 'PRIMARY'---》主键重复输⼊“3”  因为当我看看表的时候才发现我的3、肖⽂飞、15已经在数据库被创建了            preparedStatement.setString(1,"6");
preparedStatement.setString(2, "周楠");
preparedStatement.setString(3,"22");
System.out.println("已经成功添加创建了⼀条新的数据了");
} catch (SQLException e) {
System.out.println("重复添加⼀条数据,即已经被添加或被创建了");
e.printStackTrace();
}finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 通过传参数的形式为value 赋值
*/
public void addSql1(Student student){
String sql="INSERT INTO family.student(id,name,age) VALUES(?,?,?)";
connection =getConnection();
try {
preparedStatement =connection.prepareStatement(sql);
preparedStatement.setInt(Id());
preparedStatement.setString(2, Name());
preparedStatement.setInt(Age());
System.out.println("已经成功添加创建了⼀条新的数据了");
} catch (SQLException e) {
System.out.println("重复添加⼀条数据,即已经被添加或被创建了");
e.printStackTrace();
}finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void deleteSql(){
String sql="DELETE FROM `family`.`student` WHERE `id`='7'";
connection = getConnection();
try {
preparedStatement =connection.prepareStatement(sql);
System.out.println("成功删除了id为7的数据");
} catch (SQLException e) {
System.out.println("删除操作失败,这是为什么呢");
e.printStackTrace();
}
}
public void updateSql(){
String sql="UPDATE `family`.`student` SET `name`='肖肖肖' WHERE `id`='7'";
connection =getConnection();
try {
preparedStatement=connection.prepareStatement(sql);
System.out.println("更新修改成功");
} catch (SQLException e) {
System.out.println("这是⼀⾸简单的⼩情歌,但是你还是测试失败了,这怪谁呢");
e.printStackTrace();
}
}
}
测试类TestDemo:
package com.xiaoxiao.jdbc;
/*
* 通过java程序对数据库进⾏增删查改
*/
public class TestDemo {
public static void main(String[] args) {
JDBC jdbc=new JDBC();
jdbc.querySql();
System.out.println("---------------------------这是⼀⾸简单的⼩情歌,华丽的分割线--------------------------------");
jdbc.queryStudentById(1);
/
/        jdbc.addSql();  //当我已经执⾏⼀遍这个⽅法的时候,再执⾏的时候就会重复添加相同的数据。执⾏⼀次不可以再执⾏了!
//        jdbc.deleteSql();  //删除⼀个sql语句,即就是删除⼀条语句
//        jdbc.updateSql();  //修改数据库的某个字段。
//        Student student=new Student(10,"周楠",22);
//        jdbc.addSql1(student);
//        jdbc.addSql1(new Student(10, "周楠", 22));  //通过传参数的形式对数据库进⾏⼀些操作,⽐如添加⼀条新的数据
}
}
控制台输出如下:
z注意:
1)、如果没有上传mysql连接驱动包mysql-connector-java-xxx-bin.jar,就会报错:ClassNotFoundException—&sql.jdbc.Driver,即驱动不到
所以
Class.forName("sql.jdbc.Driver");
这⼀段代码的作⽤就是⽤来加载指定驱动类的。
为什么需要⼿动去加载这个驱动类呢?正常情况下,对于⼀个java程序⽽⾔我们是不需要去管这个类的加载,只需要在需要⽤的时候直接import进去即可,但是对于JDBC的设计⽽⾔就不同,从代码:
Connection(url,userName,password);
我们知道,决定使⽤哪个驱动并不是由我们开发者指定的(我们只能指定连接数据库的url地址、登录⽤户名以及密码),⽽是通过遍历所有已注册的驱动来尝试获取连接的,成功就返回connection,反之连接数据库失败,所以代码中没有显⽰指定的驱动,可从如下的DrverManager代码可以看出:
for(DriverInfo aDriver : registeredDrivers) {
// If the caller does not have permission to load the driver then
// skip it.
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println("    trying " + Class().getName());
Connection con = t(url, info);
if (con != null) {
// Success!
println("getConnection returning " + Class().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println("    skipping: " + Class().getName());
}
}
这个类基本可以明⽩JDBC是如何获取连接的,问题是:registeredDrivers是怎么来的?请看如下sql.jdbc.Driver的⼀段static代码:
//
// Register ourselves with the DriverManager
//
static {
try {
java.isterDriver(new Driver());
} catch (SQLException E) {
mysql下载jar包throw new RuntimeException("Can't register driver!");
}
}
在DriverManager类下有⼀个registerDriver(new Driver())⽅法,能处理新注册的驱动,即此⽅法将新注册驱动加载进集合registedDrivers中,然后通过遍历的⽅式识别驱动。⽽
Class.forName("sql.jdbc.Driver");
就是指定当前类加载的是mysql驱动、sql server驱动还是orcle驱动。
2)、PreparedStatement接⼝以及ResultSet结果集
说明:
1、PreparedStatement接⼝继承Statement,它的实例包含预编译的sql语句,当然⽐statement执⾏得更快。
2、PreparedStatement接⼝继承了Statement的所有功能⽅法,为:executeUpdate、executeQuery、execute
3、在jdbc应⽤中,⼀般都⽤PreparedStatement,⽽不是Statement。
通过调⽤Connection对象的prepareStatement(sql)⽅法来获取预编译的sql对象,并保存⾄PerparedStatement对象中,然后通过执⾏executeQuery()⽅法获取执⾏静态 SQL 语句并返回它所⽣成结果的对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。