java中的jdbc

来源:互联网 发布:服务器坏了 raid 数据 编辑:程序博客网 时间:2024/05/18 00:58

java中的jdbc

最基本的链接数据库的方式:贾琏预执事
1. 贾 加载数据库驱动
2. 琏 创建链接对象
3. 预 创建语句对象
4. 执 执行sql语句
5. 事 释放资源

//加载数据库驱动  (贾) Class.forName("com.mysql.jdbc.Driver"); //创建链接对象   参数是String类型  (琏) Connection conn = new Connection(URL,uesr,password); //创建预处理对象  语句对象 (预) PreparedStatement ps = null;    ps = conn.prepareStatement(sql);    ps.setInt(1, studen.getId());    ps.setString(2, studen.getName());    ps.setInt(3, studen.getAge());    //执行sql (执)    ps.executeUpdate();    ps.close();    conn.close();

再加载数据库驱动时会抛出:ClassNotFoundException
创建对象,释放资源时会抛出:SQLException

jdbcUtil工具类的创建:

注意:每次操作数据库都要加载数据库,创建何释放资源 ,
抽取出数据库操作的链接和释放资源 解除代码中的硬编码 URL ,userName,password
properties 文件以key和values的形式存储数据 空格也会被储存;
以MySQL为例:

#key=valres(注释)driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/databaseNameusername=rootpassword=admin

注意:当用到 链接池 时properties 文件中的key 必须对应相应的属性 即key值是固定的

public class jdbcUtil {    private static DataSource ds = null;//创建链接池对象    static{        Properties p = new Properties();//创建properties文件对象        try {            ClassLoader loader = Thread.currentThread().getContextClassLoader();            InputStream inputStream = loader.getResourceAsStream("ds.Properties");            p.load(inputStream);        } catch (Exception e) {            throw new RuntimeException("文件加载失败", e);        }        try {        //使用druid(德鲁伊)连接池创建一个链接池对象 参数:properties文件对象            ds = DruidDataSourceFactory.createDataSource(p);        } catch (Exception e) {            throw new RuntimeException("连接池失败", e);        }    }    /**     * 用DataSource创建一个Connection对象并返回     * @return     */    public static Connection getConn() {        try {            // 连接数据库            Connection connection = ds.getConnection();//得到一个connection对象            return connection;        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }    //释放资源    public static void close(ResultSet rs, Statement st, Connection conn) {        try {            if (rs != null) {                rs.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            if (st != null) {                try {                    if (st != null) {                        st.close();                    }                } catch (Exception e) {                    e.printStackTrace();                } finally {                    try {                        conn.close();                    } catch (SQLException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }        }    }    //防止创建对象    private jdbcUtil() {}}

创建公用的DML模板

DML 指的是MySQL中的增删改操作 它们都不需要处理结果集;
所以可以将它们抽出一个相同的模版出来

//参数的type和value由调用者确定public int dmlUtil(String sql,Object...obj){    try{        Connection conn= jdbcUtil.getConn();        PreparedStatement ps = conn.prepareStatement(sql);        for(int i = 0;i<obj.length;i++){            ps.setObject(i+1,obj[i]);        }        int rows = ps.executeUpdate();        return rows;    }catch (SQLException e) {        e.printStackTrace();    }    return 0;}

DQL指的是sql中的查询操作,不同于DML ,DQL需要处理结果集
DQL返回的数据有可能是一行,也有可能是多行
但是其处理结果集的方式是一样的;
这里以最基本的查询select*from tb_table;,select*from tb_table where id = 1;
结果集处理(处理一行):

public class ResultSetHandler {    public static <T> T ResultSet(Class<T> classType,ResultSet rs) throws Exception{        T t = classType.newInstance();        try {            // 通过内行机制 给给对像赋值            BeanInfo info = Introspector.getBeanInfo(classType, Object.class);            PropertyDescriptor[] pds = info.getPropertyDescriptors();                for (PropertyDescriptor pd : pds) {                    String propertName = pd.getName();//得到 属性名    字段名  成员变量的名字                    propertName="id";                    Method wMethod = pd.getWriteMethod();                    wMethod.invoke(t,rs.getObject(propertName));                }            return t;        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }}

返回多条的 查询:

public static <T> List<T> DQLsTemplate(String sql, Class<T> classType) throws Exception{        T t = classType.newInstance();        List<T> list = new ArrayList<>();        Connection conn = jdbcUtil.getConn();        PreparedStatement ps;        try {            ps = conn.prepareStatement(sql);            ResultSet rs = ps.executeQuery();            while (rs.next()) {                t = ResultSetHandler.ResultSet(classType, rs);                list.add(t);            }            jdbcUtil.close(rs, ps, conn);            return list;        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }

返回一条 查询:

public int DQLTemplate(String sql,Object...obj){        try{            Connection conn = jdbcUtil.getConn();            PreparedStatement ps = conn.prepareStatement(sql);            for(int i = 0;i<obj.length;i++){                ps.setObject(i+1,obj[i]);            }            int rows = ps.executeUpdate();            return rows;        }catch (SQLException e) {            e.printStackTrace();        }        return 0;    }
原创粉丝点击