jdbc最基础的就是使用statement 一共有几步
1注册驱动
2.获得连接
3.获得语句执行者平台
4.执行sql语句
5处理结果
6释放资源
当然 得先导包
public class ejdbc {
public static final String url = "jdbc:mysql://localhost:3306/chartroom";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "admin";
public static void main(String[] args) {
String sql ="select * from user";
try {
//获取驱动
Class.forName(name);
//获得连接
Connection conn=DriverManager.getConnection(url,user,password);
//获取语句执行者
Statement pst =conn.createStatement();
ResultSet rs = pst.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getInt("password"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二 因为有sql注入攻击的问题 而且statement使用起来比较麻烦 ,为了使用sql语句占位符 所以把statement舍弃了 使用preperstatement
public class papresta {
public static final String url = "jdbc:mysql://localhost:3306/chartroom";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "admin";
public static void main(String[] args) {
String sql ="select * from user where username=?";
try {
Class.forName(name);
Connection conn =DriverManager.getConnection(url, user, password);
PreparedStatement psd = conn.prepareStatement(sql);
psd.setString(1, "aaa");
ResultSet rs = psd.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getInt("password"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
三 后来因为每次使用都得注册驱动 获得连接 还有释放资源 很麻烦 所以把这些抽取出来做成一个工具类 以后使用的时候就可以直接调用方法获得连接 释放资源
public class Jdbcutils_v1 {
static Connection conn =null;
/**
* 获取连接
*
*/
public static Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chartroom","root", "admin");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void release(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
使用起来是这个样子
public void testusername(){
try{
String sql ="select * from user where username=?";
conn =Jdbcutils_v1.getConnection();
pst = conn.prepareStatement(sql);
pst.setString(1, "aaa");
rs =pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getInt("password"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
Jdbcutils_v1.release(conn, pst, rs);
}
}
}
再后来感觉每次换数据库什么的得修改代码 为了不修改代码 所以把这些url什么的抽取出来 到一个文件中 用代码去获取这些文件 每次换数据库就可以直接修改这个文件就行了就不用再修改代码了 所以把
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/chartroom?useUnicode=true&characterEncoding=utf8
username=root
password=admin
放到jdbc.peoperties文件中 获取方法有两个
第一个使用ResourceBundle bundle = ResourceBundle.getBundle(“Jdbc”);获取
工具类代码是
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class Jdbcutils_v2 {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
ResourceBundle bundle = ResourceBundle.getBundle("Jdbc");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
}
static Connection conn =null;
/**
* 获取连接
*
*/
public static Connection getConnection() {
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,username, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void release(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试
public void testadd(){
try{
String sql ="insert into user values(5,?,?,null)";
conn =Jdbcutils_v2.getConnection();
pst = conn.prepareStatement(sql);
pst.setString(1, "你好");
pst.setInt(2, 123);
int rows =pst.executeUpdate();
if(rows>0){
System.out.println("成功");
}else{
System.out.println("shibai");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
Jdbcutils_v1.release(conn, pst, rs);
}
}
还有一种获取方法是通过类加载器获得
public class Jdbcutils_v3 {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try {
//通过当前类获取类加载器
ClassLoader classloader=Jdbcutils_v3.class.getClassLoader();
//通过类加载器获得输入流
InputStream is =classloader.getResourceAsStream("Jdbc.properties");
//创建一个properties对象
Properties pro = new Properties();
//加载输入流
pro.load(is);
//获取相关参数值
driver =pro.getProperty("driver");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static Connection conn =null;
/**
* 获取连接
*
*/
public static Connection getConnection() {
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,username, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void release(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试
public void dele(){
try{
conn =Jdbcutils_v3.getConnection();
String sql ="delete from user where id=?";
pst = conn.prepareStatement(sql);
pst.setInt(1, 6);
int rows =pst.executeUpdate();
if(rows>0){
System.out.println("成功");
}else{
System.out.println("shibai");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
Jdbcutils_v3.release(conn, pst, null);
}
}
四 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序.
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池.
c3p0导包 然后设置设置配置文件这个网上一大堆 就不写了
public class ctest {
@Test
public void adduser(){
Connection conn=null;
PreparedStatement pst=null;
ComboPooledDataSource DataSource = new ComboPooledDataSource();
try {
conn=DataSource.getConnection();
String sql ="insert into user values(6,?,?,null)";
conn =Jdbcutils_v2.getConnection();
pst = conn.prepareStatement(sql);
pst.setString(1, "你好");
pst.setInt(2, 123);
int rows =pst.executeUpdate();
if(rows>0){
System.out.println("成功");
}else{
System.out.println("shibai");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
Jdbcutils_v3.release(conn, pst, null);
}
}
}
这里的释放不是以前的关闭了 c3p0使用装饰者模式重写了connection中的获取连接 这里改变了
五 DButils
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
1.MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
2.MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
3.BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
4.BeanListHandler:多行处理器!把结果集转换成List;
5.ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
6.ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
public class dbutils {
public void adduser(){
try {
//创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse());
String sql = "insert into user values(1,?,?,?)";
Object[] params ={"abc","123","admin"};
//执行查询操作
int rows=qr.update(sql, params);
if(rows>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void selectuser(){
try {
//创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse());
String sql = "select * from user ";
//执行查询操作
List<User> users=qr.query(sql, new BeanListHandler<User>(User.class));
for(User user:users){
System.out.println(user.toString());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}