javaSE基础:JDBC编写基础

目录

1、JDBC基础编写

2、编写工具类


1、JDBC基础编写

/*	使用图形化工具操作数据库:步骤:1、连接数据库
				1.1、启动mysql:
					管理员身份运行cmd:net start【stop】 mysql	密码:123123
				1.2、图形化界面连接数据库
JDBC:Java DataBase Connectivity 	java语言操作数据库
	JDBC本质:官方(sun公司)定义的操作所有的关系型数据库的规则(接口);各个数据库厂商去实现这套接口,提供数据库驱动jar包。
											我们可以使用这套接口编程,真正执行代码的是驱动jar包中的实现类
	快速入门:【注意:mysql8驱动版本必须设置时区和设置驱动为com.mysql.cj.jdbc.Driver】
		步骤:1、导入驱动jar包
				1.1、赋值jar包到项目的libs目录下
				1.2、Add As Library
			2、注册驱动
			3、获取连接对象,Connection
				 String url="jdbc:mysql://localhost:3306/数据库名" +
                    "?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT";//设置编码方式为UTF-8 设置数据库时间标准为东八区
					Unicode;Encode:编码		timezone:时区    userssl:关闭证书验证【下有补充】
			4、定义sql语句
			5、获取执行对象,Statement
			6、执行sql,接受返回结果
			7、处理结果
			8、释放资源
*/
/*详解创建的各个对象:
	1*、DriverManager接口:驱动管理对象
		功能:1、注册驱动	【.5之后的驱动jar包可以省略】
				static void registerDriver(Driver driver) 	向DriverManager 注册给定驱动程序。	
				写代码的话用	例子:Class.forName("com.mysql.cj.jdbc.Driver");
					通过查看源码发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块
					static {
						try {
								DriverManager.registerDriver(new Driver());
							} catch (SQLException var1) {
								throw new RuntimeException("Can't register driver!");
							}
						}
			  2、获取数据库连接
				static Connection getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。 
				参数:url:指定连接的路径,
						语法:jdbc:mysql://ip地址(域名):端口号/数据库名称	//.5jar版本
						例子:"jdbc:mysql://localhost:3306/db1"
						细节:如果连接的是本机的mysql服务器,并且mysql服务默认为3306;则url可以写为:jdbc:mysql://数据库名称	
					  user:用户名,
					  passwd:密码
				
	2*、Connection接口:数据库连接对象
		功能:1、获取执行sql的对象
					Statement createStatement()  
					PreparedStatement prepareStatement(String sql)  
			  2、管理事务
					开启事务
						void setAutoCommit(boolean autoCommit) 	调用该方法设置参数为false,即开启事务
					提交事务
						 void commit()  
					回滚事务
						void rollback() 
		
	3*、Statement:执行sql的对象	java.sql
		功能:1、执行sql
					boolean execute(String sql) 可以执行任意sql【了解】 
					int executeUpdate(String sql 执行DML语句【返回影响行数】、DDL语句【返回0】	
						返回值:数据库中影响的行数	返回值>0 执行成功
					 ResultSet executeQuery(String sql) 执行DDL语句
			
	4*、ResultSet:结果集对象
		功能:封装查询结果
				 boolean next():游标向下移动一行;判断当前行是否是最后一行末尾【是否有数据;true--有数据】
				 xxx getXxx(参数):获取数据	其中,Xxx是数据类型
					参数:1、int:代表列的编号,从1开始
						2、String:代表列的名称
				注意:使用步骤:
					1、游标向下移动一行
					2、判断是否有数据
					3、获取数据
					
	5*、PreparedStatement:执行动态sql的对象 Statement的子类

补充:
  SSL协议提供服务主要:
1)认证用户服务器,确保数据发送到正确的服务器;    .
2)加密数据,防止数据传输途中被窃取使用;
3)维护数据完整性,验证数据在传输过程中是否丢失;
当前支持SSL协议两层:
SSL记录协议(SSL Record Protocol):建立靠传输协议(TCP)高层协议提供数据封装、压缩、加密等基本功能支持
SSL握手协议(SSL Handshake Protocol):建立SSL记录协议用于实际数据传输始前通讯双进行身份认证、协商加密算法、 交换加密密钥等。

 */
