java中提供了一套标准接口,数据库厂商来进行实现,包含实现子类的jar文件一般情况下存放在数据库的安装目录下,使用时需在工程中导入相应jar包
以Oracle为例,记得在使用前导入ojdbc6.jar文件,不同数据库版本需要的ojdbc文件版本不同
数据库连接的代码如下
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//如果需要建立连接,java中提供了一套标准,数据库厂商来进行实现,包含实现子类的jar文件一般情况下存放在安装目录下
public class JDBCTest {
public static void main(String[] args) throws Exception {
//1、加载驱动:
/*
* 当执行了当前代码之后,会返回一个Class对象,再此对象的创建过程中,会调用具体类的静态代码块
* */
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、建立连接
//上一步中已经经driver对象初测到了drivermanager中,所以此时可以直接通过DriverManager来获取数据库的连接
/*
* 需要输入连接数据库的参数
* url:数据库的地址
* username:用户名
* password:密码
* */
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
//3、测试连接是否成功
System.out.println(connection);
//4、定义sql语句
//只要填写正常执行的sql语句即可
String sql = "select * from emp";
//5、准备静态处理块对象,将sql语句放置到静态处理块中,理解为sql语句放置对象
/*
* 在执行sql语句的过程中,需要一个对象来存放sql语句,将对象进行执行的时候调用的是数据库的服务,数据库会从当前对象中
* 拿到对应的sql语句进行执行
* */
//Statement 在使用字符串拼接的方式拼接sql时会有sql注入的危险
//使用其子类PrepareStatement可以排除字符串拼接sql的sql注入风险
Statement statement = connection.createStatement();
//6、执行sql语句,返回值对象是结果集合
/*
* 将结果放到resultset中,是返回结果的一个集合
* 需要经过循环迭代才能获取到其中的每一条记录
*
* statement在执行的时候可以选择三种方式:
* 1、execute:任何SQL语句都可以执行
* 2、executeQueryL只能执行查询语句
* 3、executeUpdate,只能执行DML语句
* */
ResultSet resultSet = statement.executeQuery(sql);
//7、循环处理
//使用while循环,有两种获取具体值的方式,第一种通过下表索引编号来获取,从1开始,第二种是通过列名来获取,推荐使用列名,列明一般不会发生修改
while(resultSet.next()){
//通过列索引获取empno
int anInt = resultSet.getInt(1);
System.out.println(anInt);
//通过列名获取ename
String ename = resultSet.getString("ename");
System.out.println(ename);
System.out.println("-----------------");
}
//8、关闭连接
resultSet.close();
statement.close();
connection.close();
}
}
其他数据库获取驱动的方式如下:
//MySQL:
String Driver="com.mysql.jdbc.Driver"; //驱动程序
String URL="jdbc:mysql://localhost:3306/db_name"; //连接的URL,db_name为数据库名注意自己的数据库端口号
//Oracle:
String Driver="oracle.jdbc.driver.OracleDriver"; //连接数据库的方法
String URL="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
//PostgreSQL:
String Driver="org.postgresql.Driver"; //连接数据库的方法
String URL="jdbc:postgresql://localhost/db_name"; //db_name为数据库名
//DB2:
String Driver="com.ibm.dbjdbc.app.DBDriver"; //连接具有DB2客户端的Provider实例
//String Driver="com.ibm.dbjdbc.net.DBDriver"; //连接不具有DB2客户端的Provider实例
String URL="jdbc:db2://localhost:5000/db_name"; //db_name为数据库名
//Microsoft SQL Server :
String Driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //连接SQL数据库的方法
String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db_name"; //db_name为数据库名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver) ; //加载数据库驱动
Connection con=DriverManager.getConnection(URL,Username,Password);
PrepareStatement使用的基本方式
可以根据自己的数据库数据进行修改
public class EmpDaoImpl implements EmpDao {
//EmpDao接口中的一个insert方法,Emp类对数据库的一行数据进行了封装,DBUtil对数据库连接进行了封装
//该方法体展示了如何使用PrepareStatement防止sql注入
@Override
public void insert(Emp emp) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
//设置事务是否自动提交,true表示自动提交,false表示不是自动提交
// connection.setAutoCommit(true);
String sql = "insert into emp values(?,?,?,?,?,?,?,?)";
statement = connection.prepareStatement(sql);
//向问号中添加值
statement.setInt(1,emp.getEmpno());
statement.setString(2,emp.getEname());
statement.setString(3,emp.getJob());
statement.setInt(4,emp.getMrg());
statement.setDate(5,new java.sql.Date(new SimpleDateFormat("yyyy-MM-DD").parse(emp.getHiredate()).getTime()));
statement.setDouble(6,emp.getSal());
statement.setDouble(7,emp.getComm());
statement.setInt(8,emp.getDeptno());
//返回值表示受影响的行数
int i = statement.executeUpdate();
System.out.println("受影响的行数是:" + i);
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection(connection, statement);
}
}
}
使用反射简化DAO的编写Java 反射API的简介及使用
PrepareStatement 批量提交sql
//打开链接一次,插入1000条数据后提交并关闭连接
public static void insertBatch(){
Connection connection = DBUtil.getConnection();
PreparedStatement pstmt = null;
String sql = "insert into emp(empno,ename) values (?,?)";
//准备预处理快对象
try {
pstmt = connection.prepareStatement(sql);
for(int i = 0;i<1000;i++){
pstmt.setInt(1,i);
pstmt.setString(2,"hehe"+i);
//向批处理中添加sqk语句
pstmt.addBatch();
}
int[] ints = pstmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closeConnection(connection,pstmt);
}
}