热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jdbc01

JDBC:(javadataBaseconnectivity,java数据库连接)是一种执行sql语句的javaAPI!java语言编写的一些类和接口组成!使用jdb

JDBC:(java dataBase connectivity,java数据库连接) 是一种执行sql语句的java API!
java语言编写的一些类和接口组成!


使用jdbc链接数据库需要的4要素!
01.连接数据库的驱动包!
02.url(localhost:3306/news)
03.用户名
04.密码

 

public class JdbcTest {public static void main(String[] args) {// selectUser();查询所有的用户信息// addUser("小黑", "123", "567"); 新增// updateUser("小黑", "123");delUser("5'" + " or 1=1 and id='4"); // sql 注入
}// 查询所有的用户信息private static void selectUser() {/*** 获取数据库连接的4要素 * 连接数据库的前提*/String driver = "com.mysql.jdbc.Driver"; // 驱动String url = "jdbc:mysql://localhost:3306/news"; // 连接地址String url =// "jdbc:mysql:///news";String userName = "t11"; // 用户名String password = "t11"; // 密码// 获取数据库的链接Connection connection = null;Statement statement = null;ResultSet rs = null;try {// 01.加载数据库驱动
Class.forName(driver);// 02.获取数据库的链接connection = DriverManager.getConnection(url, userName, password);// 03.通过连接获取statement对象,并执行sql语句 ,不安全 sql注入statement = connection.createStatement();String sql = "select * from news_user";rs = statement.executeQuery(sql);// 04. 处理结果集while (rs.next()) {// rs.next() 获取一行记录int id = rs.getInt("id");String name = rs.getString("userName");String pwd = rs.getString("password");String email = rs.getString("email");int type = rs.getInt("userType");System.out.println("***********************************");System.out.println("用户的编号:" + id);System.out.println("用户的姓名:" + name);System.out.println("用户的密码:" + pwd);System.out.println("用户的email:" + email);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 05.释放资源try {rs.close();statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}// 新增用户信息private static void addUser(String userName, String password, String email) {/*** 获取数据库连接的4要素 * 连接数据库的前提*/String driver = "com.mysql.jdbc.Driver"; // 驱动String url = "jdbc:mysql://localhost:3306/news"; // 连接地址String url =// "jdbc:mysql:///news";String name = "t11"; // 用户名String pwd = "t11"; // 密码// 获取数据库的链接Connection connection = null;Statement statement = null;int rowNum = 0; // 影响的行数try {// 01.加载数据库驱动
Class.forName(driver);// 02.获取数据库的链接connection = DriverManager.getConnection(url, name, pwd);// 03.通过连接获取statement对象,并执行sql语句 ,不安全 sql注入statement = connection.createStatement();String sql = "INSERT INTO news_user(userName,PASSWORD,email) VALUES("+ "'" + userName + "','" + password + "','" + email + "')";// 04.执行sqlrowNum = statement.executeUpdate(sql);if (rowNum > 0) {System.out.println("新增成功!");} else {System.out.println("新增失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 05.释放资源try {statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}// 修改用户信息 根据用户名修改密码private static void updateUser(String userName, String password) {/*** 获取数据库连接的4要素 * 连接数据库的前提*/String driver = "com.mysql.jdbc.Driver"; // 驱动String url = "jdbc:mysql://localhost:3306/news"; // 连接地址String url =// "jdbc:mysql:///news";String name = "t11"; // 用户名String pwd = "t11"; // 密码// 获取数据库的链接Connection connection = null;Statement statement = null;int rowNum = 0; // 影响的行数try {// 01.加载数据库驱动
Class.forName(driver);// 02.获取数据库的链接connection = DriverManager.getConnection(url, name, pwd);// 03.通过连接获取statement对象,并执行sql语句 ,不安全 sql注入statement = connection.createStatement();String sql = "UPDATE news_user SET PASSWORD='" + password+ "' WHERE username='" + userName + "'";// 04.执行sqlrowNum = statement.executeUpdate(sql);if (rowNum > 0) {System.out.println("修改成功!");} else {System.out.println("修改失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 05.释放资源try {statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}// 删除指定用户信息 根据用户名删除private static void delUser(String id) {/*** 获取数据库连接的4要素 * 连接数据库的前提*/String driver = "com.mysql.jdbc.Driver"; // 驱动String url = "jdbc:mysql://localhost:3306/news"; // 连接地址String url =// "jdbc:mysql:///news";String name = "t11"; // 用户名String pwd = "t11"; // 密码// 获取数据库的链接Connection connection = null;Statement statement = null;int rowNum = 0; // 影响的行数try {// 01.加载数据库驱动
Class.forName(driver);// 02.获取数据库的链接connection = DriverManager.getConnection(url, name, pwd);// 03.通过连接获取statement对象,并执行sql语句 ,不安全 sql注入statement = connection.createStatement();String sql = "DELETE FROM news_user WHERE id='" + id + "'";// 04.执行sqlrowNum = statement.executeUpdate(sql);if (rowNum > 0) {System.out.println("删除成功!");} else {System.out.println("删除失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 05.释放资源try {statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

出现的问题:
01.重复的代码 数据库需要的4要素
02.重复的代码 
Connection connection = null;
Statement statement = null;
03.释放资源
04.所有的增删改 都是使用的executeUpdate()
05.所有的查询 都是使用的executeQuery()
06.我们使用的是statement对象! 不安全!
07.我们传递的参数太多了!

 

 

1.创建对应的数据库以及表

/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.5.32-log : Database - news
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`news` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */;USE `news`;/*Table structure for table `news_category` */DROP TABLE IF EXISTS `news_category`;CREATE TABLE `news_category` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,`createDate` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE
=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻分类表';/*Data for the table `news_category` */insert into `news_category`(`id`,`name`,`createDate`) values (1,'国内','2014-09-16 14:41:24'),(2,'国际','2014-09-16 14:42:58'),(3,'娱乐','2014-09-16 14:42:58'),(4,'军事','2014-09-16 14:42:58'),(5,'财经','2014-09-16 14:42:58'),(6,'天气','2014-09-16 14:42:58');/*Table structure for table `news_comment` */DROP TABLE IF EXISTS `news_comment`;CREATE TABLE `news_comment` (`id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'id',`newsId` bigint(10) DEFAULT NULL COMMENT '评论新闻id',`content` varchar(2000) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论内容',`author` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论者',`ip` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论ip',`createDate` datetime DEFAULT NULL COMMENT '发表时间',PRIMARY KEY (`id`)
) ENGINE
=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻评论表';/*Data for the table `news_comment` *//*Table structure for table `news_detail` */DROP TABLE IF EXISTS `news_detail`;CREATE TABLE `news_detail` (`id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'id',`categoryId` bigint(10) DEFAULT NULL COMMENT '新闻类别id',`title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻标题',`summary` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻摘要',`content` text COLLATE utf8_unicode_ci COMMENT '新闻内容',`picPath` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻图片路径',`author` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '发表者',`createDate` datetime DEFAULT NULL COMMENT '创建时间',`modifyDate` datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`id`)
) ENGINE
=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻明细表';/*Data for the table `news_detail` */insert into `news_detail`(`id`,`categoryId`,`title`,`summary`,`content`,`picPath`,`author`,`createDate`,`modifyDate`) values (1,2,'尼日利亚一架客机坠毁','尼日利亚一架客机坠毁,伤亡惨重','尼日利亚一架客机坠毁,伤亡惨重,10人重伤','','admin','2014-09-16 14:43:53','2014-09-16 14:43:53'),(2,1,'谈北京精神','北京是一座拥有灿烂文明的古城','北京是一座拥有灿烂文明的古城,厚重的历史积淀,涵育了辉煌的北京文化。而这种融贯北京万众情怀、铸造北京城市特质、传沿北京文化基因、孕育北京创新灵魂的文化精髓,就是北京精神。侯仁之先生在谈到北京的城市建设时曾经提到过3个里程碑:紫禁城,天安门广场和国家奥林匹克体育中心、亚运村。侯先生认为,紫禁城是封建社会宫殿建筑中最有代表性的一组建筑群,是历史上封建皇权统治的中心,无论在文化上还是古迹上都举世闻名。新中国把天安门广场这样一个旧时代的宫廷广场,改造成人民的广场,给北京带来了一个全新的景象,这在北京城市建设发展史上具有重要意义。国家奥林匹克体育中心和亚运村的建设是对北京城传统中轴线的延伸,代表着北京走向国际、走向世界。北京的城市建设和建筑是与民族的兴衰联系在一起的,就像北京的中轴线,从北京厚重的历史中出发,奔向充满光明、充满希望的未来,奔向广阔的世界、无垠的宇宙。北京有着3000多年的建城史,800多年的建都史。从西周时期到辽金时期,北京作为地方首府,城市的中心点和中轴线不断改变。直到元代,蒙古铁骑扫荡了华夏四方,北京才真正成为全国的政治中心,中轴线也确定下来。中轴线在北京城市规划上具有重要意义,它就像一条奔涌着民族血液的动脉,为我们的民族、我们的国家、我们的北京时刻输送着营养和活力。中轴线凝聚了北京人民的爱国情怀,显示了北京的宽容、厚重与博大,也体现了北京的吸纳与创新。纵观世界,多少历史古城在浩瀚的风云中固守而亡,而北京几经磨难,依然能迈着豪迈的步伐,坚定自信地向充满希望的未来走去,我们不能不为北京的吸纳与创新而自豪! ',NULL,'admin','2014-09-16 14:43:53','2014-09-16 14:43:53');/*Table structure for table `news_user` */DROP TABLE IF EXISTS `news_user`;CREATE TABLE `news_user` (`id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`userName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名',`password` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',`email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'email',`userType` int(5) DEFAULT NULL COMMENT '用户类型 0:管理员 1:普通用户',PRIMARY KEY (`id`)
) ENGINE
=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='用户表';/*Data for the table `news_user` */insert into `news_user`(`id`,`userName`,`password`,`email`,`userType`) values (1,'admin','admin','admin@bdqn.cn',0),(2,'user','user','user@bdqn.cn',1),(3,'test','test','test@bdqn.cn',1);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

