JAVA数据库连接技术
与数据库建立连接、执行SQL语句、处理结果
DriverManager:(工具类)
获取连接
管理JDBC驱动
Connection:(接口)
1.获取执行sql的对象
2.事务管理
负责数据库连接并传送数据任务
Statement:
负责执行SQL语句
ResultSet:
负责保存结果(结果集)
加载JDBC驱动
Class.forName(........);
建立与数据库连接
Connection con=DriverManager.getConnection(URL,数据库用户名,密码);
"jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT","用户名","密码"
发送SQL语句得到结果集
//获取执行SQL语句对象
Statement stmt = con.createStatement();
//得到结果集
ResultSet rs = stmt.executeQuery(String sql);
释放资源
rs.close();
stmt.close();
con.close();
ResultSet executeQuery(String sql)//执行sql查询并获得结果集
int executeUpdate(String sql)//可以执行插入、删除、更新等操作,返回的是执行操作影响的行数
boolean execute(String sql)//执行任意sql语句,获得一个布尔值,表示是否返回ResultSet
void close()//关闭
boolean next()//将游标从当前位置向下移动一行
boolean previous()//游标从当前位置向上移动一行
void close()//关闭ResultSet 对象
int getInt(int colIndex)//以int形式获取结果集当前行指定列号值
int getInt(String colLabel)//以int形式获取结果集当前行指定列名值
float getFloat(int colIndex)//以float形式获取结果集当前行指定列号值
float getFloat(String colLabel)//以float形式获取结果集当前行指定列名值
String getString(int colIndex)//以String 形式获取结果集当前行指定列号值
String getString(String colLabel)//以String形式获取结果集当前行指定列名值
优点
1.提高代码的可读性与可维护性
2.提高sql语句的执行性能
3.提高了安全性
举例
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/epet",
"epetadmin", "0000");
// 3、更新狗狗信息到数据库
String sql="update dog set health=?,love=? where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 80);
pstmt.setInt(2, 15);
pstmt.setInt(3, 1);
pstmt.executeUpdate();
pstmt.setInt(1, 90);
pstmt.setInt(2, 10);
pstmt.setInt(3, 2);
pstmt.executeUpdate();
logger.info("成功更新狗狗信息!");
} catch (SQLException e) {
logger.error(e);
} finally {
// 4、关闭Statement和数据库连接
try {
if (null != pstmt) {
pstmt.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
logger.error(e);
}
}
}
将程序中的数据在瞬时状态和持久状态间转换的机制即为数据的持久化
1.提高可读性
2.利于后期维护与修改
3.增强代码的复用性
4.降低代码之间的耦合
5.隔离业务逻辑代码与数据库访问代码
6.隔离不同的数据库的实现
定义实体类
public class Pet{
private int id;// 宠物id
private int masterId;// 主人id
private String name;// 昵称
……
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
……
}
对实体类的所有操作抽取成接口
public interface PetDao{
int save(Pet pet);
int del(Pet pet);
int update(Pet pet);
Pet getByName(String name);
List findByName(String name);
List findByType(String type);}
创建BaseDAO(待改良)
public class BaseDao{
private String driver = " com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/epet";
… …
public Connection getConnection() {
… …
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
… …
return conn;
}
public void closeAll(Connection conn, Statement stmt,ResultSet rs) {
if(rs != null) rs.close();
if(stmt != null)stmt.close();
… …
}
public int exceuteUpdate (String preparedSql, Object[] param) {
… …
conn = getConnection();
try {
pstmt = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
//为预编译sql设置参数
pstmt.setObject(i + 1, param[i]);
}
}
num = pstmt.executeUpdate();
} … …
}
}
实现类实现接口并继承数据库工具类
public class PetDaoMySQLImpl2 extends BaseDao implements PetDao{
//更新宠物状态
public int update(Pet pet) {
String sql="update pet set status=0 where id=?";
Object[] param={pet.getId()};
int result=this.exceuteUpdate(sql, param);
return result;
}
//省略实现PetDao的其他方法
}
添加.properties文件
调用properties方法
String getProperty(String key)//用指定的键在此属性列表中搜索属性。通过参数key得到其所对应的值
Object setProperty(String key,String value)//调用Hashtable的方法put。通过调用基类的put()方法来设置键-值对
void load(InputStream inStream)//从输入流中读取属性列表 (键和元素对)。通过对指定文件进行装载获取该文件中所有键-值对
void clear()//清除所装载的键-值对,该方法由基类Hashtable提供
public class BaseDao {
//省略变量定义代码……
static{
init();}
public static void init(){
Properties params=new Properties();
String configFile = "database.properties";
InputStream is=BaseDao.class.getClassLoader()
.getResourceAsStream(configFile);
try {
params.load(is);
} catch (IOException e) {//….}
driver=params.getProperty("driver");
url=params.getProperty("url");
user=params.getProperty("user");
password=params.getProperty("password");
} //省略其他方法代码……}
属性一般使用private修饰
提供public修饰的getter/setter方法
实体类提供无参构造方法,根据业务提供有参构造
实现java.io.Serializable接口,支持序列化机制
如果不实现这个接口,在某些数据持久框架下进行数据持久化会出现问题。hibernate就是这样的