第五记 JDBC
了解JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API(API:Application Program Interface,应用程序接口),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
注:API就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用程序的命令。
JDBC连接数据库
1.下载对应的数据库JDBCjar包,这边使用的SQLservice的jdbc.jar包
2.创建java工程,创建lib文件夹,将下载的jar包放入lib文件夹下

3. 鼠标右击jar包进行加载

4.创建包以及相应的类、
BaseJdbcDAO.java文件负责jdbc连接数据库
Stu.java文件是封装了数据库stu表的字段,并给予了get、set方法和有参、无参构造器
StuDAO.java文件继承了BaseJdbcDAO,主要负责封装对stu表的sql语句操作

5.jdbc连接数据库
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; public class BaseJdbcDAO<E> {
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=mysql";
private static final String USER="sa";
private static final String PWD="123";
private Connection conn=null;
private Statement state=null;
protected ResultSet res=null;
static{
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("加载驱动成功");
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
e.printStackTrace();
}
}
public void createConnection() throws SQLException {
conn=DriverManager.getConnection(URL, USER, PWD);
System.out.println("创建连接成功");
}
public void createStatement() throws SQLException {
state=conn.createStatement();
System.out.println("创建命令执行对象成功");
}
public void execute(String sql) {
try {
this.createConnection();
this.createStatement();
System.out.println(sql+"----static--");
state.executeQuery(sql);
System.out.println(sql+"-----ok-----");
} catch (SQLException e) {
e.printStackTrace();
}finally{
this.closeConn();
}
}
public List<E> execreateQuery(String sql/*,Class cls*/) {
List<E> list=null;
try {
this.createConnection();
this.createStatement();
System.out.println(sql+"----static--");
res = state.executeQuery(sql);
System.out.println(sql+"-----ok-----");
list = new ArrayList<E>();
this.rs2list(list);
if (list!=null) {
System.out.println(list.size());
}
} catch (Exception e) {
e.printStackTrace();
}finally{
this.closeConn();
}
return list;
}
//这边用的是反射写的rs2list,也可以用子类继承父类重写rs2list方法
public void rs2list(List<E> list/*, Class cls*/) throws Exception {
Type type = getClass().getGenericSuperclass();//包名.类名<泛型的类的包名.泛型类名>
Type[] params = ((ParameterizedType)type).getActualTypeArguments();//class 泛型的类的包名.泛型类名(是一个这样的数组)
Class cls = (Class) params[0];//泛型的类的包名.泛型类名
while (res.next()) {
//E object = (E) cls.newInstance();
Object object = cls.newInstance();
Method[] methods = cls.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getModifiers() == Modifier.PUBLIC
&& methods[i].getName().startsWith("set")) {
Method method = methods[i];
String name = methods[i].getName().substring(3)
.toLowerCase();
String value = res.getString(name);
method.invoke(object, value);
}
}
list.add((E) object);
}
}
public void closeConn() {
try {
if (res!=null) {
res.close();
res=null;
}
if (state!=null) {
state.close();
state=null;
}
if (conn!=null) {
conn.close();
conn=null;
}
System.out.println("释放资源成功");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//测试类
class Main{
public static void main(String[] args) throws SQLException {
new StuDao().selAll();
}
}
代码块
6.StuDAO.java
import java.util.List;
public class StuDao extends BaseJdbcDAO<Stu> {
// sql 查询stu表全部
public List<Stu> selAll() {
String sql="select * from stu";
return super.execreateQuery(sql);
}
// sql添加语句
public void addSql(Stu stu) throws SQLException {
String sql = "insert into stu(id,name,sex,dz) values ("
+ stu.getId() + ",'" + stu.getName() + "','" + stu.getSex()
+ "','" + stu.getDz() + "')";
this.execute(sql);
}
// sql删除语句
public void delSql(String id) throws SQLException {
String sql = "delete stu where id=" + id;
this.execute(sql);
}
// sql更新语句
public void updSql(Stu stu) throws SQLException {
String sql = "update stu set name='" + stu.getName() + "',sex='"
+ stu.getSex() + "',dz='" + stu.getDz() + "' where id="
+ stu.getId();
this.execute(sql);
}
// sql 条件查询
public List<Stu> selSqlid(String id) throws SQLException {
String sql = "select id,name,sex,dz from stu where id=" + id;
return this.execreateQuery(sql);
}
// 重写父类rs2list方法接收数据库内数据
/*@Override
protected void list2List(List<Stu> list) {
// TODO Auto-generated method stub
try {
while (res.next() == true) {
String id = res.getString("id");
String name = res.getString("name");
String sex = res.getString("sex");
String dz = res.getString("dz");
Stu stu = new Stu(id, name, sex, dz);
list.add(stu);
}
} catch (SQLException e) {
}
}*/
}
代码块
7.Stu
public class Stu {
private String id;
private String name;
private String sex;
private String dz;
}
第五记 JDBC的更多相关文章
- Spring学习五(JDBC支持)
Spring的jdbc支持 1配置db.properties,将有关JDBC的信息载入 2bean文件配置数据源,这里用e3p0作为数据源载入db.properties 3配置template的bea ...
- 十五、JDBC操作数据库
1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...
- JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- 【Java框架型项目从入门到装逼】第十五节 - jdbc模糊查询实现(附带详细调试过程)
上一节,我们实现了用户列表查询,已经按条件精确查询: if(student.getUsername() != null && !"".equals(student. ...
- jmeter(五)JDBC Request
jmeter中取样器(Sampler)是与服务器进行交互的单元.一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录响应时间信息 有时候工作中我们需要对数据库发起请求或者对数据 ...
- <转>jmeter(五)JDBC Request
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- JavaWeb(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- MySQL学习(五)——使用JDBC完成用户表CRUD的操作
通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 1.使用properties配置文件 开 ...
- 十五:JDBC学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
随机推荐
- Forgery CodeForces - 1059B
一道印章刻印的题目: 具体要求:有一个固定的3*3的印章,给你一个墨迹问能用这个印章印出墨迹吗?(一个像素可以多次被上色) 输入:第一行是墨迹的行列规模,接下来是墨迹 输出:If Andrey can ...
- Codeforces 578B "Or" Game (前缀和 + 贪心)
Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) ...
- Python编写购物小程序
购物车要求: 用户名和密码存放于文件中 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够 ...
- Centos7防火墙使用
修改时区 Centos7 #修改时区 timedatectl set-timezone Asia/Shanghai 开启防火墙 #添加一条规则 firewall-cmd --zone=public - ...
- PAT甲级——A1152 GoogleRecruitment【20】
In July 2004, Google posted on a giant billboard along Highway 101 in Silicon Valley (shown in the p ...
- Cocos2d-x之项目结构分析
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下面是我们创建cocos2d的工程MyGame01里的文件资源 2. 在下面:文件解决方案下面有6个项目,我们的启动优先项为MyGam ...
- java中多态的要点
多态有三要素 继承.方法重写.父类引用指向子类对象 多态可以理解成两个部分:一个是编译时,一个是运行时 编译时:定义规则:运行时:具体实现这个规则. 编译时:把父类强制转换成子类不会报错:运行时:先去 ...
- Codeforces 488C Fight the Monster
Fight the Monster time limit per test 1 second memory ...
- 代码迁移到华为云上和Git的坑
代码迁移到华为云上和Git的坑 先设置小乌龟Git上方式为ssh 参考链接:https://www.liangzl.com/get-article-detail-3586.html 注意:Tortoi ...
- openses机制
openses 大体结构解读 页面html与相关php文件的定位 点击界面,查看出现的url 例如: http://localhost/opensns/index.php?s=/people/inde ...