JDBC
首先我们要了解什么是JBDC:
在我们建立了数据库之后,需要与java代码关联,可以通过java代码执行数据库的增删改查.但由于数据库的种类有多种多样的,所有给我们提供了这么一种可以统一访问的java类和接口.jdbc是一种基准,我们可以根据JDBC构建更高级的工作和接口.-
如何使用?
- 首先我们需要导入jdbc的jar包 ->add build path
- 加载驱动.
- 获取数据库连接.
- 获取操作数据的对象.
- 执行sql语句.
- 释放对象.
首先声明 我的数据库叫student 表名stu 具体:
具体代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test1 {
public static void main(String[] args) throws SQLException {
//如果是查找接受结果 如果插入 删除 更新不用管(ResultSet)
try {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取数据连接(con)
Connection con =DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");
PreparedStatement stmt = con.prepareStatement("select *from stu");//获取操作数据的对象(stmt)//执行sql语句
// int row = stmt.executeUpdate();//增删改
ResultSet set = stmt.executeQuery();//查找
while (set.next()) {//读取数据
//id name age gender
// int id =set.getInt(1);//通过下标获取
// String name = set.getString(2);
// int age = set.getInt(3);
// String gender = set.getString(4);
int id = set.getInt("id");//通过字段获取
String name = set.getString("name");
int age = set.getInt("age");
String gender = set.getString("gender");
System.out.println(id+name+age+gender);
}
//释放对象 (ResultSet) ->stmt ->con
set.close();
stmt.close();
con.close();
}
}
这是最基本的执行,还有简化版的
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test3 {
//
final static String userName = "root";
final static String pass = "root";
final static String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8";
public static Connection getConnect() {
Connection connectuin = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connectuin =DriverManager.getConnection(url, userName, pass);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return connectuin;
}
public static void main(String[] args) {
Connection connection = Test3.getConnect();
PreparedStatement stmt = null;
ResultSet set = null;
try {
stmt = connection.prepareStatement("select name from stu where age < ?");
stmt.setInt(1, 25);
set =stmt.executeQuery();
while (set.next()) {
String name = set.getString("name");
System.out.println(name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
set.close();
stmt.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
上面这个完整的代码中,我们使用?是为了防止SQL注入.使用?会更明了.
这两段代码都是执行的查询语句,如果要执行增加 删除 修改 我们就使用
int row = stmt.executeUpdate();//增删改 就可以了.
DBUtile
- 什么是DBUtile?
我们在知道JDBC的基础上就可以很好的了解DBUtile,在 我们使用JDBC的时候会发现我们要重复写很多代码(加载驱动 获取数据库的连接 获取数据库的连接对象) 并且需要重复释放对象,所有就有了一个封装了JDBC代码的一个工具类库. - 需要导入相应的jar包.
具体代码如下:
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import jdbc.Test3;
//默认访问权限 只能在自己包内
//public 全部都可以
//protected 只能在自己的子类中
//private 只能在自己类中用
public class Test1 {
public static void main(String[] args) throws SQLException {
//获取连接
Connection con = Test3.getConnect(); // 这是调用上面封装的方面 (本人比较懒 望谅解)
//执行sql
QueryRunner runner = new QueryRunner();
//1.连接 2sql 3.要存储的类型
List list = runner.query(con, "select * from stu",new BeanListHandler(Student.class));
//con.close();//关闭数据库
DbUtils.close(con);//关闭数据库
//打印结果
System.out.println(list);
}
}
这就是一个student类
public class Student {
private Integer id;
private String name;
private String gender;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", gender=" + gender
+ ", age=" + age + "]";
}
}
c3p0
- c3p0是一种连接池,概念与线程池类似.通俗点说;就是有一个池子 里面有好几个连接,需要用连接的时候 取走,不用 就放回.这样就可以节省创建连接的时间.
- 导入jar包.
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Test1 {
//线程池
//c3p0设置配置文件
// 1.代码配置
// 2. Property文件
// xml
public static void main(String[] args) throws SQLException {
//作用:读xml 建立线程池 初始化连接 放入线程池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//获取连接
Connection con = dataSource.getConnection();
//正常jdbc 不需要关闭连接 c3p0回自动回收连接
PreparedStatement stmt = con.prepareStatement("select *from stu");//获取操作数据的对象(stmt)//执行sql语句
// int row = stmt.executeUpdate();//增删改
ResultSet set = stmt.executeQuery();//查找
while (set.next()) {//读取数据
int id = set.getInt("id");//通过字段获取
String name = set.getString("name");
int age = set.getInt("age");
String gender = set.getString("gender");
System.out.println(id+name+age+gender);
}
//释放对象 (ResultSet) ->stmt ->con
set.close();
stmt.close();
con.close();
}
}
下面是c3p0 与DBUtile结合的使用的代码
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import dbutiles.Student;
//c3p0 与 Dbutile一起用
public class Test2 {
public static void main(String[] args) throws SQLException {
//获取数据库连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//创建dbutile操作对象
QueryRunner query = new QueryRunner(dataSource);
//执行语句
List list = query.query("select * from stu",new BeanListHandler(Student.class));
System.out.println(list);
}
}
以上纯属是一名码农小白的理解,如果有错误的地方望各位大神指正.
如果有需要jar包的本媛也可以提供哦!