数据库news

2.创建对应的测试类

public class NewsTest {public static void main(String[] args) {//查询新闻信息
newsQuery();/** sql注入 修改指定新闻的信息 发现其他的也更改了* newsUpdate("999999999", "1 or 1=1 and id=2");*/}/***01. 查询所有的新闻信息*/public static void newsQuery() {//前提.把数据库驱动 Jar 放入项目中String url="jdbc:mysql://localhost:3306/news";String user="wym";String password="wym";//对象放在这里 是为了 方便 关闭资源Connection connection=null;Statement statement=null;ResultSet set=null;try {//01.利用反射技术动态获取数据库的驱动Class.forName("com.mysql.jdbc.Driver");//02.获取数据库链接 Url User Pwdconnection = DriverManager.getConnection(url, user, password);//03.通过链接获取statement对象,并执行sql语句 sql注入 不安全statement = connection.createStatement();String sql="SELECT * FROM news_detail";set = statement.executeQuery(sql);//04.处理结果集while(set.next()){int id = set.getInt("id");//id指的就是数据库对应表中的 字段名称String author=set.getString("author");String title=set.getString("title");String content=set.getString("content");Timestamp createDate = set.getTimestamp("createDate"); //获取//Date createDate= set.getDate("createDate"); 获取的是 年月日//Time createDate= set.getTime("createDate"); 获取的是 时分秒//输出System.out.println("新闻的编号:"+id);System.out.println("新闻的作者:"+author);System.out.println("新闻的标题:"+title);System.out.println("新闻的内容:"+content);System.out.println("新闻的创建日期:"+createDate);System.out.println("*********************************");}} catch (Exception e) {e.printStackTrace();}finally{try {//关闭资源 先开的后关
set.close();statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}/***02修改指定ID的新闻信息**/public static void newsUpdate(String content,String id) {//前提.把数据库驱动 Jar 放入项目中String url="jdbc:mysql://localhost:3306/news";String user="wym";String password="wym";//对象放在这里 是为了 方便 关闭资源Connection connection=null;Statement statement=null;int num=0;try {//01.利用反射技术动态获取数据库的驱动Class.forName("com.mysql.jdbc.Driver");//02.获取数据库链接 Url User Pwdconnection = DriverManager.getConnection(url, user, password);//03.通过链接获取statement对象,并执行sql语句 sql注入 不安全statement = connection.createStatement();String sql="UPDATE news_detail SET content="+"'" +content+"'"+"where id="+id;System.out.println(sql);num= statement.executeUpdate(sql);if (num>0) {System.out.println("修改成功");}else {System.out.println("失败");}//04.处理结果集} catch (Exception e) {e.printStackTrace();}finally{try {//关闭资源 先开的后关
statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

查询和更改新闻信息

3.总结JDBC连接数据库的步骤  和 上面代码的问题

/* JDBC: 是java一套连接数据库的技术! JDBC API 01.引入需要的数据库驱动jar包02.利用反射加载驱动Class.forName("com.mysql.jdbc.Driver");03.通过DriverManager.getConnection获取数据库链接需要三个参数001.url="jdbc:mysql://localhost:3306/数据库名"002. 用户名003.密码04.提供一个sql语句,Connection接口createStatement()创建Statement对象Statement对象执行sql语句001.查询executeQuery() 返回值 ResultSet002.增删改 executeUpdate() 返回值int05.处理结果001. ResultSet 遍历002.int 判断06.关闭资源重复的代码步骤: 02.加载驱动 03.获取数据库链接06.关闭资源*/

小结

针对上面的问题 怎么解决??   提取成方法?
用户名 密码 url 驱动 是相对固定的值!
01.使用Properties 把 创建连接需要的 用户名 密码 url 驱动 进行管理!
02.怎么获取 Properties 文件中的内容
03.使用单例创建工具类 来读取配置文件

4.创建properties文件

5.创建读取properties文件的工具类

//单例 读取配置文件的工具类
public class ConfigManager {//01.创建静态的自身对象private static ConfigManager manager=new ConfigManager();//我们读取的配置文件需要的类private static Properties properties;//02.构造私有化private ConfigManager(){String path="jdbc.properties";properties=new Properties();//获取流InputStream stream = ConfigManager.class.getClassLoader().getResourceAsStream(path);try {properties.load(stream); //读取配置文件} catch (IOException e) {e.printStackTrace();}finally{try {stream.close();} catch (IOException e) {e.printStackTrace();}}}//03.提供外部访问的接口public static synchronized ConfigManager getInstance(){return manager;}//提供一个获取配置文件 value的方法public static String getValue(String key){return properties.getProperty(key);}}

读取配置文件的工具类

 6.修改测试类

public class NewsTest {public static void main(String[] args) {//查询新闻信息
newsQuery();}/***01. 查询所有的新闻信息*/public static void newsQuery() {//前提.把数据库驱动 Jar 放入项目中String url=ConfigManager.getInstance().getValue("url");String user=ConfigManager.getInstance().getValue("userName");String password=ConfigManager.getInstance().getValue("password");String driver=ConfigManager.getInstance().getValue("driverClass");//对象放在这里 是为了 方便 关闭资源Connection connection=null;Statement statement=null;ResultSet set=null;try {//01.利用反射技术动态获取数据库的驱动
Class.forName(driver);//02.获取数据库链接 Url User Pwdconnection = DriverManager.getConnection(url, user, password);//03.通过链接获取statement对象,并执行sql语句 sql注入 不安全statement = connection.createStatement();String sql="SELECT * FROM news_detail";set = statement.executeQuery(sql);//04.处理结果集while(set.next()){int id = set.getInt("id");//id指的就是数据库对应表中的 字段名称String author=set.getString("author");String title=set.getString("title");String content=set.getString("content");Timestamp createDate = set.getTimestamp("createDate"); //获取//Date createDate= set.getDate("createDate"); 获取的是 年月日//Time createDate= set.getTime("createDate"); 获取的是 时分秒//输出System.out.println("新闻的编号:"+id);System.out.println("新闻的作者:"+author);System.out.println("新闻的标题:"+title);System.out.println("新闻的内容:"+content);System.out.println("新闻的创建日期:"+createDate);System.out.println("*********************************");}} catch (Exception e) {e.printStackTrace();}finally{try {//关闭资源 先开的后关
set.close();statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}/**02修改指定ID的新闻信息*/public static void newsUpdate(String content,String id) {//前提.把数据库驱动 Jar 放入项目中String url=ConfigManager.getInstance().getValue("url");String user=ConfigManager.getInstance().getValue("userName");String password=ConfigManager.getInstance().getValue("password");String driver=ConfigManager.getInstance().getValue("driverClass");//对象放在这里 是为了 方便 关闭资源Connection connection=null;Statement statement=null;int num=0;try {//01.利用反射技术动态获取数据库的驱动
Class.forName(driver);//02.获取数据库链接 Url User Pwdconnection = DriverManager.getConnection(url, user, password);//03.通过链接获取statement对象,并执行sql语句 sql注入 不安全statement = connection.createStatement();String sql="UPDATE news_detail SET content="+"'" +content+"'"+"where id="+id;System.out.println(sql);num= statement.executeUpdate(sql);if (num>0) {System.out.println("修改成功");}else {System.out.println("失败");}//04.处理结果集} catch (Exception e) {e.printStackTrace();}finally{try {//关闭资源 先开的后关
statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

修改后的测试类

7.发现的问题

/*按上面的操作 执行完毕后 发现!每个方法都有这个String url=ConfigManager.getInstance().getValue("url");String user=ConfigManager.getInstance().getValue("userName");String password=ConfigManager.getInstance().getValue("password");String driver=ConfigManager.getInstance().getValue("driverClass");
关闭资源 也没有提取! 怎么解决sql语句的注入?提取成一个公共的类!这个类的功能
01.创建连接
02.关闭资源!
还有 所有的对数据库的操作 都是 增删改查
03.增删改 都是一个方法executeUpdate
04.查 (查询所有,根据指定ID查询,根据标题查询,根据....) 都是一个方法 executeQuery
*/

问题

8.解决的方法创建BaseDao工具类

//通用的工具类
public class BaseDao {//jdbc 需要的API 创建出来private Connection con; //连接对象private PreparedStatement ps; //执行sql 防止sql注入private ResultSet rs; //查询的返回结果集//01.开启连接public boolean getConnection(){//读取配置文件String url=ConfigManager.getInstance().getValue("url");String user=ConfigManager.getInstance().getValue("userName");String password=ConfigManager.getInstance().getValue("password");String driver=ConfigManager.getInstance().getValue("driverClass");try {Class.forName(driver); //加载驱动con=DriverManager.getConnection(url,user,password); //创建连接} catch (ClassNotFoundException e) {e.printStackTrace();return false;} catch (SQLException e) {e.printStackTrace();return false;}return true;}//02.关闭连接public boolean closeConnection(){//如果对象都没有创建 就没法关闭 所以 要非空判断if (rs!=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (ps!=null) {try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if (con!=null) {try {con.close();} catch (SQLException e) {e.printStackTrace();}}return true;}/** 03.增删改 executeUpdate* * delete from user where name='小黑' and name='小白'* * Object ... o * 参数类型是数组类型的!在作为参数的时候 参数个数 可以为0和任意多个*/public int executeUpdate(String sql,Object... params){int updateRow=0;if (getConnection()) { //如果有连接进行操作try {ps=con.prepareStatement(sql);//你在传sql语句的时候 有参数 就给参数赋值for (int i = 0; i ) {ps.setObject(i+1, params[i]);}//执行sql语句updateRow=ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}return updateRow;}//04.查询 select * from user where id=1public ResultSet executeQuery(String sql,Object... params){if (getConnection()) { //如果有连接进行操作try {ps=con.prepareStatement(sql);//你在传sql语句的时候 有参数 就给参数赋值for (int i = 0; i ) {ps.setObject(i+1, params[i]);}//执行sql语句rs=ps.executeQuery();} catch (SQLException e) {e.printStackTrace();}}return rs;}}

BaseDao代码

9.创建新的测试类

public class BaseDaoTest extends BaseDao {public static void main(String[] args) {BaseDaoTest test=new BaseDaoTest();//查询新闻信息
test.newsQueryAll();}/***01. 查询指定的新闻信息*/public void newsQuery(String id) {//获取连接
getConnection();String sql="select * from news_detail where id=?";//怎么给?赋值 ?就是占位符Object [] params={id};ResultSet set = executeQuery(sql, params);//处理结果集try {while(set.next()){int ids = set.getInt("id");String title=set.getString("title");String content=set.getString("content");Timestamp createDate = set.getTimestamp("createDate"); System.out.println("新闻的编号:"+ids);System.out.println("新闻的标题:"+title);System.out.println("新闻的内容:"+content);System.out.println("新闻的创建日期:"+createDate);}} catch (SQLException e) {e.printStackTrace();}finally{closeConnection();}}/** 查询所有 没有参数就不传 不需要实例化参数对象*/public void newsQueryAll() {//获取连接
getConnection();String sql="select * from news_detail";ResultSet set = executeQuery(sql);//处理结果集try {while(set.next()){int ids = set.getInt("id");String title=set.getString("title");String content=set.getString("content");Timestamp createDate = set.getTimestamp("createDate"); System.out.println("新闻的编号:"+ids);System.out.println("新闻的标题:"+title);System.out.println("新闻的内容:"+content);System.out.println("新闻的创建日期:"+createDate);}} catch (SQLException e) {e.printStackTrace();}finally{closeConnection();}}
}

优化后的测试类

10.问题

/** 现在从数据库中取得的字段 返回都是 变量接收的!* 字段有多少!就有多少个变量??* 按照 java面向对象的编程思想! 我们把变量提取成 类* * 我们这个变量 和 数据库 中的字段 什么关系!* 实体类 表* 属性 字段 */

出现的问题

11.创建对应的News实体类

public class News { // 新闻信息的实体类private String id;private String categoryId;private String title;private String summary;private String content;private String picPath;private String author;private Date createDate;private Date modifyDate;@Overridepublic String toString() {return "News [id=" + id + ", categoryId=" + categoryId + ", title="+ title + ", summary=" + summary + ", content=" + content+ ", picPath=" + picPath + ", author=" + author+ ", createDate=" + createDate + ", modifyDate=" + modifyDate+ "]";}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getCategoryId() {return categoryId;}public void setCategoryId(String categoryId) {this.categoryId = categoryId;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getSummary() {return summary;}public void setSummary(String summary) {this.summary = summary;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getPicPath() {return picPath;}public void setPicPath(String picPath) {this.picPath = picPath;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}public Date getModifyDate() {return modifyDate;}public void setModifyDate(Date modifyDate) {this.modifyDate = modifyDate;}}

12.根据ID查询指定的新闻

public class BaseDaoTest extends BaseDao {/***01. 查询指定的新闻信息 并返回*/public News newsQuery(String id) {//获取连接
getConnection();String sql="select * from news_detail where id=?";Object [] params={id};ResultSet set = executeQuery(sql, params);//创建新闻对象News news=new News();//处理结果集try {if (set.next()) { //根据ID查询 肯定只有一个!//给新闻对象赋值news.setId(set.getString("id"));news.setTitle(set.getString("title"));news.setContent(set.getString("content"));news.setCreateDate(set.getTimestamp("createDate"));news.setAuthor(set.getString("author"));news.setCategoryId(set.getString("categoryId"));news.setModifyDate(set.getTimestamp("modifyDate"));news.setSummary(set.getString("summary"));}} catch (SQLException e) {e.printStackTrace();}finally{closeConnection();}return news;}//测试方法public static void main(String[] args) {BaseDaoTest test=new BaseDaoTest();//获取指定的新闻信息News news = test.newsQuery("1");System.out.println(news);}}

测试类代码

 13.新增新闻信息代码

public class BaseDaoTest extends BaseDao {/*** 新增新闻信息*/public void addNews(News news){getConnection();//获取连接String sql="insert into news_detail(id,title,content,createDate) " +" values(?,?,?,?)";Object[] params={news.getId(),news.getTitle(),news.getContent(),news.getCreateDate()}; //执行sql语句int update = executeUpdate(sql, params);if (update>0) {System.out.println("新增成功!");}else {System.out.println("失败");}//关闭连接
closeConnection();}//测试方法public static void main(String[] args) {//新增用户News news2=new News();news2.setId("3");news2.setTitle("大家辛苦了");news2.setContent("真的好苦啊");news2.setCreateDate(new Date());test.addNews(news2);}}

测试代码

 14.总结

/*
JDBC: 是java一套连接数据库的技术! JDBC API 01.引入需要的数据库驱动jar包02.利用反射加载驱动Class.forName("com.mysql.jdbc.Driver");03.通过DriverManager.getConnection获取数据库链接需要三个参数001.url="jdbc:mysql://localhost:3306/数据库名"002. 用户名003.密码04.提供一个sql语句,Connection接口createStatement()创建Statement对象Statement对象执行sql语句001.查询 executeQuery() 返回值 ResultSet002.增删改 executeUpdate() 返回值int05.处理结果001. ResultSet 遍历002.int 判断06.关闭资源重复的代码: 02.加载驱动 03.获取数据库链接06.关闭资源针对上面的问题 怎么解决?? 提取方法?用户名 密码 url 驱动 是相对固定的值!01.使用Properties 把 创建连接需要的 用户名 密码 url 驱动 进行管理!02.怎么获取 Properties 文件中的内容03.使用单例工具类 来读取配置文件按上面的操作 执行完毕后 发现!每个方法都有这个String url=ConfigManager.getInstance().getValue("url");String user=ConfigManager.getInstance().getValue("userName");String password=ConfigManager.getInstance().getValue("password");String driver=ConfigManager.getInstance().getValue("driverClass"); 关闭资源 也没有提取! 怎么解决sql语句的注入?提取成一个公共的类!这个类的功能01.创建连接 02.关闭资源!还有 所有的对数据库的操作 都是 增删改查03.增删改 都是一个方法executeUpdate04.查 (查询所有,根据指定ID查询,根据标题查询,根据....) 都是一个方法 executeQuerycon.prepareStatement(sql) 和 con.createStatement()prepareStatement在创建的时候需要sql语句 执行sql语句是 不需要! 安全 防注入
Statement在创建的时候不需要sql 执行的时候需要! 不安全 可以注入经典面试题int a =5;double b =10;a=a/b; //编译错误a/=b; //默认隐式转换成了(int) (a/b)
*/

总结

 

转:https://www.cnblogs.com/xtdxs/p/7094593.html



推荐阅读
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 如何在MySQL中选择合适的表空间以优化性能和管理效率
    在MySQL中,合理选择表空间对于提升表的管理和访问性能至关重要。表空间作为MySQL中用于组织和管理数据的一种机制,能够显著影响数据库的运行效率和维护便利性。通过科学地配置和使用表空间,可以优化存储结构,提高查询速度,简化数据管理流程,从而全面提升系统的整体性能。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
author-avatar
安安1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有