JDBC是"Java Database Connective"的缩写,表示使用Java去连接数据库进行数据操作的过程
使用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:表示在数据传输的过程中进行编码转换
取得数据库的连接之后,如果需要操作数据库还需要使用获得的连接对象来获取发送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)语句,比如 INSERT
、UPDATE
或 DELETE
语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
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();
}
}
}