java中的JDBC

Posted 暴走的小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的JDBC相关的知识,希望对你有一定的参考价值。

jdbc(java database connection)  数据库连接

jdbc概述:

1.jdbc是一种由java语言定义的接口和类,用于访问不同的关系型数据

2.java语言要连接mysql数据库,就需要开发具体的类来实现这样的功能

3.有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库. 4.java语言只需要定义一套连接数据库操作的标准接口就可以了
1.导入mysql开发商提供的具体数据库连接实现的jar文件
2.加载mysql驱动类(打开jav与数据库的连接通道)
3.建立与mysql数据库连接
4.发送sql语句
5.关闭连接通道
6.接收数据库查询的结果
JDBC API: 程序员调用的接口与类,集成在 java.sql 包中 DriverManager 类作用:管理各种不同的 jDBC 驱动 Connection 接口 与特定数据库的连接 Statement 接口 执行 sql 或者    PreparedStatement接口 执行 sql ResultSet 接口 接收查询结果 JDBC搭建: 1.加载mysql驱动类: Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现 或者 DriverManager.registerDriver(new Driver()); 2.连接数据库: Connection conn = DriverManager.getConnection(URL,USER,PASS); URL:jdbc:mysql://ip(127.0.0.1): 端口 (3306)/ 数据库 ?serverTimezone=Asia/Shanghai USER: 用户名 (root) PASS: 密码
 Connection connection = 
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?

serverTimezone=Asia/Shanghai","root","121212");

3.获得Satement执行sql语句 或者  获得PrepareStatement执行sql语句

(1)获得Satement执行sql语句

Satement 中的方法 : Int executeUpdate(String sql) 用于执行 ddl 语句和 dml( , , ) 语句 返回操作的行数(比如插入了一行数据,就返回1) 用于执行 ddl 语句返回 用于执行 dml 语句返回操作的行数 插入,修改,删除一行数据
Statement s = connection.createStatement();
        //现在要向数据库的表中插入一条数据
                                                    //这里对应的是数据库中的字段
        /*int a = s.executeUpdate("INSERT INTO suser(sname,passworde,brithday,timet)" +

                 //这里是java中自己定义的变量,用于向数据库中存入想要存入的数据                     "VALUE('"+name+"','"+password+"','"+brithdays+"',now())");*/


        //对指定条件的行进行数据修改
        /*int a = s.executeUpdate("update suser set sname='"+name+"',passworde='"+password+"'," +
                "brithday='"+brithdays+"'where num="+num);*/


        //删除
        int a = s.executeUpdate("delete from suser where num="+num);
        System.out.println(a);

(2)获得PrepareStatement执行sql语句

sql 语句中参数位置使用占位符 , 使用 setXX 方法向 sql 中设置参数 PrepareStatement ps = connection.prepareStatement(sql); PrepareStatement 中的方法 : Int executeUpdate() 用于执行 ddl 语句和 dml( , , ) 语句 返回操作的行数 用于执行 ddl 语句返回 0 用于执行 dml 语句返回操作的行数
 PreparedStatement ps  =  //将sql预编译到preparedstatement对象中,并没有执行
                connection.prepareStatement("insert into suser(sname,passworde,brithday,timet) value(?,?,?,?)");
        //接下来设置值
        ps.setObject(1,username);
        ps.setObject(2,userpassword);
        ps.setObject(3,brithday);
        ps.setObject(4,new java.util. Date());
        //执行
        ps.executeUpdate();

4.关闭与数据库的链接通道

每次操作完成后关闭所有与数据库交互的通道,将statement于connection全部关闭 st.close(); rs.close(); conn.close(); ps.close(); 5. PreparedStatement Statement 1、代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例 可以看出来PreparedStatement要看起来更为简单直观 2.提高了安全性 (1)以 Statement为例
 String num = "1000 or 1=1";//sql注入  sql攻击
        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212");

        //执行
        Statement statement = connection.createStatement();
                  int a = statement.executeUpdate("delete from suser where num="+num);


//这种操作会直接把数据库表中的所有数据删除

(2)以PreparedStatement为例

String num = "1000 or 1=1";//sql注入  sql攻击
        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212");

        //执行
        PreparedStatement pt = connection.prepareStatement("delete from suser where num=?");
        pt.setObject(1,num);//set方法中对传入的值进行检测,一个?对应一个值,不能有其他的关键字
        pt.executeUpdate();

//这种方法在运行程序时它会检测到错误从而报错阻止操作继续进行

