把数据存在可掉电式设备中供以后使用 为持久化
JPA
在JAVA中数据库存取技术只能通过jdbc来访问数据库
1.使用jdbc自身得API去访问数据库服务器
2.间接使用工具去访问
jdbc:
1):加载注册驱动(jdk后就不用加载 但是javaweb中不支持 所以还是加载的好)
class.forname(“com.mysql.jdbc.Driver”) mysql得驱动
会加载com.mysql.jdbc.Driver加载进JVM 然后当一份字节码呗加载进JVM时会有该字节码得静态代码块
2):获取连接
通过DriverManager的getConnection方法来连接对象
DriverManeger.getConnection(url,username, password )
URL:jdbc:mysql://localhost:3307/数据库的名称(jdbcdemo)
如果连接本机的MYSQL且端口默认的3306 则可以简写
检测获取的连接:使用MySQL的命令 show processlist
Class.forName("com.mysql.jdbc.Driver");
//连接
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3307/jdbcdemo", "root", "admin");
操作jdbc
1):加载注册驱动
2):获取连接对象Connection对象
3):创建一个语句对象
Connection类中
createStatement();创建一个静态语句对象 返回Statemente
4):执行SQL语句
Statement 用于执行静态的SQL语句(写死的SQL语句)并把SQL语句发送到数据库中 并返回执行结果
在Statement中有方法:
int executUpdate(String sql ); 执行一个DML/DDL语句 增删改或者建表 删表等
执行DML返回的时受影响的行数
执行DDL返回0 无意义
5):释放资源
创建一张学生信息表: 包含id name age
SQL语句
CREATE TABLE a_student(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
age INT
);
@Test
public void test1() throws Exception {
//加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//连接`
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3307/jdbcdemo", "root", "admin");
//创建语句对象
String str=" CREATE TABLE a_student(id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),age INT);";
Statement st=conn.createStatement();
//执行SQL语句
int row= st.executeUpdate(str);
//释放资源
st.close();
conn.close();
System.out.println(row);
}
执行DML的操作跟DDL一样 只有SQL语句不一样
插入:
@Test
public void testadd() throws Exception {
String str="INSERT INTO a_student (name,age) VALUES ('乔峰',20) ;";
//加载注册
Class.forName("com.mysql.jdbc.Driver");
//连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3307/jdbcdemo", "root", "admin");
//创建语句对象
Statement st=conn.createStatement();
//执行
st.executeUpdate(str);
//释放
st.close();
conn.close();
}
查询:
Statement类中有方法executQuery(SQL) 表示查询语句 返回一个ResultSet对象
而ResultSet中含有getXXX(String 列名) 可获取值
@Test
public void testserch() throws Exception {
//查询
String str="SELECT * FROM a_student ";
//加载注册
Class.forName("com.mysql.jdbc.Driver");
//连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3307/jdbcdemo", "root", "admin");
//创建语句对象
Statement st=conn.createStatement();
//执行
ResultSet rs= st.executeQuery(str);
while(rs.next())
{
String strr=rs.getString("name");
System.out.println(strr);
}
//释放
rs.close();
st.close();
conn.close();
}
//****************************************************************************************DAO设计************************************
DAO:数据访问接口 封装了数据的增删改查 CRUD
客户端调用DAO中的方法 DAO去访问数据库 并接受DAO方法的返回
然后传给客户端DAO对象.save 其中有个domain模型对象用于数据中转其行程为
DAO组件:
DAO接口:
DAO实现类
DAO测试类:
包名的规范 package 域名倒写。模块名称。组件名称
package cn.bdqn.smis.domain 用来所有的domain类
package cn.bdqn.smis.dao 存储所有的DAO接口
package cn.bdqn.smis.dao.impl 存储所有DAO接口的实现类
package cn.bdqn.smis.test 用来存储DAO组件的测试类
类名和接口名的规范:
domain类:存储在domain包中,用于描述一个个对象 比如student employ是一个javabean包含get set方法
DAO接口:存储到DAO包中,用于声明CRUD操作 起名IXxxDAO或者IXxxDAO 注I后面的字母大写
dao实现类:存储到dao.impl包中用于表示一个dao接口的实现类,必须实现DAO接口 起名XxxDAOImpl 或者 XxxDaoImpl
DAO测试类:DAO接口来生成的 XxxDAOTest 该测试类中应该包含该DAO中每一个方法的测试方法
开发步骤:
1.先创建一张表,储存信息:a_student
2.建立domain包和domain类: student
3.建立DAO包和DAO接口
4.建立DAO。impl包和实现类
5.根据DAO接口创建一个测试类
6.编写实现类的方法
7.每编写一个方法 就测试一个方法
连接数据库的四要素
驱动名称 url 用户 密码
预编译语句对象PreparedStatement
String str1=”INSERT INTO a_student (age,name) VALUES (?,?)”;
//声明
Connection conn=null;
Statement sta=null;
PreparedStatement ps=null;
try{
//加载
//连接
conn=JdbcUtil.getConn();
//创建
//sta=conn.createStatement();
//创建预编译语句对象
ps= conn.prepareStatement(str1);
//设置占位符的值
ps.setInt(1, stu.getAge());
ps.setString(2, stu.getName());
//执行
//sta.executeUpdate(str);
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.deleteClose(conn, ps, null);
}
}
数据库连接池:数据库的连接特别昂贵,要充分利用,保证重复利用;
连接池里存储多个连接 且与数据库连接在一起 相当于一个缓存
连接池具有的属性:
1):连接数据库的四要素
2):初始连接数
3):最大连接数
4):最小连接数
5):最大的空闲时间
6):最大等待时间
使用:
javax.sql.dataSource和jdbc一样是接口,由第三方组织提供
DBCP:Spring推荐
druid:阿里巴巴推荐(德鲁伊)
没有连接池 使用连接池
如何获取连接: DriverManager DataSource对象。getConnection
释放连接: con.close 和数据库断开连接 con.close 还给连接池还可以使用
DataSource的创建 不同的数据库连接池,就是在创建DataSource的方式上不一样
DBCP:jar包
private static Properties p=new Properties();
private static DataSource ds=null;
static
{
InputStream in=Thread.currentThread()
.getContextClassLoader().getResourceAsStream(“db.properties”);
try {
p.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static DataSource dataSourcecreat(){
try {
ds=BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ds;
}
druid :德鲁伊
事务:transaction tx是指一组逻辑操作,不论成功或者失败都作为一个整体进行工作,要么全部执行,要么全不执行
事务的两个动作
提交 commbit:当整个事务中所有的逻辑操作都正确执行完
回滚 rollback:当整个事务中有一个或者多个逻辑操作失败的时候,回滚到最初的状态
事务的4(acid)个特征:
1.原子性(atomicity)事务时应用中不可再分的最小逻辑执行单位体,要么执行,要么都不执行
2.一致性(consistency):事务结束后,数据库内的数据都是合法正确的;
3.隔离性(isplation):并发执行的事务间相互独立,互不可干扰。
4.持久性(durability):事务提交后,数据时永久性的,不可回滚。
只有增删改有事务,查询可以不要事务
再缺省的情况下 事务时自动提交的:将两个事务合并为一个事务 手动提交
设置取消自动提交 Connection对象.setAutoComit(false)
try{
操作1;
操作2;
操作3;
Connection对象.commit();提交事务
}catch(Exception e)
{//处理异常
回滚Connection对象.rollback;
}finally{
}
批处理操作(batch):成批插入或者记录时让数据库一次执行多个SQL语句
addBatch(String):添加到批处理语句或是参数(模板)
executrBatch:执行批量处理语句
mysql不支持批处理操作
但是将jdbc驱动的url改成 url=jdbc:mysql://localhost:3307/jdbcdemo?rewriteBatchedStatements=true 后对PreparedStatement批处理有效对Statement无效 jdbc5.1.13版本后
大数据类型的操作:
BLOB:可变的数据类型,一般再开发中不会将二进制的文件(图片,视频,音频)存放再数据库中,而是将其地址存放再数据库中