/*PreparedStatement和Statement:
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高???
详解:
	1、PreparedStatement:表示预编译的 SQL 语句的对象。
	 接口:public interface PreparedStatement extends Statement之间的继承关系
	 SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
	 注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.以此类推。
	 如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
	 在以下设置参数的示例中,con 表示一个活动连接:
	 PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
	 pstmt.setBigDecimal(1, 1533.00)
	 pstmt.setInt(2, 1102)
	 pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment */
//使用PrepareStatement
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class PreparedStatementTest {
	public static void main(String[] args) {
		test_autoCommit();
	}
	public static  void test_autoCommit()
	{
		String driver="oracle.jdbc.driver.OracleDriver";
		String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		String user="admin";
		String password="admin";
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			//1、注册驱动
			Class.forName(driver);
			//2、获取连接
			 conn= DriverManager.getConnection(url, user, password);
			 //System.out.println(conn);
			//3、创建prepareStatement对象
			 String sql="insert into lover values(?,?,?)";
			 ps=conn.prepareStatement(sql);
			 //4、执行sql语句
			 ps.setInt(1,21);//代表设置给第一个?号位置的值为Int类型的21
			 ps.setString(2,"suwu150");//代表设置给第二个?号位置的值为String类型的suwu150
			 java.util.Date utilDate=new java.util.Date();//进行类型转换,由util类型的date转化为sql类型的
			 ps.setDate(3, new java.sql.Date(utilDate.getTime()));
			 //ps.execute();//执行
			 System.out.println(ps.execute());//执行表输出返回的结果,结果为false,因为没有返回的结果集
			 //5、处理结果集
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			//6、关闭资源
			try {
				if(ps!=null)ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null)conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}	

 

//使用Statement
public class Jdbc05 {
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        try {//1
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2 、获取连接对象
            String url="jdbc:mysql://localhost:3306/db1"+
                    "?useUniocde=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT";
            conn = DriverManager.getConnection(url, "root", "123123");
            //3 定义sql
            String sql="select * from student";
            //4 获取执行sql对象
            stmt = conn.createStatement();
            //5 执行sql   创建结果集对象
            rs = stmt.executeQuery(sql);
            int count=rs.getMetaData().getColumnCount();//通过结果集元数据,得到列数
            //6 处理结果
            //6.1 让游标向下移动一行
           while(rs.next()){//循环判断游标是否是最后一行末尾 //和迭代器相似
                //6.2 获取数据
               for (int i = 1; i <= count; i++) {//光标从1开始
                   System.out.print(rs.getString(i));
                   if(i<count) System.out.print(",");
               }
               System.out.println();
            }
            //7 释放资源
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally{
            if(rs!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

2、编写工具类

1、编写jdbc.properties文件

//jdbc.properties
url=jdbc:mysql://localhost:3306/db1?useDemode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT
user=root
password=123123
driver=com.mysql.cj.jdbc.Driver

2、编写工具类

/*
*获取连接需求:不想传递参数(麻烦),还要保证工具类的通用性。
* 解决方案:配置文件
*   jdbc.properties
*       url=
*       user=
*       password=
* 文件的读取只需读取一次。使用静态代码块完成
*  */
public class JDBCUtils {
    private static String url;//静态变量才能被静态代码块和静态方法访问
    private static String user;
    private static String password;
    private static String driver;

    static{
        //读取配置文件,获取值
        //1 Properties集合类
        Properties pro=new Properties();
        try {
            /* 2 加载文件 */
            //获取配置文件路径的方式 ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");//获取统一资源定位符 定位文件路径
            String path = res.getPath();//获取字符串路径
            System.out.println(path);///E:/IdeaProjects/java_lianxi/out/production/java_lianxi/jdbc.properties
           // pro.load(new FileReader("src/jdbc.properties"));
            pro.load(new FileReader(path));
            //3 获取属性
            url=pro.getProperty("url");
            System.out.println(url);
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            //4 注册驱动
            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取连接方法
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    //释放资源方法
    public static void close(Statement stmt, Connection conn){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    //释放资源重载方法
    public static void close(ResultSet rs,Statement stmt, Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

3、编写封装数据的Javabean

//(id,name,age,sex,address,math,english)
//对应封装student表数据的JavaBean
public class Stu {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;
    private int math;
    private int english;

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", math=" + math +
                ", english=" + english +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值