Java学习笔记之JDBC

JDBC是为访问不同数据库提供的统一接口,为使用者屏蔽了许多使用细节

Java程序员使用JDBC,可以连接任何使用了JDBC驱动程序的数据库系统从而完成一系列对数据库的操作

JDBC程序编写基本步骤(mysql为例)

1)注册驱动——加载Driver类

2)获取链接——得到Connection

3)执行增删改查——发送sql给mysql执行

4)释放资源——关闭相关链接

前置工作

引入对应数据库的驱动文件到java项目中:

        现在项目主目录下建一个文件夹,然后把对应的驱动程序复制到该文件夹下,接着右键驱动程序点击Add as Library加入到java项目中

 

注册驱动

        创建驱动类:Driver driver = new com.mysql.jdbc.Driver();

获取链接

       定义链接的url:String url = “jdbc:mysql://localhost:3306/datebasename“;

            ·  jdbc:mysql//是规定好的协议,表示通过jdbc的方式链接mysql

            ·  如果数据库在本机就使用localhost,如果不在本机localhost处就填数据库所在机的ip地址

            ·  监听端口3306也可根据实际情况更改,最后datebasename是要链接的数据库名字

       将用户名和密码放入Properties对象,Propertie是键值对形式

                Properties propertises = new Propertise();

                properties.setProperty(“user“,“用户名”);

                properties.setProperty(“password“,“密码”);

                其中的键user和password是规定好的,后面的值用户名和密码根据实际情况填写

      接着尝试让数据库连接到给定的url :driver.connect(url,properties).var

                 得到返回的链接:Connection connect = driver.connect(url,properties);

执行sql语句

       sql语句以字符串的形式定义比如:

                String sql = “insert into actor values(‘小红’,‘女’,‘2001-2-12’)”;

                表示向actor表中插入一行数据

       statement用于执行静态sql语句并返回其生成的结果的对象

                Statement statement = connect.createStatement();

                int rows = statement.executeUpdate(sql);

                如果是dml语句则rows返回的是表中受影响的行数,比如执行上面的插入语句,如果返回1则代表插入成功,返回0则代表插入失败,非dml语句如select语句比较特殊详见结果集部分。  

关闭链接资源

        关闭连接资源很重要,避免资源浪费

                statement.close;

                connect.close;

Java链接mysql的方法2

通过反射创建Driver对象:

        class<?>  aclass = Class.forName(“com.mysql.jdbc.Driver“);

        Driver driver = (Driver)aclass.newInstence();

得到driver类后同第一种方法一样获取链接、执行sql语句。此方法的好处是加载Driver类是动态加载,更加灵活,减少依赖性

Java链接mysql方法3

通过DriverManager直接返回链接,不用将用户名、密码写入Propertise类了   

        Class.forName(“com.mysql.jdbc.Driver“);//得到Driver的clss对象即可,此时就自动完成了driver的注册

        String url = “jdbc:mysql://localhost:3306/datebasename“;

        String user = “root";

        String password = "123“;

        Connection connection = DriverManager.getConnection(url,user,password);

Java链接mysql方法4

将用户名和密码都写入配置文件,更加的灵活

        先创建配置文件properties:

                user=root;

                password=123;

                url=jdbc:mysql://localhost:3306/databasename

                driver=com.mysql.jdbc.Driver

        通过Propertises对象获取配置文件的信息:

                Properties properties = new Propertises();

                properties.load(new FileInputstream("配置文件地址"));

        获取相关的值:

                String user = properties.getProperty("user");

                String password = properties,getProperty("password");

                string driver = properties.getProperty("driver");

                String url = properties.getProperty("url");

        注册驱动(新版mysql可不写,建议写上):

                Class.forName(“com.mysql.jdbc.Driver“)

        拿到链接:

                 Connection connection = DriverManager.getConnection(url,user,password);

结果集ResultSet

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成

Resultset对象保持一个光标指向其当前的数据行。最初,光标位于第一行之前

next方法将光标移动到下一行,并且由于在Resultset对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集

previous()方法移动到上一行

写了查询的sql语句后使用statement的excuteQuery方法执行,返回得到resultset类然后使用while读取

也可在括号中指定列名直接获取对应列

控制台输出结果如下

Statement

Statement对象用于执行静态的sql语句,并返回其生成的结果对象

但是Statement存在SQL注入的问题,SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL语句段或命令,恶意攻击数据库。

SQL注入主要通过PreparedStatement解决,因此实际应用中不用Statement,而是PreparedStatement代替

PreparedStatement要求在写sql语句时用占位符 ?来代替需要填入的值如:

        String sql = “select count(*) from emp where username = ?and password = ?";

然后再调用PreparedStatement对象的setxxx()方法来设置这些参数

setxxx()方法有两个参数,第一个参数是要设置的sql语句中占位符的索引,即指定给第几个占位符赋值,索引从1开始,第二个参数是要设置的值

如果是select语句调用executeQuery(),返回ResultSet对象

如果是dml语句调用executeUpdate(),执行更新

实例:

JDBCutils类

由于在实际项目中操作数据库非常频繁,如果每次都注册驱动、获得链接、释放资源的话代码过于冗余,因此可以把每次都要进行的获取链接、释放资源封装成一个utils类,每次操作数据库只需要写sql语句并且调用utils类来获取链接和释放资源就行。

封装示例:

public class JDBCUtils {
        //定义相关的属性(4 ), 因为只需要一份,因此,我们做出 static
        private static String user; //用户名
        private static String password; //密码
        private static String url; //url
        private static String driver; //驱动名
        //在 static 代码块去初始化
        static {
                try {
                        Properties properties = new Properties();
                        properties.load(new FileInputStream("src\\mysql.properties"));
                        //读取相关的属性值
                        user = properties.getProperty("user");
                        password = properties.getProperty("password");
                        url = properties.getProperty("url");
                        driver = properties.getProperty("driver");
                } catch (IOException e) {
                //在实际开发中,我们可以这样处理
                //1. 将编译异常转成 运行异常
                //2. 调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便.
                throw new RuntimeException(e);
                }
        }
        //连接数据库, 返回 Connection
        public static Connection getConnection() {
                try {
                        return DriverManager.getConnection(url, user, password);
                } catch (SQLException e) {
                        //1. 将编译异常转成 运行异常
                        //2. 调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便.
                        throw new RuntimeException(e);
                        }
                }
        //关闭相关资源
        /*
        1. ResultSet 结果集
        2. Statement 或者 PreparedStatement
        3. Connection
        4. 如果需要关闭资源,就传入对象,否则传入 null
        */
        public static void close(ResultSet set, Statement statement, Connection connection) {
                //判断是否为 null
                try {
                if (set != null) {
                set.close();
                }
                if (statement != null) {
                statement.close();
                }
                if (connection != null) {
                connection.close();
                }
                } catch (SQLException e) {
                        //将编译异常转成运行异常抛出
                        throw new RuntimeException(e);
                        }
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值