java数据库连接及注意事项

jdbc: java database connection,也就是java的数据库连接。
作用: 完成数据库数据和内存数据的交互。

为了屏蔽不同数据库的差异,在内存和各种数据库之间建立了一个接口标准。每个厂商按照接口的标准来实现接口类。


jdbc 是java连接数据库的一套标准。该标准中定义了一系列的接口,由数据库厂商根据自身数据库的特点提供实现类,由开发者调用。开发者根据接口调用方法,可以屏蔽不同数据库厂商的差异。这样,无论连接什么数据库都是一套API。

jdbc 操作步骤:                          流操作步骤:
① 加载驱动,建立连接                        1、建立流 
② 执行SQL语句                                2、操作流
③ 关闭连接                                      3、关闭

SQL注入: 在执行sql语句时,由于sql语句的值是由用户输入的,所以是以变量接收的,如果以拼接字符串方式来执行SQL语句,一旦数据中有非法字符或者有关键字时,会导致语法错误,或者执行结果不正确的情况,这称为SQL注入。


Statement和PreparedStatement的区别:

Statement是PreparedStatement 的父接口。在执行SQL语句时,只能以拼接字符串方式,拼接值。会引起SQL注入。而且效率低。

PreparedStatement,是预编译SQL语句执行对象,支持占位符方式,无论数据是什么值,都当字符串处理,不会引起SQL注入。而且效率高。

 举例说明:

package 数据库连接;

import java.sql.Date;
/**
 * 公民实体类
 * @author C
 *
 */
public class ManBean {
    /**公民编号*/
    private int id;
    /**姓名*/
    private String name;
    /**性别*/
    private String sex;
    /**生日*/
    private Date briyhday;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBriyhday() {
        return briyhday;
    }
    public void setBriyhday(Date briyhday) {
        this.briyhday = briyhday;
    }
    public ManBean(String name, String sex, Date briyhday) {
        super();
        this.name = name;
        this.sex = sex;
        this.briyhday = briyhday;
    }
    public ManBean() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "ManBean [id=" + id + ", name=" + name + ", sex=" + sex + ", briyhday=" + briyhday + "]\n";
    }    
}

强调:如果在一个类中定义了代参构造那么没有默认的无惨构造,所以必须要加上无惨构造。

  

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 所有Dao父类
 * 
 * @author C
 *
 */
public class ManDao {
    /** 连接对象 */
    protected Connection con = null;
    /** Sql语句执行对象 */
    protected PreparedStatement pr = null;
    /** 结果集对象 */
    protected ResultSet rs = null;

    /**
     * 建立链接
     */
    public void setCnnonection() {
        // 加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // 建立连接
            // jdbc表示需要使用jdbc建立连接。mysql 表示连接数据库类型,localhost表示连接服务器的IP地址
            // 其中localhost为本机的ip
            // 3306表示mysql的端口号,mytest1为sql中的数据库名称,表示需要使用该类中的数据库表
            // characterEncoding=utf-8表示设置连接数据库的编码集
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytext1?characterEncoding=utf-8", "root",
                    "123456");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 关闭流
     */
    public void closeConnecting() {
        try {
            if (rs != null) {
                this.rs.close();
            }
            this.pr.close();
            this.con.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ManDao m = new ManDao();
        m.setCnnonection();

    }

}

强调:把建立连接和关闭流放在一个类中分别定义二个方法是一种抽象的行为,方便需要用的时候直接调用其方法,而不写重复的代码。

package 数据库连接;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 公民持久话实现接口
 * @author C
 *
 */
public class ManDaoImpl extends ManDao implements IManDao {
    public void add(ManBean man) {    
        //加载驱动
        try {
            this.setCnnonection();
            //执行sql语句,?表示占位符,需要向占位符填充数据
             pr=con.prepareStatement(
                    "insert into t_man (manName,sex,brithday) values(?,?,?)");
            //将man对象中的name属性取出,填充第一个占位符
            pr.setString(1,man.getName());
            pr.setString(2, man.getSex());
            pr.setDate(3, man.getBriyhday());            
            //更新数据库 必须要写
            pr.executeUpdate();            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            this.closeConnecting();
        }
    }

    /**
     * 查找所有公民对象集合
     */
    public List<ManBean> findall() {
        List<ManBean> list = new ArrayList<ManBean>();
        try {
            this.setCnnonection();
            pr = con.prepareStatement("select *from t_man");
            // 执行查询操作,将sql语句查询的数据,封装在结果集对象中
            rs = pr.executeQuery();

            // 将结果集的指针,不段指向下一条记录,如果该方法返回false ,表示指针到底结果集末尾。
            while (rs.next()) {
                ManBean man = new ManBean();
                // 将数据库中id列的值取出,填充实体对象的id属性。""是列名名称
                man.setId(rs.getInt("id"));
                man.setName(rs.getString("manName"));
                man.setSex(rs.getString("sex"));
                man.setBriyhday(rs.getDate("brithday"));
                // 将封装好的记录实体对象加入集合
                list.add(man);

            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            this.closeConnecting();
        }
        return list;
    }

强调:1,添加、删除、修改完后必须要用executeUpdate()方法更新数据库。2,查询都要用结果集来传递数据库的数据。3,最后必须关闭连接,否则会导致数据的丢失。

  

猜你喜欢

转载自www.cnblogs.com/dmp90/p/8978047.html
今日推荐