6.结果集处理(也就是将数据库表中的数据提取出来)

PreparedStatement Statement 中的 executeQuery() 方法中会返回一个ResultSet 对象 , 查询结果就封装在此对象中 . 1.使用 ResultSet 中的 next() 方法获得下一行数据 2.使用 getXXX(String name) 方法获得值 (1)将一行数据取出来 首先自己定义一个类
public class User 
    private  String name;
    private  String password;
    private  Date brithday;
    private  Date time;
    private  int num;
    public int getNum() 
        return num;
    

    public void setNum(int num) 
        this.num = num;
    

    public void setName(String name) 
        this.name = name;
    

    public void setPassword(String password) 
        this.password = password;
    

    public void setBrithday(Date brithday) 
        this.brithday = brithday;
    

    public void setTime(Date time) 
        this.time = time;
    



    @Override
    public String toString() 
        return "User" +
                "name='" + name + '\\'' +
                ", password='" + password + '\\'' +
                ", brithday=" + brithday +
                ", time=" + time +
                ", num=" + num +
                '';
    


public class Demo7 
    public static void main(String[] args) 
        String num = "6";

        User user = null;
        try 
            user = new Demo7().dd(num);
         catch (ClassNotFoundException | SQLException e) 
            e.printStackTrace();
        

        System.out.println(user);
    
    public  User dd(String num) throws ClassNotFoundException, SQLException 
        PreparedStatement pt=null;
        Connection connection = null;
        User user=null;
        try
            Class.forName("com.mysql.cj.jdbc.Driver");
             connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212");
            pt = connection.prepareStatement("select * from suser where num=?");
            pt.setObject(1,num);
            ResultSet st = pt.executeQuery();//执行查询操作
            //从ResultSet中将数据传入到我们自己定义的对象中
            while (st.next())
                 user = new User();
                user.setNum(st.getInt("num"));
                user.setName(st.getString("sname"));
                user.setPassword(st.getString("passworde"));
                user.setBrithday(st.getDate("brithday"));
                user.setTime(st.getTimestamp("timet"));
            

        finally 
                pt.close();
                connection.close();

        


        return user;
    

(2)将表中的所有数据取出来,用到了集合的思想

public class Demo8 


    public static void main(String[] args) 

        ArrayList<User> users = null;
        try 
            users = new Demo8().dd();
         catch (ClassNotFoundException | SQLException e) 
            e.printStackTrace();
        


        System.out.println(users);
    
    public  ArrayList<User> dd() throws ClassNotFoundException, SQLException 
        PreparedStatement pt=null;
        Connection connection = null;
        ArrayList<User> users = new ArrayList<>();
        User user=null;
        try
            Class.forName("com.mysql.cj.jdbc.Driver");
             connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/charroom?serverTimezone=Asia/Shanghai","root","121212");
            pt = connection.prepareStatement("select * from suser ");

            ResultSet st = pt.executeQuery();//执行查询操作
            //从ResultSet中将数据传入到我们自己定义的对象中
            while (st.next())
                 user = new User();
                user.setNum(st.getInt("num"));
                user.setName(st.getString("sname"));
                user.setPassword(st.getString("passworde"));
                user.setBrithday(st.getDate("brithday"));
                user.setTime(st.getTimestamp("timet"));
                users.add(user);
            

        finally 
                pt.close();
                connection.close();

        


       return users;
    

day22 Java语言中的------JDBC连接

day22 Java语言中的------JDBC连接

一、JDBC概述:

    “JDBC”就是Java连接数据库,根据数据库的不同建立的连接也有一定的区别。我们主要还是对MySQL数据库进行数据的操作。JDBC架构中主要包含两种:一种是JDBC应用程序层,一种是JDBC驱动程序层。下表是JDBC与各种数据库连接的图示。下面就具体的来了解一下Java与数据库之间的一个关系。

技术分享图片

二、JDBC:

    在具体开始学习JDBC之前,做好相应的准备工作。在MySQL数据库官网下载好相应的jar包(mysql-connector-java-5.1.24-bin.jar),在MySQL数据库中建立好test数据库,以及一张emp数据表,对数据表做好相应的数据准备。

    

    1、使用JDBC连接数据库的基本步骤:

    在Java语言中,我们队数据库的连接使用jdbc技术,一般分为以下几个步骤。

        1.1、加载驱动:使用Class.forName("......");

        1.2、建立连接:使用DriverManager.getConnection("......");

        1.3、创建SQL语句对象。createStatement()

        1.4、通过SQL对象调取相应的sql语句执行的方法

