一、连接数据库步骤
- 加载驱动(反射)
- 获取连接(DriverManager.getConnection())
- 获取执行SQLl语句对象(Statement,PrepareStatement)
- 执行SQL语句(CRUD)
- 处理结果集(ResultSet或者Int Boolean)
- 关闭资源(Close)
注意:Java Project连接数据库前需要添加mysql-connector-java.jar
包。
二、连接数据库
//获得数据库连接
public Connection getSqlConn(){
try{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){}
// 获得连接
// url:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url, "root", "root");
return conn;
}
Oracle URL: String url = "jdbc:oracle:thin:@localhost:3306:数据库名称";
三、Statement和PrepareStatement比较
PrepareStatement(预处理)和Statement相比,有三个优点:
- 无须拼接SQL语句,提高代码的可读性
- 预编译SQL语句,提高了代码的灵活性和执行效率
- 防止SQL注入,更加安全
浅谈 JDBC 中 Statement 和 PrepareStatement 的区别与优劣
四、executeQuery( )/executeUpdate( )/execute( )
JDBC中Statement 接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate 和 execute,使用哪一个方法由 SQL 语句所产生的内容决定。
1. executeQuery
用于产生单个结果集(ResultSet)的语句,这个方法被用来执行select
语句,执行后返回查询结果的ResultSet对象。
2. executeUpdate
用于执行insert/update/delete
语句以及 SQL DDL(数据定义语言)语句,如create table
和drop table
。executeUpdate(sql) 的返回值是一个整数(int),为更新条数(即受影响的行数)。对于 create table 或 drop table 等不操作行的语句,executeUpdate 的返回值为零。
3. execute
可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。通常没有必要使用execute方法,除非在不清楚SQL语句的类型时则只能使用execute方法。
五、工具类
1. 增、删、改
public boolean updateByPreparedStatement(String sql, List<Object>params)
throws SQLException{
boolean flag = false;
int result = -1;
pstmt = connection.prepareStatement(sql);
int index = 1;
if(params != null && !params.isEmpty()){
for(int i=0; i<params.size(); i++){
pstmt.setObject(index++, params.get(i));
}
}
result = pstmt.executeUpdate();
flag = result > 0 ? true : false;
return flag;
}
2. 单条查找
public Map<String, Object> findSimpleResult(String sql, List<Object> params)
throws SQLException{
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !params.isEmpty()){
for(int i=0; i<params.size(); i++){
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery(); //返回查询结果
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while(resultSet.next()){
for(int i=0; i<col_len; i++ ){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
return map;
}
3. 多条查询
public List<Map<String, Object>> findModeResult(String sql, List<Object> params)
throws SQLException{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !params.isEmpty()){
for(int i = 0; i<params.size(); i++){
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while(resultSet.next()){
Map<String, Object> map = new HashMap<String, Object>();
for(int i=0; i<cols_len; i++){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
return list;
}
4. 单条查找(反射)
public <T> T findSimpleRefResult(String sql, List<Object> params,Class<T> cls )
throws Exception{
T resultObject = null;
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !params.isEmpty()){
for(int i = 0; i<params.size(); i++){
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while(resultSet.next()){
//通过反射机制创建一个实例
resultObject = cls.newInstance();
for(int i = 0; i<cols_len; i++){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true); //打开javabean的访问权限
field.set(resultObject, cols_value);
}
}
return resultObject;
}
5. 单条查找(反射)
public <T> List<T> findMoreRefResult(String sql, List<Object> params,Class<T> cls )
throws Exception {
List<T> list = new ArrayList<T>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !params.isEmpty()){
for(int i = 0; i<params.size(); i++){
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while(resultSet.next()){
//通过反射机制创建一个实例
T resultObject = cls.newInstance();
for(int i = 0; i<cols_len; i++){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true); //打开javabean的访问权限
field.set(resultObject, cols_value);
}
list.add(resultObject);
}
return list;
}