JDBC与mysql

JDBC

JDBC是"Java Database Connective"的缩写,表示使用Java去连接数据库进行数据操作的过程

Mysql的JDBC

使用Java连接Mysql需要先创建动态的wed项目(Dynamic wed Project),然后在导入驱动连接包

数据库连接代码

public class TestMysql {
	//连接地址
	private static String URL="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true";
	//导入的驱动连接包中驱动的名称
	private static String DRIVER="com.mysql.jdbc.Driver";
	//数据库用户名
	private static String USER="root";
	//数据库密码
	private static String PASSWORD="123456";
	//利用静态代码块来加载驱动信息
	static {
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws SQLException {
        //利用DriverManager.getConnection()方法获取到连接对象
		 Connection conn= DriverManager.getConnection(URL,USER,PASSWORD);
        //输出conn对象信息
		 System.out.println(conn);

	}

}

注意:地址信息URL也可以写成:"jdbc:mysql://localhost:3306/demo"但是这样写可能存在中文乱码或者数据安全的风险.

useSSL= true;表示在程序和数据库之间进行数据交互的时候使用加密的方式传输数据

useUnicode=true&characterEncoding=utf8:表示在数据传输的过程中进行编码转换

使用JDBC添加数据

取得数据库的连接之后,如果需要操作数据库还需要使用获得的连接对象来获取发送sql语句的对象.

发送sql语句的对象需要使用到的Connection的一些方法

void close ( ) throws SQLException 

立即释放此 Connection 对象的数据库和 JDBC 资源.

Statement createStatement ( )  throws SQLException 

创建一个 Statement 对象来将 SQL 语句发送到数据库。如果是不带参数的 SQL 语句通常使用 Statement 对象执行。如果是多次执行相同的 SQL 语句,建议使用PreparedStatement 对象可能更高效

void commit() throws SQLException

提交事务,并释放放此 Connection 对象当前持有的所有数据库锁

void rollback() throws SQLException

取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。

void setAutoCommit(boolean autoCommit)  throws SQLException

设置此连接的提交模式为给定的状态(true 为开启自动提交模式 ,false为关闭自动提交模式)。如果连接处于自动提交模式下,则它的所有 SQL 语句将被自动提交。否则,只有自己手动调用 commit 方法或 rollback 方法。默认情况下,新连接处于自动提交模式

PreparedStatement prepareStatement(String sql) throws SQLException

创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

PreparedStatement中的发送sql语句相关的方法

ResultSet executeQuery() throws SQLException

执行 SQL 查询,并返回该查询生成的 ResultSet 对象。

int executeUpdate() throws SQLException

执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERTUPDATEDELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

使用JDBC插入数据
public class TestMysql {
	//连接地址
	private static String URL="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true";
	//驱动的名称
	private static String DRIVER="com.mysql.jdbc.Driver";
	//数据库用户名
	private static String USER="root";
	//数据库密码
	private static String PASSWORD="123456";
	//利用静态代码块来加载驱动信息
	static {
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws SQLException {
         //取得连接对象
		 Connection conn= DriverManager.getConnection(URL,USER,PASSWORD);
         //准备sql语句
		 String sql ="INSERT INTO emp(empno,ename,job,sal,comm,deptno) VALUES(2288,'赵六','清洁工',5999,300,20)";
         //取得发送sql语句的对象
		 PreparedStatement pst = conn.prepareStatement(sql);
         //获取到数据更新的行数
		 int a = pst.executeUpdate();
		 System.out.println(a);
	}

}

在这里插入图片描述

更新数据与事务处理

数据更新的时候可能会需要考虑到事务的原子性,一个事务中的多个操作要么都失败要么都成功.

public class ConnectionUtil {

	private static String URL="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false";
	
	private static String DRIVER="com.mysql.jdbc.Driver";
	
	private static String USER="root";
	
	private static String PASSWORD="123456";
	
	
	static {
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		try {
            //调用TransferAccounts方法KING给TURNER转账200元
			boolean flag = TransferAccounts(200.0,"KING","TURNER");
            //打印是否成功
			System.out.println(flag);
		} catch (SQLException e) {
			
			e.printStackTrace();
		}	
		
	}

	/**
	 * 			
	 * @param menoy 需要转账的金额
	 * @param name1	转账人
	 * @param name2   接收人
	 * @return  返回是否成功
	 * @throws SQLException
	 */
	private static boolean TransferAccounts(double menoy ,String name1 ,String name2 ) throws SQLException {
        //如果有一个或多个姓名为空则抛出异常
		if(name1==null || name2==null) {
			throw new SQLException("名字不能为空");
		}
		int a = 0;
		int b = 0;
		Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
		try {
            //关闭自动提交
			conn.setAutoCommit(false);
            //sql语句
			String sql1 = "UPDATE emp SET deposit=deposit - "+menoy+" WHERE ename ='"+name1+"'";
			String sql2 ="UPDATE emp SET deposit=deposit + "+menoy+" WHERE ename ='"+name2+"'";
			PreparedStatement pst1 =conn.prepareStatement(sql1);
			PreparedStatement pst2=conn.prepareStatement(sql2);
			a=pst1.executeUpdate();
			b=pst2.executeUpdate();
            //当姓名有误时则抛出异常
			if(a<=0||b<=0) {
				throw new SQLException("有问题啊!!!老哥!!!是不是名字输错了啊");
             //如果都没有问题就提交
			}else if(a>0&&b>0) {
				conn.commit();
			}
           //如果接收到异常则回滚数据
		} catch (Exception e) {
			e.printStackTrace();
            //接收到异常就回滚事务,保证事务的原子性
			conn.rollback();
		}finally {
			conn.close();
		}
		//返回是否成功
		return a>0&&b>0;
	}
}

没有运行程序之前

在这里插入图片描述

运行程序之后

在这里插入图片描述

批量删除数据

public class ConnectionUtil {