具体实例:

//使用JDBC连接数据库
package www.com.c1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC01 {

	
	/*
	* 1、com.mysql.jdbc.Driver。加载驱动,这个是固定语法,根据不同的数据库可以更改。
	* 2、jdbc:mysql://。类似于协议
	* 3、localhost:3306/。安装数据库的本地主机和端口号。也可以改为IP地址和端口号
	* 4、test。数据库名
	* 5、?,&。表示所带的参数,和参数之间的连接。
	* 6、user。数据库的用户名是什么?
	* 7、password。数据库的密码是什么?
	*/
	//连接方式一
	private static final String URL01 = 
			"jdbc:mysql://localhost:3306/test?user=root&password=123456";
	
	    //连接方式二
	    /*private static final String URL02 ="jdbc:mysql://localhost:3306/test";
	        private static String user ="root";
	        private static String password = "123456";
	    */
	//创建连接的对象
	private static Connection connection;
	
public static void main(String[] args) {
		try {
		//1、加载驱动
		Class.forName("com.mysql.jdbc.Driver");
			
		//2、建立连接,方式一。并创建连接对象。
		connection = DriverManager.getConnection(URL01);
			
			/*	//建立连接,方式二。
				DriverManager.getConnection(URL02, user, password);
			*/
		//3、创建SQL语句对象。
		Statement statement = connection.createStatement();
	
//一、执行查询语句。		
		//(1)、只能执行查询的sql语句,并使用resultSet结果集来接收存储查询到的所有结果
		ResultSet resultSet = statement.executeQuery("select * from emp");
		//(2)、遍历结果集
		while (resultSet.next()) {
			//输出结果集
			System.out.println(
					"id:"+resultSet.getInt("id")+";"+
					"用户名:"+resultSet.getString("username")+";"+
					"密码:"+resultSet.getString("password"));
			}
//二、执行更新语句。
		//(1)更新数据。注意使用更新操作的时候返回值是int类型,即某行数据是否受影响
		int updateCount = statement.executeUpdate(
		"update emp set password=888888 where id=2");
			
		//(2)判断是否更新成功。
		        if (updateCount>0) {
				System.out.println("更新成功!");
			} else {
				System.out.println("更新失败!");
			}
			
//三、执行任意的sql语句。		
	//返回值:注意返回类型是布尔类型,主要分为两种。
	          //一般在创建表或创建数据库的时候最适用。
	    //返回true时:执行的是select语句
	   //返回false时:执行的是插入、更新、删除、或者是create语句
    //if not exists关键字是判断该表是否存在,如果存在就不创建
	    boolean create = statement.execute(
		"create table if not exists test(id int primary key,name varchar(20))");
		
		if (create = true) {
		    System.out.println("创建成功!");
		} else {
			System.out.println("创建失败!");
		}
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}
    }
}

    2、通过JDBC连接技术,实现“动态sql”操作数据表。

具体实例:

