JDBC:Java Database connection
Java定义了一套接口没有实现类
导jar包:jar包的本质就是一个压缩包,java发明的一种压缩格式 导入导出的机制
手动到jar包:
建lib文件:粘贴复制进去 lib包 --点击modules查看jar包的导入情况
1.建立网络连接,数据库连接
连接字符串 用户名 密码
jdbc:mysql://[ip地址]:[端口号]/[要连接的database名]
声明最好放在外边
Connection conn = null; conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/demo2useUnicode=true&characterEncoding=utf-8”,“root”,“xxx”);
//1.建立网络连接,数据库连接
//连接字符串 用户名 密码
//jdbc:mysql://[ip地址]:[端口号]/[要连接的database名]
Connection conn = null;
Statement sta = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8","root","xxx");
//2.从连接中获得sql语句执行的对象
sta =conn.createStatement();
//3.定义一条sql语句
String sql = "insert into sc values('0821101','c002',56)";
//4.执行sql语句得到结果
//此时的update不是指的数据库的update语句,而是指的是能改变数据的语句
//一个int的返回值代表着你这条语句影响了数据库中多少行
int count = sta.executeUpdate(sql);
//5.处理结果
if (count>0){
System.out.println("数据插入成功");
}else{
System.out.println("数据插入失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
ORM映射:ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射
是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
//增删改查“ 只需改变sql”语句
//executeUpdate的返回值是int类型-------指示受影响的行数(即更新计数)
//executeQuery的返回值是resultSet类型------用于产生单个结果集的语句
orm映射理论****Object Relational Mapping,简称ORM
//数据库中的一条数据映射成一个java对象
Course c = new course;
c.setCno(rs.getString("Cno"));
c.setCname(rs.getString("Cname"));
c.setCredit(rs.getInt("Credit "));
c.se6tSemester(rs.getInt("Semester"));
//将这个对象存入到集合中
courseList.add(c)
jdbc的步骤
1.打开连接
2.获得sql语句执行对象
3.定义了一条spl语句
4.执行sql
5.处理结果集
简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。 一般基本都是如下几个步骤:
1、建立数据库连接,获得 Connection 对象。
2、根据用户的输入组装查询 SQL 语句。
3、根据 SQL 语句建立
Statement 对象 或者 PreparedStatement 对象。
4、用 Connection 对象执行 SQL语句,获得结果集
ResultSet 对象。
5、然后一条一条读取结果集 ResultSet 对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句。
8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。
7、最后依次关闭各个 Statement 对象和 Connection 对象
代码分层**:DAO:datebase Access Object**
数据访问对象是一个面向对象的数据库接口,
列:deleteCourseByCno :根据Course表主键删除一条数据
1.dao包
2.一个DAO类接口只操作一个表
3.创建一个子包impl
①删除 int deleteCourseByCno(String cno);
public class CourseDAOImpl implements CourseDAO {
@Override
public int deleteCourseByCno(String cno) {
Connection conn = null;
Statement sta = null;
int row = 0;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8", "root", "xxxx");
sta = conn.createStatement();
String sql = "delete from course where cno ='" + cno + "'";
row = sta.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
if (sta != null) {
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return row;
}
②增加
int insertCourse(Course course);
String sql = "insert into course values('"+ course.getCno() +"','"+course.getCname() +"','" +
+course.getCredit() + "','"+course.getSemester()+"')";
③修改
int updateCourseByCno(Course course);
String sql = "update course set cname = '"+course.getCname()+"',credit = "+course.getCredit()+",semester="+course.getSemester() +" where cno ='"+course.getCno()+"'";
④查询
List listCourse();
String sql = "select * from course";
sql注入:是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
Statement有一个致命的bug叫sql注入:
Connection conn = null;
Statement sta = null;
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8", "root", "sr19961128");
sta = conn.createStatement();
ResultSet rs = sta.executeQuery(sql);
*PreparesStatement预编译的sql语句执行载体:①操作方便②
使用?进行占位
String sql = "select * from s_user where username = ? and password = ?";
PreparedStatement psta = conn.prepareStatement(sql);
//执行sql之前给所有?设置值
//第一个参数设置的是那个问号,这是从1开始ide
psta.setString(1, "admin");
psta.setString(2, "1234");
ResultSet rs = psta.executeQuery();
conn.setAutocommit(false);//禁止自动提交
连接池
druid:阿里的产品,执行效率不是最高,功能多 jar包
从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。
数据库连接池的主要操作如下:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
DruidDataSource druidDataSource = new DruidDataSource();
//必须写
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8&useSSL=false");
druidDataSource.setUsername("root");
druidDataSource.setPassword("xxxx");