一、JDBC

1、JDBC:java DataBase Connectivity

2、JDBC 的作用:

(1)、建立与数据库之间的访问连接
(2)、将sql语句发送到数据库执行
(3)、对数据库返回的结果进行处理

3、JDBC访问数据库过程

(1)、加载驱动 driver
(2)、获得连接 DriverManager.getconnection
(3)、创建statement对象,执行sql
连接.createStatement();
String sql =”sql表查询语句”
对象.executeQuery(sql);
(4)、遍历Resultset
(5)、关闭流释放资源
注意!!!
链接数据库前,声明四个变量—-四要素;、
driver url userName password

  1. /*
  2. SQLyog 企业版 - MySQL GUI v8.14
  3. MySQL - 5.5.32-log : Database - kgcnews
  4. *********************************************************************
  5. */
  6. /*!40101 SET NAMES utf8 */;
  7. /*!40101 SET SQL_MODE=''*/;
  8. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  9. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  10. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  11. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  12. CREATE DATABASE /*!32312 IF NOT EXISTS*/`kgcnews` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */;
  13. USE `kgcnews`;
  14. /*Table structure for table `news_category` */
  15. DROP TABLE IF EXISTS `news_category`;
  16. CREATE TABLE `news_category` (
  17. `id` BIGINT(10) NOT NULL AUTO_INCREMENT,
  18. `name` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  19. `createDate` DATETIME DEFAULT NULL COMMENT '创建时间',
  20. PRIMARY KEY (`id`)
  21. ) ENGINE=MYISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻分类表';
  22. /*Data for the table `news_category` */
  23. INSERT INTO `news_category`(`id`,`name`,`createDate`) VALUES (1,'国内','2016-09-16 14:41:24'),(2,'国际','2016-09-16 14:42:58'),(3,'娱乐','2016-09-16 14:42:58'),(4,'军事','2016-09-16 14:42:58'),(5,'财经','2016-09-16 14:42:58'),(6,'天气','2016-09-16 14:42:58');
  24. /*Table structure for table `news_comment` */
  25. DROP TABLE IF EXISTS `news_comment`;
  26. CREATE TABLE `news_comment` (
  27. `id` BIGINT(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  28. `newsId` BIGINT(10) DEFAULT NULL COMMENT '评论新闻id',
  29. `content` VARCHAR(2000) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论内容',
  30. `author` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论者',
  31. `ip` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '评论ip',
  32. `createDate` DATETIME DEFAULT NULL COMMENT '发表时间',
  33. PRIMARY KEY (`id`)
  34. ) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻评论表';
  35. /*Data for the table `news_comment` */
  36. /*Table structure for table `news_detail` */
  37. DROP TABLE IF EXISTS `news_detail`;
  38. CREATE TABLE `news_detail` (
  39. `id` BIGINT(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  40. `categoryId` BIGINT(10) DEFAULT NULL COMMENT '新闻类别id',
  41. `title` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻标题',
  42. `summary` VARCHAR(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻摘要',
  43. `content` TEXT COLLATE utf8_unicode_ci COMMENT '新闻内容',
  44. `picPath` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '新闻图片路径',
  45. `author` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '发表者',
  46. `createDate` DATETIME DEFAULT NULL COMMENT '创建时间',
  47. `modifyDate` DATETIME DEFAULT NULL COMMENT '修改时间',
  48. PRIMARY KEY (`id`)
  49. ) ENGINE=MYISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻明细表';
  50. /*Data for the table `news_detail` */
  51. INSERT INTO `news_detail`(`id`,`categoryId`,`title`,`summary`,`content`,`picPath`,`author`,`createDate`,`modifyDate`) VALUES (1,1,'Java Web开课啦','Java Web课程重磅开课,学员福利','璇女神主讲,课工场倾力出品,Java Web课程开课了,等靠谱的你来报名!','','admin','2016-05-16 14:43:53','2015-05-16 14:43:53'),(2,1,' 520课工场Java狂欢节','课工场准备了一大波福利:Java大赛、折扣课程,免费线下福利……你准备好了吗?','在这个五月,课工场Java学员突破100万人。为感谢所有学员的支持,我们特将5月20日定为【课工场Java狂欢节】。课工场准备了一大波福利:Java大赛、折扣课程,免费线下福利……你准备好了吗?',NULL,'admin','2016-05-16 14:43:53','2016-05-16 14:43:53');
  52. /*Table structure for table `news_user` */
  53. DROP TABLE IF EXISTS `news_user`;
  54. CREATE TABLE `news_user` (
  55. `id` BIGINT(10) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  56. `userName` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名',
  57. `password` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
  58. `email` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'email',
  59. `userType` INT(5) DEFAULT NULL COMMENT '用户类型 0:管理员 1:普通用户',
  60. PRIMARY KEY (`id`)
  61. ) ENGINE=MYISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='用户表';
  62. /*Data for the table `news_user` */
  63. INSERT INTO `news_user`(`id`,`userName`,`password`,`email`,`userType`) VALUES (1,'admin','admin','admin@kgc.cn',0),(2,'user','user','user@kgc.cn',1),(3,'test','test','test@kgc.cn',1);
  64. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  65. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  66. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  67. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
  68. `news_user`
  1. package cn.bdqn.dao;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. import java.sql.Timestamp;
  8. public class JDBCTest1 {
  9. //链接数据库前,声明四个变量---四要素
  10. String driver="com.mysql.jdbc.Driver";//驱动名称
  11. String url="jdbc:mysql://127.0.0.1:3306/kgcnews";//数据库地址
  12. String userName = "root";//用户名
  13. String password="123456";//密码(mysql自己的密码)
  14. /*
  15. * 链接数据库,获取detail,查询新闻内容列表
  16. */
  17. public void getNewsDetailList(){
  18. Connection connection=null;
  19. Statement stat=null;
  20. ResultSet rs=null;
  21. try {
  22. //1.加载驱动(java反射实现)
  23. Class.forName(driver);
  24. //2.DriverManager类来获取connection链接
  25. connection=DriverManager.getConnection(url, userName, password);
  26. //3.创建Statement对象,执行SQL语句
  27. stat=connection.createStatement();
  28. String sql ="select * from news_detail";
  29. //执行sql后保存结果
  30. rs=stat.executeQuery(sql);
  31. //4.遍历Resultset 获得返回结果
  32. while(rs.next()){
  33. int id=rs.getInt("id");
  34. String title=rs.getString("title");
  35. Timestamp createDate=rs.getTimestamp("createDate");
  36. System.out.println(id+"--"+title+"--"+createDate);
  37. }
  38. //5.finally中关闭流,释放资源
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }finally{
  42. try {
  43. if(rs!=null){
  44. rs.close();
  45. }
  46. if(stat!=null){
  47. stat.close();
  48. }
  49. if(connection!=null){
  50. connection.close();
  51. }
  52. } catch (SQLException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. }
  57. public static void main(String[] args) {
  58. JDBCTest1 jt1=new JDBCTest1();
  59. jt1.getNewsDetailList();
  60. }
  61. }

二、单例模式

1、非单例模式

  1. 提供私有的构造方法和公有静态返回值获得实例方法
  2. public class NoSingleton{
  3. //私有构造
  4. private NoSingleton(){
  5. }
  6. public static Nosingleton getInstance(){
  7. return new NoSingleton;
  8. }
  9. }
  10. 测试
  11. public static void main String[] args){
  12. //非单例两次得到的值不同
  13. //由于构造方法被私有化,所有不能直接new出来,只能.方法
  14. // 非单例模式测试
  15. //不能直接创建,因为构造方法被私有化,输出两值不一样
  16. //NoSingleton ns=new NoSingleton();
  17. //如何创建对象呢?
  18. NoSingleton nsl1=NoSingleton.getInstance;
  19. syso.out.print(nsl1);
  20. NoSingleton nsl2=NoSingleton.getInstance;
  21. syso.out.print(nsl2);
  22. }

2、单例模式

单例模式分为3种:饿汉式 ,懒汉式和双检锁模式
/
单例模式 在系统运行期间内 有且只有一个实例
1、构造方法私有化
2、提供静态的公有方法,返回实例
*/

(1)、饿汉式

  • 饿汉式:
    在系统加载类的时候就创建好这个实例,只创建一次static保证只创建一次。
    以空间换时间 ```java public class EhanShi{ //第一种static EhanShi sEhan= new EhanShi(); //第二种 静态代码块 //在获得实例前先定义变量 static EhanShi es = null; static {

    1. es= new EhanShi();

    } private EhanShi(){

    } public static EhanShi getInstance(){

    1. return es

    }

}

测试 public static void main (String[] args){ EhanShi es1=EhanShi.getInstance(); syso.out.print(es1); EhanShi es2=EhanShi.getInstance(); syso.out.print(es2); }

  1. <a name="MYcUh"></a>
  2. ### (2)、懒汉式
  3. /*<br /> * 懒汉式 <br /> * 在使用的时候才创建,只创建一次<br /> * 用时间换空间 使用创建需要耗时,空间节省<br /> * 请求一次上一次锁
  4. - 由于在使用时候创建,在方法中要判断
  5. */
  6. ```java
  7. public class LanHanShi{
  8. //私有构造
  9. static LanHanShi lhs=null;
  10. private LanHanShi(){
  11. }
  12. //静态返回值方法 一面出现不同值,可以加个锁限制
  13. public static synchronized LanHanShi getInstance(){
  14. if(lhs==null){
  15. lhs=new LanHanShi();
  16. }
  17. return lhs;
  18. }
  19. }
  20. 测试---用线程
  21. public static void main (String[] args){
  22. //懒汉式用之前的 测试方法,出现的值相同,但是在线程测试中有几率出现不同值,所以优化一下,加个锁
  23. //线程测试
  24. Thread th1= new Thread(new Runnable(){
  25. Thread.sleep(1);//要处理异常,目的是为了两次进入不并发
  26. public void run(){
  27. LanHanShi lhs1=LanHanShi.getInstance();
  28. syso.out.print(lhs1);
  29. }
  30. });
  31. Thread th2= new Thread(new Runnable(){
  32. public void run(){
  33. LanHanShi lhs2=LanHanShi.getInstance();
  34. syso.out.print(lhs2);
  35. }
  36. });
  37. th1.start();
  38. th2.start();
  39. }

(3)、双重检锁

/
双检锁—双重检查锁
懒汉升级版—效率更高
只有第一次上锁,之后再请求不许要上
volatile 变量加上后单例始终不会失效
1.内存可见性
2.禁止指令重排序
/

  1. public class DoubleLock{
  2. //
  3. static volatile DoubleLock dl=null;
  4. private DoubleLock(){
  5. }
  6. public static DoublieLock getInstance(){
  7. //第一重
  8. if(dl==null){
  9. //进入第二重
  10. synchronizedDoubleLock.class){
  11. if(dl==null){
  12. dl=new DoubleLock();
  13. }
  14. }
  15. }
  16. return dl;
  17. }
  18. }
  19. 测试--线程
  20. public static void main (String[] args){
  21. //懒汉式用之前的 测试方法,出现的值相同,但是在线程测试中有几率出现不同值,所以优化一下,加个锁
  22. //线程测试
  23. Thread th1= new Thread(new Runnable(){
  24. Thread.sleep(1);//要处理异常,目的是为了两次进入不并发
  25. public void run(){
  26. LanHanShi lhs1=LanHanShi.getInstance();
  27. syso.out.print(lhs1);
  28. }
  29. });
  30. Thread th2= new Thread(new Runnable(){
  31. public void run(){
  32. LanHanShi lhs2=LanHanShi.getInstance();
  33. syso.out.print(lhs2);
  34. }
  35. });
  36. th1.start();
  37. th2.start();
  38. }

3、单例模式的优缺点?
单例模式的优缺点
(优点)
单例类只有一个实例,节省了内存资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;
单例模式可以在系统设置全局的访问点,优化和共享数据,例如前面说的Web应用的页面计数器就可以用单例模式实现计数值的保存。
(缺点)
单例模式一般没有接口,扩展的话除了修改代码基本上没有其他途径。
4、懒汉和饿汉的区别?
(1)、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
(2)、从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,;类加载较慢,但获取对象速度快,所以看成“空间换时间”,类的加载速度较快,但运行时间慢,所以看成“时间换空间”

三、使用配置文件访问数据库

原因:优势在于,可以一次性编写,随时调用,并且一旦数据库发生变化,只要随时修改配置文件即可,无需修改源代码;

  1. dataBase文件
  2. #mysql数据库驱动
  3. driver=com.mysql.jdbc.Driver
  4. #数据库URL
  5. url=jdbc:mysql://127.0.0.1:3306/kgcnews
  6. #用户名
  7. userName=root
  8. #密码
  9. password=123456
  10. configManager
  11. package cn.bdqn.util;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.util.Properties;
  15. /*
  16. * 读取数据库的配置文件
  17. * 只读取一次 采用单例模式
  18. */
  19. public class ConfigManager {
  20. //单例模式 启动的时候加载好--饿汉
  21. private static ConfigManager cofigManager= new ConfigManager();
  22. //声明properties对象
  23. private Properties properties;
  24. private ConfigManager(){
  25. //数据库配置文件初始化
  26. String configFile="dataBase.properties";
  27. properties=new Properties();
  28. //读取文件configFile返回文件流,通过ConfigManager获得
  29. //getClassLoader对象读取指定的 文件信息,返回InputStream
  30. InputStream is=ConfigManager.class.getClassLoader()
  31. .getResourceAsStream(configFile);
  32. try {
  33. //加载文件流 load()读取配置文件
  34. properties.load(is);
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }finally{
  38. try {
  39. if(is!=null){
  40. is.close();
  41. }
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. public static ConfigManager getInstance(){
  48. return cofigManager;
  49. }
  50. //通过key获取value值
  51. public String getValue(String key){
  52. return properties.getProperty(key);
  53. }
  54. }
  55. JDBCTest测试类
  56. package cn.bdqn.dao;
  57. import java.sql.Connection;
  58. import java.sql.DriverManager;
  59. import java.sql.ResultSet;
  60. import java.sql.SQLException;
  61. import java.sql.Statement;
  62. import java.sql.Timestamp;
  63. import cn.bdqn.util.ConfigManager;
  64. public class JDBCTest1 {
  65. //链接数据库前,声明四个变量---四要素
  66. String driver=ConfigManager.getInstance().getValue("driver");//驱动名称
  67. String url=ConfigManager.getInstance().getValue("url");//数据库地址
  68. String userName = ConfigManager.getInstance().getValue("userName");//用户名
  69. String password=ConfigManager.getInstance().getValue("password");//密码(mysql自己的密码)
  70. /*
  71. * 链接数据库,获取detail,查询新闻内容列表
  72. */
  73. public void getNewsDetailList(){
  74. Connection connection=null;
  75. Statement stat=null;
  76. ResultSet rs=null;
  77. try {
  78. //1.加载驱动(java反射实现)
  79. Class.forName(driver);
  80. //2.DriverManager类来获取connection链接
  81. connection=DriverManager.getConnection(url, userName, password);
  82. //3.创建Statement对象,执行SQL语句
  83. stat=connection.createStatement();
  84. String sql ="select * from news_detail";
  85. //执行sql后保存结果
  86. rs=stat.executeQuery(sql);
  87. //4.遍历Resultset 获得返回结果
  88. while(rs.next()){
  89. int id=rs.getInt("id");
  90. String title=rs.getString("title");
  91. Timestamp createDate=rs.getTimestamp("createDate");
  92. System.out.println(id+"--"+title+"--"+createDate);
  93. }
  94. //5.finally中关闭流,释放资源
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }finally{
  98. try {
  99. if(rs!=null){
  100. rs.close();
  101. }
  102. if(stat!=null){
  103. stat.close();
  104. }
  105. if(connection!=null){
  106. connection.close();
  107. }
  108. } catch (SQLException e) {
  109. e.printStackTrace();
  110. }
  111. }
  112. }
  113. public static void main(String[] args) {
  114. JDBCTest1 jt1=new JDBCTest1();
  115. jt1.getNewsDetailList();
  116. }
  117. }

四、优化操作

查询新闻列表;全查news_detail所有数据

1、dao包—-BaseDao

2、dao包—-NewsDetailDao接口

3、pojo包—-NewsDetail实体类

4、impl包—-NewsDetailDaoImpl接口实现类

5、dao包—-Test测试类

BaseDao:

  1. public class BaseDao{
  2. //父类,基础Dao类存储等公共操作
  3. String driver = ConfigManager.getInstance().getValue("driver");
  4. String url=ConfigManager.getInstance().getValue("url");//数据库地址
  5. String userName = ConfigManager.getInstance().getValue("userName");//用户名
  6. String password=ConfigManager.getInstance().getValue("password");//密码(mysql自己的密码)
  7. protected Connection connection = null;
  8. protected PreparedStatement pstat = null;
  9. protected ResultSet rs = null;
  10. //获得数据库连接方法
  11. public Connection getConnection(){
  12. try {
  13. Class.forName(driver);
  14. connection=DriverManager.getConnection(url, userName, password);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. return connection;
  19. }
  20. //统一释放资源方法
  21. public void close(){
  22. try {
  23. if(rs!=null){
  24. rs.close();
  25. }
  26. if(pstat!=null){
  27. pstat.close();
  28. }
  29. if(connection!=null){
  30. connection.close();
  31. }
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

接口实现类:

  1. import java.sql.Connection;
  2. import java.sql.SQLException;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. import cn.bdqn.dao.BaseDao;
  7. import cn.bdqn.dao.NewsDetailDao;
  8. import cn.bdqn.pojo.NewsDetail;
  9. //impl包里存放实现类---新闻详情接口的实现类
  10. public class NewsDetailDaoImpl extends BaseDao implements NewsDetailDao {
  11. //查询新闻列表;全查news_detail所有数据
  12. public List<NewsDetail> getNewsDetailList(){
  13. List<NewsDetail> list = new ArrayList<NewsDetail>();
  14. //查询数据库
  15. connection=getConnection();
  16. String sql="select * from news_detail";
  17. try {
  18. pstat=connection.prepareStatement(sql);
  19. //执行sql语句
  20. rs=pstat.executeQuery();
  21. while(rs.next()){
  22. NewsDetail nd=new NewsDetail();
  23. nd.setId(rs.getInt("id"));
  24. nd.setCategoryId(rs.getInt("categoryId"));
  25. nd.setTitle(rs.getString("title"));
  26. nd.setSummary(rs.getString("summary"));
  27. nd.setContent(rs.getString("content"));
  28. nd.setPicPath(rs.getString("picPath"));
  29. nd.setAuthor(rs.getString("author"));
  30. nd.setCreateDate(new Date(rs.getTimestamp("createDate").getTime()));
  31. nd.setModifyDate(new Date(rs.getTimestamp("modifyDate").getTime()));
  32. list.add(nd);
  33. }
  34. } catch (SQLException e) {
  35. e.printStackTrace();
  36. }finally{
  37. close();
  38. }
  39. return list;
  40. }
  41. }
  42. //2、//根据id查询内容
  43. public NewsDetail getNewsDetailById(Integer id){
  44. NewsDetail nd=null;
  45. connection = getConnection();
  46. String sql = "select * from news_detail where id=?";
  47. try {
  48. pstat=connection.prepareStatement(sql);
  49. pstat.setInt(1, id);
  50. rs=pstat.executeQuery();
  51. while(rs.next()){
  52. nd=new NewsDetail();
  53. nd.setId(rs.getInt("id"));
  54. nd.setCategoryId(rs.getInt("categoryId"));
  55. nd.setTitle(rs.getString("title"));
  56. nd.setSummary(rs.getString("summary"));
  57. nd.setContent(rs.getString("content"));
  58. nd.setPicPath(rs.getString("picPath"));
  59. nd.setAuthor(rs.getString("author"));
  60. nd.setCreateDate(new Date(rs.getTimestamp("createDate").getTime()));
  61. nd.setModifyDate(new Date(rs.getTimestamp("modifyDate").getTime()));
  62. }
  63. } catch (SQLException e) {
  64. e.printStackTrace();
  65. }finally{
  66. close();
  67. }
  68. return nd;
  69. }

实体类:

  1. //创建实体
  2. public class NewsDetail {
  3. private Integer id;
  4. private Integer categoryId;
  5. private String title;
  6. private String summary;
  7. private String content;
  8. private String picPath;
  9. private String author;
  10. private Date createDate;
  11. private Date modifyDate;
  12. public Integer getId() {
  13. return id;
  14. }
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. public Integer getCategoryId() {
  19. return categoryId;
  20. }
  21. public void setCategoryId(Integer categoryId) {
  22. this.categoryId = categoryId;
  23. }
  24. public String getTitle() {
  25. return title;
  26. }
  27. public void setTitle(String title) {
  28. this.title = title;
  29. }
  30. public String getSummary() {
  31. return summary;
  32. }
  33. public void setSummary(String summary) {
  34. this.summary = summary;
  35. }
  36. public String getContent() {
  37. return content;
  38. }
  39. public void setContent(String content) {
  40. this.content = content;
  41. }
  42. public String getPicPath() {
  43. return picPath;
  44. }
  45. public void setPicPath(String picPath) {
  46. this.picPath = picPath;
  47. }
  48. public String getAuthor() {
  49. return author;
  50. }
  51. public void setAuthor(String author) {
  52. this.author = author;
  53. }
  54. public Date getCreateDate() {
  55. return createDate;
  56. }
  57. public void setCreateDate(Date createDate) {
  58. this.createDate = createDate;
  59. }
  60. public Date getModifyDate() {
  61. return modifyDate;
  62. }
  63. public void setModifyDate(Date modifyDate) {
  64. this.modifyDate = modifyDate;
  65. }
  66. }

接口:

  1. import java.util.List;
  2. import cn.bdqn.pojo.NewsDetail;
  3. public interface NewsDetailDao {
  4. //新闻详情接口
  5. public List<NewsDetail> getNewsDetailList();
  6. }

测试:

  1. import java.util.List;
  2. import cn.bdqn.dao.impl.NewsDetailDaoImpl;
  3. import cn.bdqn.pojo.NewsDetail;
  4. public class Test {
  5. public static void main(String[] args) {
  6. //全查找测试
  7. NewsDetailDao ndd=new NewsDetailDaoImpl();
  8. List<NewsDetail> list=ndd.getNewsDetailList();
  9. for (NewsDetail nd : list) {
  10. System.out.println(nd.getId()+"--"+nd.getTitle());
  11. }
  12. //根据id查找测试
  13. NewsDetailDao ndd=new NewsDetailDaoImpl();
  14. NewsDetail nd=ndd.getNewsDetailById(3);
  15. // if(nd==null){
  16. // System.out.println("未找到数据");
  17. // }else{
  18. // System.out.println(nd.getId()+"--"+nd.getTitle());
  19. //
  20. // }
  21. }
  22. }

五、查询、添加

需要用到的 类
①、dao包—BaseDao—父类
②、pojo包—NewsDetail—实体
③、impl包—NewsDetailDaoImpl—接口实现类
④、dao包—NewsDetailDao—接口
⑤、dao包—test—测试

1、查询

查询操作在优化操作1—5;

2、添加

其他类相同
接口:

  1. public int insert(NewsDetail nd);

实现类:

  1. //添加数据,成功返回数字,不成功返回0
  2. public int insert(NewsDetail nd){
  3. int result=0;
  4. connection=getConnection();
  5. String sql="insert into news_detail(categoryId,title,summary,"+
  6. "content,picPath,author,createDate,modifyDate)"+
  7. "values(?,?,?,?,?,?,?,?)";
  8. try {
  9. pstat=connection.prepareStatement(sql);
  10. pstat.setInt(1, nd.getCategoryId());
  11. pstat.setString(2, nd.getTitle());
  12. pstat.setString(3, nd.getSummary());
  13. pstat.setString(4, nd.getContent());
  14. pstat.setString(5, nd.getPicPath());
  15. pstat.setString(6, nd.getAuthor());
  16. pstat.setTimestamp(7, new Timestamp(nd.getCreateDate().getTime()));
  17. pstat.setTimestamp(8, new Timestamp(nd.getModifyDate().getTime()));
  18. //影响了几条数据
  19. result=pstat.executeUpdate();
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. }finally{
  23. close();
  24. }
  25. return result;
  26. }

测试:

  1. //添加测试
  2. NewsDetailDao ndd=new NewsDetailDaoImpl();
  3. NewsDetail nd= new NewsDetail();
  4. nd.setCategoryId(2);
  5. nd.setTitle("日本核泄漏");
  6. nd.setSummary("日本将核废水排入大海,遭到周边国家谴责");
  7. nd.setContent("中日韩等沿海及内地国家一致反对,并请菅义伟对此事负责");
  8. nd.setAuthor("admin");
  9. nd.setCreateDate(new Date());
  10. nd.setModifyDate(new Date());
  11. int result =ndd.insert(nd);
  12. System.out.println(result);

六、练习用户表查询和添加

  1. user实体类
  2. public class NewsUser {
  3. private Integer id;
  4. private String userName;
  5. private String password;
  6. private String email;
  7. private Integer userType;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public void setUserName(String userName) {
  18. this.userName = userName;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. public String getEmail() {
  27. return email;
  28. }
  29. public void setEmail(String email) {
  30. this.email = email;
  31. }
  32. public Integer getUserType() {
  33. return userType;
  34. }
  35. public void setUserType(Integer userType) {
  36. this.userType = userType;
  37. }
  38. }
  39. 接口实现类
  40. public class NewsUserImpl extends BaseDao implements NewsUserDao{
  41. //查询用户列表
  42. public List<NewsUser> getNewsUserList(){
  43. List<NewsUser> list = new ArrayList<NewsUser>();
  44. //查询数据库
  45. connection=getConnection();
  46. String sql ="select * from news_user";
  47. try {
  48. pstat=connection.prepareStatement(sql);
  49. //执行sql语句
  50. rs=pstat.executeQuery();
  51. while(rs.next()){
  52. NewsUser nu=new NewsUser();
  53. nu.setId(rs.getInt("id"));
  54. nu.setUserName(rs.getString("userName"));
  55. nu.setPassword(rs.getString("password"));
  56. nu.setEmail(rs.getString("email"));
  57. nu.setUserType(rs.getInt("userType"));
  58. list.add(nu);
  59. }
  60. } catch (SQLException e) {
  61. e.printStackTrace();
  62. }finally{
  63. close();
  64. }
  65. return list;
  66. }
  67. //通过id查询
  68. public NewsUser getNewsUserById(Integer id){
  69. NewsUser nu=new NewsUser();
  70. connection = getConnection();
  71. String sql = "select * from news_user where id=?";
  72. try {
  73. pstat=connection.prepareStatement(sql);
  74. pstat.setInt(1, id);
  75. rs=pstat.executeQuery();
  76. while(rs.next()){
  77. nu.setId(rs.getInt("id"));
  78. nu.setUserName(rs.getString("userName"));
  79. nu.setPassword(rs.getString("password"));
  80. nu.setEmail(rs.getString("email"));
  81. nu.setUserType(rs.getInt("userType"));
  82. }
  83. } catch (SQLException e) {
  84. e.printStackTrace();
  85. }finally{
  86. close();
  87. }
  88. return nu;
  89. }
  90. //向用户表添加数据
  91. public int insert(NewsUser nu){
  92. int result=0;
  93. connection=getConnection();
  94. String sql="insert into news_user(userName,password,email,userType)"+
  95. "values(?,?,?,?)";
  96. try {
  97. pstat=connection.prepareStatement(sql);
  98. pstat.setString(1, nu.getUserName());
  99. pstat.setString(2, nu.getPassword());
  100. pstat.setString(3, nu.getEmail());
  101. pstat.setInt(4, nu.getUserType());
  102. result=pstat.executeUpdate();
  103. } catch (SQLException e) {
  104. e.printStackTrace();
  105. }finally{
  106. close();
  107. }
  108. return result;
  109. }
  110. //由于查询时候,都有这段相同的代码,所以提出来
  111. //packageNewsUser( rs, nu);
  112. // private void packageNewsUser(ResultSet rs,NewsUser nu) throws SQLException{
  113. // nu.setId(rs.getInt("id"));
  114. // nu.setUserName(rs.getString("userName"));
  115. // nu.setPassword(rs.getString("password"));
  116. // nu.setEmail(rs.getString("email"));
  117. // nu.setUserType(rs.getInt("userType"));
  118. // }
  119. }
  120. 接口
  121. public interface NewsUserDao {
  122. public List<NewsUser> getNewsUserList();
  123. public int insert(NewsUser nu);
  124. public NewsUser getNewsUserById(Integer id);
  125. }
  126. 测试
  127. public class NewsUserTest {
  128. public static void main(String[] args) {
  129. NewsUserDao nud=new NewsUserImpl();
  130. // //显示用户表信息
  131. // List<NewsUser> list=nud.getNewsUserList();
  132. // for (NewsUser nu : list) {
  133. // System.out.println(nu.getId()+"--"+nu.getUserName()+"--"
  134. // +nu.getEmail()+nu.getUserType());
  135. // }
  136. //按照id查询
  137. // NewsUser newUser=nud.getNewsUserById(2);
  138. // System.out.println(newUser.getId()+"--"+newUser.getUserName());
  139. //添加数据
  140. NewsUser nu=new NewsUser();
  141. nu.setUserName("App");
  142. nu.setPassword("appplus");
  143. nu.setEmail("App@ton.com");
  144. nu.setUserType(1);
  145. int result=nud.insert(nu);
  146. System.out.println(result);
  147. }
  148. }

七、更新新闻表

//更新新闻的标题测试—先查再更新
//先查再更新某一项,是避免字段被自动填充成空
接口实现类:

  1. //更新--返回影响的条数
  2. public int update(NewsDetail nd){
  3. int result=0;
  4. connection=getConnection();
  5. //id和createDate不更新
  6. String sql="update news_detail set categoryId=?,"
  7. +"title=?,summary=?,content=?,picPath=?,"
  8. +"author=?,modifyDate=? where id=?";
  9. try {
  10. pstat=connection.prepareStatement(sql);
  11. pstat.setInt(1, nd.getCategoryId());
  12. pstat.setString(2, nd.getTitle());
  13. pstat.setString(3, nd.getSummary());
  14. pstat.setString(4, nd.getContent());
  15. pstat.setString(5, nd.getPicPath());
  16. pstat.setString(6, nd.getAuthor());
  17. pstat.setTimestamp(7, new Timestamp(nd.getModifyDate().getTime()));
  18. pstat.setInt(8, nd.getId());
  19. result=pstat.executeUpdate();
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. }finally{
  23. close();
  24. }
  25. return result;
  26. }
  27. //按照id查找
  28. public NewsDetail getNewsDetailById(Integer id){
  29. NewsDetail nd=null;
  30. connection=getConnection();
  31. String sql="select * from news_detail where id=?";
  32. try {
  33. pstat=connection.prepareStatement(sql);
  34. pstat.setInt(1, id);
  35. rs=pstat.executeQuery();
  36. while(rs.next()){
  37. nd=new NewsDetail();
  38. nd.setId(rs.getInt("id"));
  39. nd.setCategoryId(rs.getInt("categoryId"));
  40. nd.setTitle(rs.getString("title"));
  41. nd.setSummary(rs.getString("summary"));
  42. nd.setContent(rs.getString("content"));
  43. nd.setPicPath(rs.getString("picPath"));
  44. nd.setAuthor(rs.getString("author"));
  45. nd.setCreateDate(new Date(rs.getTimestamp("createDate").getTime()));
  46. nd.setModifyDate(new Date(rs.getTimestamp("modifyDate").getTime()));
  47. }
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }finally{
  51. close();
  52. }
  53. return nd;
  54. }

接口:

  1. public int update(NewsDetail nd);
  2. public NewsDetail getNewsDetailById(Integer id);

测试:

  1. //更新新闻的标题测试--先查再更新
  2. //先查再更新某一项,是避免字段被自动填充成空
  3. NewsDetailDao ndd=new NewsDetailDaoImpl();
  4. NewsDetail nd= ndd.getNewsDetailById(2);
  5. nd.setTitle("OnePice");
  6. int i=ndd.update(nd);
  7. System.out.println(i);

八、更新用户表
接口实现类:

  1. //更新用户表--根据用户修改密码
  2. public int updatePasswordById(String password,Integer id){
  3. int result=0;
  4. connection=getConnection();
  5. String sql="update news_user set password=? where id=?";
  6. try {
  7. pstat=connection.prepareStatement(sql);
  8. pstat.setString(1, password);
  9. pstat.setInt(2, id);
  10. result=pstat.executeUpdate();
  11. } catch (SQLException e) {
  12. e.printStackTrace();
  13. }finally{
  14. close();
  15. }
  16. return result;
  17. }

接口:

  1. public int updatePasswordById(String password,Integer id);

测试:

  1. //用户表更新测试--此时不需要先查询
  2. NewsDetailDao ndd=new NewsDetailDaoImpl();
  3. int i=nud.updatePasswordById("abs123", 3);
  4. System.out.println(i);

八、删除新闻表信息

接口实现类:

  1. //新闻删除--逐条删
  2. public int delete(Integer id){
  3. int result=0;
  4. connection=getConnection();
  5. String sql="delete from news_detail where id=?";
  6. try {
  7. pstat=connection.prepareStatement(sql);
  8. pstat.setInt(1, id);
  9. result=pstat.executeUpdate();
  10. } catch (SQLException e) {
  11. e.printStackTrace();
  12. }finally{
  13. close();
  14. }
  15. return result;
  16. }

接口:

  1. public int delete(Integer id);

测试:

  1. //删除新闻测试
  2. int i=ndd.delete(5);
  3. System.out.println(i);

九、java操作SQL显示到网页上

首先介绍三层
Dao层——-数据层
Services—-业务层
—-转发层
其次需要的类
①、dao包—BaseDao—父类
②、services包—NewsServices—接口
③、impl包—NewsServicesImpl—接口实现类
④、webContent—news—NewsDetailList—JSP文件
接口:

  1. //新闻详情业务接口
  2. public interface NewsServices {
  3. public List<NewsDetail> getNewsDetailList();
  4. }

接口实现类:

  1. package cn.bdqn.services.impl;
  2. import java.util.List;
  3. import cn.bdqn.dao.NewsDetailDao;
  4. import cn.bdqn.dao.impl.NewsDetailDaoImpl;
  5. import cn.bdqn.pojo.NewsDetail;
  6. import cn.bdqn.services.NewsServices;
  7. //接口实现类---Services层存在是因为之后要形成一对多的DAO
  8. public class NewsServicesImpl implements NewsServices{
  9. NewsDetailDao ndd=new NewsDetailDaoImpl();
  10. public List<NewsDetail> getNewsDetailList(){
  11. return ndd.getNewsDetailList();
  12. }
  13. }

JSP文件

  1. <style>
  2. td{
  3. border:black solid 1px
  4. }
  5. </style>
  6. <body>
  7. <table style="border:black solid 1px;border-collapse: collapse;">
  8. <tr>
  9. <td>id</td>
  10. <td>标题</td>
  11. </tr>
  12. <%
  13. NewsServices ns=new NewsServicesImpl();
  14. List<NewsDetail> list=ns.getNewsDetailList();
  15. for(int i=0;i<list.size();i++){
  16. NewsDetail nd=list.get(i);
  17. %>
  18. <tr>
  19. <td><%=nd.getId() %></td>
  20. <td><%=nd.getTitle() %></td>
  21. </tr>
  22. <%}%>
  23. </table>
  24. </body>