[课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版
(课本P273-任务九)
/**DAO: Data Access Object
* 为什么用: 实现功能的模块化,更有利于代码的维护和升级
* 是什么: 访问数据信息的类,包含对数据的CRUD(create,read,update,delete)
* 怎么写: 使用JDBC编写DAO可能会包含的方法: insert/delete/update/select 操作都可以包含在其中
*/
/*出现的问题总结:
1.设置数据库的主键,主键不可重复;
2.JavaBean的users 中有toString方法,特别适合输出查询的信息;public void showAll(Object[] args){}批量输出users数组的信息.
3.sql时间类使用的方法: ud.insert(new users(1,"admin5","123456","aaa@qq.com",new Date(new java.util.Date().getTime())));
4.创建DAO的测试类,testDAO后, usersDAO ud=new usersDAO(); 实例化,之后实现以下几个简单功能:
添加insert: 传入一个对象user, 添加用户信息: public boolean insert(users user){.......}
查找数据库中的所有的user对象,并返回所有的user对象: public ArrayList<users> findAll(){...}
查找指定的user, 根据id或者username ,返回该对应对象: public users find(String find_name, Object object){ ... }
删除指定的用户,根据id或者username : public boolean delete(String find_name,Object object){...}
修改指定的用户,根据传入的user的对象的所有属性进行全部更新 : public boolean update(users u){...}
*/
1,数据库的设计

1-1 打开数据库,手动启动mysql服务;使用命令行创建数据库jdbc,以及表users
Type 'help;' or '\h' for help. Type '\c' to clear the current input state mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| test |
| world |
+--------------------+
6 rows in set (0.04 sec) mysql> create database jdbc;
Query OK, 1 row affected (0.02 sec) mysql> use jdbc;
Database changed
mysql> create table users(
-> id int not null,
-> username varchar(15) ,
-> password varchar(15) ,
-> email varchar(20),
-> birthday date);
Query OK, 0 rows affected (0.16 sec) mysql> desc jdbc;
ERROR 1146 (42S02): Table 'jdbc.jdbc' doesn't exist
mysql> desc uesrs;
ERROR 1146 (42S02): Table 'jdbc.uesrs' doesn't exist
mysql> desc user;
ERROR 1146 (42S02): Table 'jdbc.user' doesn't exist
mysql> desc users;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| username | varchar(15) | YES | | NULL | |
| password | varchar(15) | YES | | NULL | |
| email | varchar(20) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
1-2 创建src下的 jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
user=root
password=root
2.JavaBean的users
package day_20;
import java.sql.Date;
public class users {
private int id;
private String username,password,email;
private Date birthday;
public users() {
}
@Override
public String toString() {
return "users{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", birthday=" + birthday +
'}';
}
public void showAll(Object[] args){
for(int i=0;i<args.length;i++)
System.out.println(args[i].toString());
}
public users(int id, String username, String password, String email, Date birthday) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
3-编写DAO若干个模块功能: usersDAO
package day_20; import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList; public class usersDAO {
//1.添加insert: 传入一个对象user, 添加用户信息
public boolean insert(users user){
String sql="insert into users(id,username,password,email,birthday) " +
" values(?,?,?,?,?)";
JDBCTools.update_sql(sql,user.getId(),user.getUsername(),user.getPassword(),
user.getEmail(),user.getBirthday());
return true;
}
//2.查找数据库中的所有的user对象,并返回所有的user对象,
public ArrayList<users> findAll(){
Connection connection=null;
Statement statement=null;
ArrayList<users> list=new ArrayList<users>();
ResultSet rs = null;
try {
connection = JDBCTools.getConnection();
statement = connection.createStatement();
String sql="select * from users";
rs = statement.executeQuery(sql);//执行查询操作!
//处理结果集
while(rs.next()){
users user=new users();
user.setId(rs.getInt(1));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString(4));
user.setBirthday(rs.getDate(5));
list.add(user); //加进查询的对象的 结果集
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(rs,statement ,connection );
}
return list;
}
//3.查找指定的user, 根据id或者username ,返回该对应对象
public users find(String find_name, Object object){
String sql;
if(find_name=="id"){
sql="select * from users where id = "+(int)object;
}
else{
sql="select * from users where username = '"+object+"'";
}
Connection connection=null;
Statement statement=null; ResultSet rs = null;
try {
connection = JDBCTools.getConnection();
statement = connection.createStatement();
//sql="select * from users";
rs = statement.executeQuery(sql);//执行查询操作!
//处理结果集
while(rs.next()){
users user=new users();
user.setId(rs.getInt(1));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString(4));
user.setBirthday(rs.getDate(5));
return user;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(rs,statement ,connection );
}
return null;
}
//4.删除指定的用户,根据id或者username
public boolean delete(String find_name,Object object){
String sql;
if(find_name=="id"){
sql="delete from users where id = ? ";
}
else{
sql="delete from users where username = ? ";
}
JDBCTools.update_sql(sql,object);
return true;
}
//5.修改指定的用户,根据传入的user的对象的所有属性进行全部更新
public boolean update(users u){
String sql;
sql="update users set id=?,username=?,password=?,email=?,birthday=? " +
"where id = ?";
JDBCTools.update_sql(sql,u.getId(),u.getUsername(),u.getPassword(),u.getEmail(),u.getBirthday(),
u.getId());
return true;
} }
4-创建DAO的测试类
/**DAO: Data Access Object
* 为什么用: 实现功能的模块化,更有利于代码的维护和升级
* 是什么: 访问数据信息的类,包含对数据的CRUD(create,read,update,delete)
* 怎么写: 使用JDBC编写DAO可能会包含的方法: insert/update/delete 操作都可以包含在其中
*/
public class testDAO {
@Test //测试创建/增删查改功能!
public void test_DAO(){
// 1.添加insert: 传入一个对象user, 添加用户信息
usersDAO ud=new usersDAO();
ud.insert(new users(1,"admin5","123456","aaa@qq.com",new Date(new java.util.Date().getTime()))); // 3.查找指定的user, 根据id或者username ,返回该对应的唯一的对象
String ans1=(ud.find("id", 3)).toString();
System.out.println(ans1);
ans1=(ud.find("username", "admin5")).toString();
System.out.println(ans1);
// 4.删除指定的用户,根据id或者username
ud.delete("id", 1);
ud.delete("username", "admin2");
// 5.修改指定的用户,根据传入的user对象,先匹配id, 然后对所有属性进行全部更新
ud.update(new users(3,"admin3","598062186","aaa@qq.com",new Date(new java.util.Date().getTime()))); // 2.查找数据库中的所有的user对象,并返回所有的user对象,
ArrayList<users> list = ud.findAll();
new users().showAll(list.toArray());
}
}
5-最终敲定版的JDBCTools 工具类 (使用时注意变更!)
/**操纵JDBC的工具类,其中封装了一些工具方法
* Version 1 : getConnection() : 通过读取配置文件从数据库服务器获取一个连接;
* Version 2 : release() : 关闭数据库资源的ResultSet/Statement/Statement
* Version 3 : update_sql() : 使用preparedStatement实现 :SQL的增删改!
* Version 4: query_sql() : 使用preparedStatement实现 :SQL的select查询! 输出数据库的全部内容
*/
public class JDBCTools {
/*** 执行sql 语句,使用Preparedstatement
*
*/
public static void release(ResultSet rs,Statement statement, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
}
public static Connection getConnection() throws Exception{
//1.准备数据库的连接的四个字符串
String driverClass=null,jdbcUrl=null,user=null,password=null;
//jdbc:mysql:///books ;也可以将localhost省略掉!
//2.读取类路径下的jdbc.properties 文件
InputStream in=
JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties =new Properties();
properties.load(in);
driverClass =properties.getProperty("driver");
jdbcUrl=properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
//3.加载数据库驱动程序(注册驱动),driver对应的实现类中有注册驱动的静态代码块
// Class.forName(driverClass); //
//或这么手动加载,也可以注册多个数据库连接的代码块
//DriverManager.registerDriver( Class.forName(driverClass).newInstance());
//4.通过DriverManager 的getConnection()方法获取数据库连接。
Connection connection=DriverManager.getConnection(jdbcUrl,user,password);
System.out.print(connection); //com.mysql.jdbc.JDBC4Connection@19e1023e
return connection;
}
//使用preparedStatement实现 :SQL的增删改!
public static void update_sql(String sql,Object...args){
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection = JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null,preparedStatement ,connection);
}
}
//使用preparedStatement实现 :SQL的select查询! 输出数据库的全部内容
public static void query_sql(String sql,Object...args){
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection = JDBCTools.getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}
ResultSet resultSet=null;
resultSet=preparedStatement.executeQuery();//执行查询操作!
Boolean flag=true;
while(resultSet.next()){
flag=false;
Map<String,Object> values=new HashMap<String,Object>();
//1. 得到ResultSetMetaData 对象
ResultSetMetaData rsmd = resultSet.getMetaData();
//2.打印每一列的列名
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1); //获取列表标签名称
Object columnValue = resultSet.getObject(columnLabel); //根据名称,获取列值,存入HashMap
values.put(columnLabel, columnValue);
}
//System.out.println(values); //获取一组结果 ,重复的键值对会被后面的覆盖掉
// Class clazz = author.class;
// Object object = clazz.newInstance();
System.out.println();
for (Map.Entry<String, Object> entry : values.entrySet()) {
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
System.out.print( fieldName + ":" + fieldValue+"\t");
}
System.out.println();
}
if(flag==true)
System.out.println("\n数据表为空或者404!");
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null,preparedStatement ,connection);
}
}
}
[课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版的更多相关文章
- 2015.8.2 jdbc实现商品类的增删查改
在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...
- JDBC+Servlet+jsp(增删查改)
先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了! 创建数据库 create database jdbc01 character set utf8 collat ...
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- 在Eclipse上实现简单的JDBC增删查改操作
在Javaweb的学习里,学到了如何完成简单的增删查改操作,在这里撰写一篇文章以便自己整理回忆. 首先要建立一些包和导入一些文件.建一些类.具体框架如图 编写Product类 public clas ...
- jdbc的实例应用:增删查改实现
//在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...
- JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!
主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...
- JDBC增删查改(使用配置文件)
JDBCDemo2.java package com.zhangbz.jdbc; import java.sql.Connection; import java.sql.ResultSet; impo ...
- JDBC 增删查改
public class MemberDaoImpl implements MemberDao { private Connection conn = null; public MemberDaoIm ...
- JDBC示例(增删查改)
前提: 1.项目中引入MySQL的JAR包,POM参考如下配置: <!-- mysql-connector-java --> <!-- http://mvnrepository.co ...
随机推荐
- H310C,B365,M.2 NVME SSD,USB3.0,安装 WIN7 64 位
华擎H310CM ITX NVME SSD 上安装WIN7 64位 核心关键点:xHCI USB3.0驱动,nvme驱动,nvme win7补丁. 硬件配置:I5 9400F, 华擎H310CM IT ...
- oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建 ...
- PHP中奖概率写法
PHP中奖概率写法 <pre><?phpheader("Content-type: text/html; charset=utf-8");/* * 经典的概率算法 ...
- CentOS 7命令行安装GNOME桌面
1.切换至root用户,检查一下已经安装的软件以及可以安装的软件 [root@localhost ~]# yum grouplistLoaded plugins: fastestmirrorThere ...
- [转帖]什么是UWB?UWB有什么用?
什么是UWB?UWB有什么用? https://www.sohu.com/a/224891573_531173 小米碰传 就是 UWB吧? 2018-03-05 17:02 UWB在早期被用来应用在近 ...
- JDK1.8 的 HashMap 源码之注意事项
文章目录 链表变树 树形结构与Comparable,性能极致与降低 链表与树之间转换的阈值 英语渣靠着翻译插件,大概翻译的,难免有错误之处,注意甄别: 链表变树 This map usually ac ...
- 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS
作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...
- 玫瑰花小制作分享-JavaScript(七夕专属浪漫)
分享一个玫瑰花的制作小方法,用小小的代码给自己的她送上一个不一样的玫瑰花. 玫瑰花代码由JavaScript实现,JavaScript 作为一种脚本语言, 被发明用于在 HTML 网页上使用,可以给H ...
- 20191104-基于Python计数排序算法分析
计数排序 计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置,也就是说元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的,将每个元素出现的次数记 ...
- Practice
一.简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...