数据库的增、删、改、查操作-----(一)

  初学JAVA,想把一些笔记以博客的形式保存。

最近学了一些有关数据库操作的内容:增、删、改、查。下面将这些知识点以实现一个简单的新闻管理系统为例进行分享(注:新闻实体类代码略)。

1、首先我们需要连接数据库(MYSQL),采用直连的方式:

简要说明一下直连的步骤:①导入驱动包→②加载JDBC驱动→③通过驱动管理类获取连接对象→④通过连接对象创建编译对象→⑤定义要执行的SQL语句→⑥通过编译对象设置参数→⑦通过编译对象执行SQL指令并处理返回结果→⑧释放操作源

代码示例:

//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/NEWSDB";
String user = "root";
String password = "root";
//获取连接对象
Connection con = DriverManager.getConnection(url,user,password);
//创建编译对象
Statement st = con.createStatement();
//定义执行的SQL语句
String sql = "select * from newsinfo";
//通过编译对象执行SQL语句
ResultSet rs = st.executeQuery(sql);
//处理返回结果  
if(rs != null){
    while(rs.next()){
        int id = rs.getInt("newsId");
        String title = rs.getString("newsTitle");
        String content = rs.getString("newsTitle");
        System.out.print(id+" "+title+" "+content);
    }
}


 
  直连这一步骤代码块在增、删、改、查数据操作时,要多次被用到,这时我们可以将其提取出来写进一个类里,这样可以节省时间也提高了代码的复用性。 
  

为了使这个类的类对象在内存中只存在一个副本,故本类采用单例设计模式:

①构造函数私有化

②提供一个当前类类型的静态私有属性

③提供一个创建本类对象的公共静态方法

public class DBConnect{
    
    private static DBConnect con;
    //构造函数私有化
    private DBConnect(){
    
    }
    
    public static DBConnect newsInstance(){
        
        if( con == null){
            con = new Connection();
        }
        return con;
    }
    