	private static String URL="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false";
	
	private static String DRIVER="com.mysql.jdbc.Driver";
	
	private static String USER="root";
	
	private static String PASSWORD="123456";
	
	
	static {
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws SQLException {
		
		HashSet<Integer> set = new HashSet<Integer>();
		set.add(2288);
		set.add(7369);
		set.add(7788);
		System.out.println(DeleteDate(set));
			
		
	}

	
	/**
	 * 
	 * @return
	 * 				返回一个Connection对象
	 * @throws SQLException
	 *      		
	 */
	public static Connection getConnection(){
  
		 try {
			return DriverManager.getConnection(URL,USER,PASSWORD);
		} catch (SQLException e) {	
			e.printStackTrace();
		}
		 return null;
 }
	
	/**
	 * 			批量删除
	 * @param set   编号集合 
	 * @return
	 * @throws SQLException
	 */
	public static boolean DeleteDate(Set<Integer> set) throws SQLException {
		int a =0;
		Connection conn = getConnection();
        //sql语句的前半段
		StringBuffer sql = new StringBuffer("DELETE FROM emp WHERE empno IN (");
		//拼接sql语句
        for(Integer str: set) {
			sql.append(str+",");
		}
        //删除最后一个逗号和拼接最后一个括号
		sql.delete(sql.lastIndexOf(","), sql.length());
		sql.append(")");
		try {
			PreparedStatement pst=conn.prepareStatement(sql.toString());
            //获得更新数据的条数
			a = pst.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			conn.close();
		}
		return a>0;
	}
}

查询数据

boolean next()    

将光标从当前位置向后移一行,判断是否有下一个结果,

int getInt(String columnLabel)

ResultSet 对象的当前行中指定列的值,columnLabel字段名称。

int getInt(int columnIndex)

获取此 ResultSet 对象的当前行中指定列的值, columnIndex - 第一个列是 1,第二个列是 2,……

Date getDate (String columnLabel)//同上

Date getDate(int columnIndex)

String getString(String columnLabel)

String getString(int columnIndex)
    
Object getObject(String columnLabel)
//查询数据


public class Test01 {

	public static void main(String[] args) {
		//传入name查询并打印信息
		about("TURNER");

	}

    
    /**
	 * 
	 * @param name 需要查询的姓名
	 */
	private static void about(String name) {
		if(name==null) {
			name="";
		}
		Connection conn =ConnectionUtil.getConnection();
		String sql = "SELECT empno , ename , job, sal ,comm, mgr , hiredate FROM emp WHERE ename ='"+name+"'";
		try {
			PreparedStatement pst = conn.prepareStatement(sql);
			 ResultSet rst= pst.executeQuery();
			 while(rst.next()) {
				 System.out.println("编号:"+rst.getObject("empno")+" 姓名:"+rst.getObject("ename")+" 职位:"+rst.getObject("job")+" 薪资:"+rst.getObject("sal")+" 入职日期:"+rst.getObject("hiredate"));
			 }
			 rst.close();
			 pst.close();
			 conn.close();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
	} 
}

在这里插入图片描述

分页模糊查询

public class ConnectionUtil {

	private static String URL="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false";
	
	private static String DRIVER="com.mysql.jdbc.Driver";
	
	private static String USER="root";
	
	private static String PASSWORD="123456";
	
	
	static {
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}
	}
	/**
	 * 			主方法
	 * @param args
	 * @throws SQLException
	 */
	public static void main(String[] args) throws SQLException {
		
		about(null,1,6);
		
		
	}

	

	/**
	 * 
	 * @return
	 * 				返回一个Connection对象
	 * @throws SQLException
	 *      		
	 */
	public static Connection getConnection(){
  
		 try {
			return DriverManager.getConnection(URL,USER,PASSWORD);
		} catch (SQLException e) {	
			e.printStackTrace();
		}
		 return null;
 }
	
	
	/**
	 * 			分页模糊查询
	 * @param k  模糊查询所包含的字符
	 * @param cp 页数
	 * @param ls 每页显示的数据量
	 */
	private static void about(String k , Integer cp , Integer ls) {
		if(k==null) {
			k="";
		}
		k="'%"+k+"%'";
		Connection conn = getConnection();
		String sql = "SELECT empno , ename , job, sal ,comm, mgr , hiredate FROM emp WHERE ename LIKE "+k+" LIMIT "+(cp-1)*ls+","+ls;
		try {
			PreparedStatement pst = conn.prepareStatement(sql);
			 ResultSet rst= pst.executeQuery();
			 while(rst.next()) {
				 System.out.println("编号:"+rst.getObject("empno")+" 姓名:"+rst.getObject("ename")+" 职位:"+rst.getObject("job")+" 薪资:"+rst.getObject("sal")+" 入职日期:"+rst.getObject("hiredate"));
			 }
			 rst.close();
			 pst.close();
			 conn.close();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
	} 
}

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值