//JDBC中的使用动态sql查询数据
package www.com.c1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBC02 {
		//定义连接数据库字符
		private static final String URL = 
			        "jdbc:mysql://localhost:3306/test";
		//定义字符接收连接数据
		private static Connection connection;
			
public static void main(String[] args) {
		try {
			
		//1、加载驱动
		Class.forName("com.mysql.jdbc.Driver");
			
		//2、建立连接
		connection = DriverManager.getConnection(URL, "root", "123456");
			
		//3、编译动态sql
		PreparedStatement ps = connection.prepareStatement(
				"select * from emp where id=? and username=?");
			
		//4、假设用户从页面上传递id和username两个参数,
		    //并作为查询条件查询数据。★★★★
			int id = 2;
			String username = "ls";
			
		//5、将用户传递过来的id和username复制到动态sql的?处,作为条件
			ps.setInt(1, id);
			ps.setString(2, username);
		//注意:在这一步复制的时候,1代表第一个问号,2代表第二个问号,
			//问号是从小标1开始的,不是0.
			
		//6、使用ps调用executeQuery()方法,
					//并将查询到的结果集接收,ResultSet表示结果集
			ResultSet resultSet = ps.executeQuery();
				
		//7、输出查询到的结果
			while (resultSet.next()) {
			    System.out.println("ID为:"+resultSet.getInt("id"));
			    System.out.println("用户名为:"+
			        resultSet.getString("username"));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e){ 
			e.printStackTrace();
		}
	}
}

    3、使用属性文件和封装sql执行方法来操作数据表。

        属性文件:就是将一些不改变的代码写入一个文件中,通过调取这个文件直接就可以实现连接。同时在更改数据库信息的时候就只需要更改属性文件即可。不需要更改指定的代码。


具体实例:

    (1)、建立属性文件。

        在项目的“SRC”一级目录下新建一个文件。new-->Other-->输入Text file就可以创建了。将相关的属性写入到这个文件中

    #连接jdbc的属性文件

    driver = com.mysql.jdbc.Driver
    URL = jdbc:mysql://localhost:3306/test
    username = root
    password = 123456

    命名为:jdbc.properties文件。

    

    (2)、创建JdbcMethod类。用来封装相应的方法。并连接对应的属性文件。

package www.com.c2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

//主要用于封装使用动态sql的所有方法。以及数据库的属性文件连接
	//注意:我们再属性文件jdbc.properties中已经将各种属性写好了,我们只需要应用。

public class JdbcMethod {

//1、使用构造函数建立数据库连接:
//   在jdbctest类中是创建该类的对象,
//   我们可以直接通过构造函数来建立连接,因为构造函数是在创建对象的时刻就执行代码。
	
		//  3)定义conn接收连接数据
				private Connection connection;
	
	public JdbcMethod(){
		//  1)加载属性文件
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
			String driver = bundle.getString("driver");
			String url = bundle.getString("URL");
			String user = bundle.getString("username");
			String password = bundle.getString("password");
		
			try {
				
		//	2)加载驱动
				Class.forName(driver);
		
		//	4)建立连接
			  connection = DriverManager.getConnection(url, user, password);
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
//---------------------------------------------------

//2、写动态sql
			
	// 1)、封装实现insert、update、delete操作
		public int excuteUpdate(String sql){
			
			Statement statement;
			int count = 0;
			try {
				//(1):创建sql对象
				statement = connection.createStatement();
				//(2):执行更新语句
				count = statement.executeUpdate(sql);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return count;
		}
	// 2)、封装实现查询语句
		public ResultSet excuteQuery(String sql){
			Statement statement;
			ResultSet rs = null;
			
			try {
				//(1):创建sql对象
				statement = connection.createStatement();
				//(2):执行相关的查询语句
				rs = statement.executeQuery(sql);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return rs;
		}
			
//3、使用带多个问号的方式封装动态sql的查询【★★★★★】
		/**
		 * @param sql:是需要执行的查询,可以带问号或者不带问号。
		 * @param ...:代表不可预估的带问号的个数。
		 * @param params:在sql中需要的参数
		 * @return	【执行查询】
		 */
		public ResultSet excuteQuery(String sql , Object ... params ){
		
			PreparedStatement preparedStatement;
			ResultSet resultSet = null;
			
			try {
				//调取执行sql的方法,
				preparedStatement = connection.prepareStatement(sql);
				
				//判断sql语句中是否带有?。
				if (params != null && params.length > 0){
					//如果有就对问号进行赋值
					for (int i = 0; i < params.length; i++) {
					preparedStatement.setObject(i+1 , params[i] );
					}
				}
				
				resultSet = preparedStatement.executeQuery();
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return resultSet;
		}
}

    (3)、新建一个JdbcTest类,带有主函数。

package www.com.c2;

import java.sql.ResultSet;

//主要调取封装的动态sql的方法,

public class JdbcTest {

	public static void main(String[] args) {
		
		JdbcMethod jdbcMethod = new JdbcMethod();
		
	//创建相应的sql语句去操作数据表。
		int inser = jdbcMethod.excuteUpdate("insert into emp values()");
		int update = jdbcMethod.excuteUpdate("update emp set  where");
		int delete = jdbcMethod.excuteUpdate("delete from emp where....");
		
	//2、执行查询语句、返回的是结果集
		ResultSet resultSet = jdbcMethod.excuteQuery("select* from emp where ");			
	}
}


四、结束语

    到这里我们就把JDBC的一些常用的方法说完了,记住,连接数据库无须就对表中数据的增删改查。一定要掌握使用动态sql的方法去操作数据库和思想。

本文出自 “程序猿” 博客,转载请与作者联系!

以上是关于java中的JDBC的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate基本CRUD

JavaWeb_JDBC

JDBC

java中的JVM解析

java-JDBC

JDBC Java连接被拒绝:连接[重复]