    /**获取连接的方法**/
    public Connection getConnect(){
        
        Connection con = null;
        try{
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/NEWSDB";
            String user = "root";
            String password = "root";
            //获取连接对象
            con = DriverManager.getConnection(url,user,password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return con;
    }
}

2、接着就可以编写各个操作的方法了。由于增加、修改、删除数据操作类似,只是其中的SQL指令会有所不同,这时我们可以写一个方法,通过传递不同参数来选择执行不同增加、修改或者删除数据操作。这里传递不同参数来选择SQL指令通过定义枚举来实现。
public enum OperateEnum{
      INSERT,UPDATE,DELETE
}
将获取连接对象方法定义成操作类中的一个私有属性,以便后面使用
private DBConnect dbcon = DBConnect.newsInstance();
增加、修改、删除数据操作方法
public int operateEnum(NewsInfo news,OperateEnum openum){
    int row = 0;
    //句柄
    Connection con = null;
    Statement st = null;
    try{
        con = dbcon.getConnection();
        st = con.createStatement();
        //获取属性值
        Integer id = news.getNewsId();
        String title = news.getNewsTitle();
		String content = news.getNewsContent();
		Date date = news.getNewsDate();
        String dateString = null;
		//判断日期值是否为空,不为空则转换成字符串
		if(date != null){
		    //convertDateToString()是将日期对象转换为字符串的方法
			dateString = convertDateToString(date);
		}
		String sql = null;
		switch(openum){
		    case INSERT:
		        sql = "insert into newsinfo values(null,'"+title+"','"+content+"','"+dateString+"')";
		        break;
		    case DELETE:
		        sql = "delete from newsinfo where newsId = " + id;
		        break;
		    case UPDATE:
		        sql =  "update newsinfo set newsTitle = '" + title+ "',newsContent='" + content + "',newsDate='"
					+ dateString + "' where newsId =" + id;
		        break;
		}
		row = st.executeUpdate(sql);
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        st.close();
        if(!con.isClosed()){
            con.close();
            con = null;
        }
    }
    return row;
}

/***把日期对象转换为字符串****/
private String converDateToString(Date date){

    //创建时间格式化对象
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return sdf.format(date);
}
查询操作
public List listNewsInfo(){   
    
    //新闻集合对象
    List newsList = new ArrayList();
    //相关操作句柄
    Connection con = null;
    Statement st = null;
    ResultSet rs = null;
    try{
        con = dbcon.getConnection();
        st = con.createStatement();
        String sql = "select * from newsInfo";
        rs = st.executeQuery(sql);
        if(rs != null){
            while(rs.next()){
                //循环获取当前循环行的每一列对应值
		Integer newsId = rs.getInt("newsId");
		String newsTitle = rs.getString("newsTitle");
		String newsContent = rs.getString("newsContent");
				
		//把java.sql.Timestamp转换为java.util.Date对象
		Date newsDate = new Date(rs.getTimestamp("newsDate").getTime());
				
		//把当前行每一列对应值封装到NewsInfo对象对应属性中
		NewsInfo newsInfo = new NewsInfo();
		newsInfo.setNewsId(newsId);
		newsInfo.setNewsTitle(newsTitle);
		newsInfo.setNewsContent(newsContent);
		newsInfo.setNewsDate(newsDate);
		//把构建的新闻对象存储到新闻集合中
		newsList.add(newsInfo);        
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        st.close();
        if(!con.isClosed()){
            con.close();
            con = null;
        }
    }
    return newsList;
}

/***显示表中所有信息***/
public void showInfo(){
    
    List list = listNewsInfo();
    if(list !=null && list.size() > 0){
        for(NewsInfo news : list){
            System.out.println(news.getNewsId()+"\t\t"+news.getNewsTitle()+"\t\t"+news.getNewsContent()+"\t\t"+convertDateToString(news.getNewsDate()));
        }
    }
}
3、方法写完后,就可以在主类中测试了

public class NewsUI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println("====================欢迎使用新闻管理系统==================");
		Scanner sc = new Scanner(System.in);
		// 创建一个新闻操作类对象
		NewsManager mg = new NewsManager();
		while(true){
			System.out.println("\n1. 添加新闻\n2. 删除新闻\n3. 修改新闻\n4. 查询新闻\n请选择功能(1,2,3,4):");
			int select = sc.nextInt();
			int row = 0;
			//创建一个新闻对象
			NewsInfo news = new NewsInfo();
			
			switch(select){
			case 1:
				sc.nextLine();
				System.out.println("请输入新闻标题:");
				String title = sc.nextLine();
				System.out.println("请输入新闻内容:");
				String content = sc.nextLine();
				
				news.setNewsTitle(title);
				news.setNewsContent(content);
				news.setNewsDate(new Date());
				//调用编辑新闻信息的方法[选择添加功能]
				row = mg.operateNews(news, OperateEnum.INSERT);
				//受影响的行数大于0,即操作成功
				if(row > 0){
					//显示添加后的新闻信息
					mg.showInfo();
				}
				break;
			case 2:
				System.out.println("请输入要删除的新闻的编号");
				int deleId = sc.nextInt();
				//构建一个新闻对象
				news.setNewsId(deleId);
				//调用编辑新闻信息的方法[选择删除功能]
				row = mg.operateNews(news, OperateEnum.DELETE);
				if(row > 0){
					//显示添加后的新闻信息
					mg.showInfo();
				}
				break;
			case 3:
				System.out.println("请输入要修改的新闻的编号:");
				int updateId = sc.nextInt();
				//构建一个新闻对象
				news.setNewsId(updateId);
				System.out.println("原始信息:" + mg.getNewsInfo(news));
				sc.nextLine();
				//提示输入修改信息
				System.out.println("请输入修改后的新闻标题:");
				String newsTitle = sc.nextLine();
				System.out.println("请输入修改后的新闻内容:");
				String newsContent = sc.nextLine();
				System.out.println("请输入修改后的新闻时间:");
				String newsDate = sc.nextLine();
				//把修改的值封装到对象对应属性中
				news.setNewsContent(newsContent);
				try {
						news.setNewsDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(newsDate));
					} catch (ParseException e) {
						e.printStackTrace();
					}
				news.setNewsTitle(newsTitle);
				//调用编辑新闻信息的方法[选择修改功能]
				row = mg.operateNews(news, OperateEnum.UPDATE);
				//受影响的行数大于0,即操作成功
				if(row > 0){
					//显示添加后的新闻信息
					mg.showInfo();
				}
				break;
			case 4:
				mg.showInfo();
				break;
			}
		}
	}

}


你可能感兴趣的:(编程语言,java)