DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试

   概念介绍

  • JDBC

  1. JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,JDBC实现了所有这些面向标准的目标并且具有简单,严格类型定义且高性能实现的接口。
  • Mysql

  1. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  2. MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
  • DAO

  1. DAO (Data Access Objects) 数据访问对象是第一个面向对象的接口,DAO模式是通过对业务层提供数据抽象层接口。它显露了 Microsoft Jet 数据库引擎(由 Microsoft Access 所使用),并允许 Visual Basic 开发者通过 ODBC 象直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或小范围本地分布使用。DAO模式是通过对业务层提供数据抽象层接口。
  • 设计流程
  1. 创建数据库、数据表
  2. 创建项目、项目的包
  3. 配置文件,导入数据库jar包
  4. 创建类文件
  5. JunitTest单元测试
  • 实例

        建议先看完一遍代码,然后理解个大概,一部分一部分的去实现效果会很好(不建议看着代码敲,只要一部分一部分的去理解,很简单的就可以搞定,哈哈!)

    一.创建数据库

  数据库名为:jdbcdb (可以使用SQLyog工具进行数据库的创建)

   二.创建数据表

    CREATE TABLE `person` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) DEFAULT NULL,
   `age` int(100) DEFAULT NULL,
   `description` varchar(200) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

创建完表信息后,在SQLyog工具内打开创建的表,添加以下信息,图示如下:

DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试_第1张图片

三.创建项目、项目的包

  • 在Myeclipse中创建一个java项目,名字自定义
  • 创建包名字如下

com.pxw.util包用来封装工具类,数据库连接。com.pxw.entity包用来封装实体类。com.pxw.dao包用来封装接口的操作方法(增删改查)。com.pxw.daoImpl包用来实现com.pxw.dao包里的接口类.com.pxw.test包用来进行测试jdbc连接数据库后的增删改查操作。

四.导入数据库的jar包及配置文件

  • 首先在项目下右键点击新建一个文件夹名称为lib,然后将相关的数据库的jar包复制黏贴在lib文件夹下,如图所示

DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试_第2张图片

然后鼠标移动到jar包上右键选择“构建路径—添加至构建路径“,到此就完成了导入数据库的包操作(jar包从网上搜索下载即可)

  • 配置文件

在util包下新建一个文本文件名称为DataBase_config.properties,文本的代码如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdb
username=root
password=5200

注:root为安装的Mysql登录用户名,5200为登录密码,根据大家自己安装Mysql时设置的用户名和密码为准!

五.创建类文件编写代码

在com.pxw.util包下创建DBUtils

package com.pxw.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

/**
 * 数据库操作工具类
 * @author PXW
 */
public class DBUtils {
	//数据库驱动
    public static String DRIVER;
    //数据库连接地址/路径
    public static String URL;
    //数据库用户名
    public static String USERNAME;
    //数据库密码
    public static String PASSWORD;
  
    private static ResourceBundle rb = ResourceBundle.getBundle("com.pxw.util.DataBase_config");
    
    	private DBUtils(){}
    
    	//使用静态块加载驱动程序
    	static{
    		URL = rb.getString("url");
    		USERNAME = rb.getString("username");
    		PASSWORD = rb.getString("password");
    		DRIVER = rb.getString("driver");
    		try {
    			Class.forName(DRIVER);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    	//定义一个获取数据库连接的方法
    	public static Connection getConnection(){
    		Connection conn = null;
    		try {
    			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    		} catch (SQLException e) {
    			e.printStackTrace();
    			System.out.println("获取连接失败");
    		}
    		return conn;
    	}
    
    
     //关闭数据库连接
    	public static void close(ResultSet rs,Statement stat,Connection conn){
    		try {
                if(rs!=null)rs.close();
                if(stat!=null)stat.close();
                if(conn!=null)conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
    
}

在 com.pxw.entity包下创建 Person.java

package com.pxw.entity;

/**
 *实体类
 *@author PXW 
 */
public class Person {
    private int id; //id号
    private String name; //姓名
    private int age; //年龄
    private String skills; //描述
    
        //构造函数
        public Person(){
            super();
        }
        //生产get,set方法
        public int getId(){
            return id;
        }
        public void setId(int id){
            this.id = id;
        }
        
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
        
        public int getAge(){
            return age;
        }
        public void setAge(int age){
            this.age = age;
        }
        
        public String getSkills(){
            return skills;
        }
        public void setSkills(String skills){
            this.skills = skills;
        }
        
        //重写toString方法
        
    public String toString() {
            return "|id=" + id + ": 人物:" + name + ", 年龄:" + age
                    + ", 武功秘籍:" + skills + "|";
        }    
}

在com.pxw.dao包下创建 PersonDao.java

package com.pxw.dao;

import java.sql.SQLException;
import java.util.List;
import com.pxw.entity.Person;

/**	
 * 定义实体接口类,用来保存操作方法(增加、删除、更新,查询)
 * @author PXW
 */
public interface PersonDao{
	//定义数据库的操作方法
	public void add(Person p) throws SQLException;	     //根据Person类中的属性来进行"添加"
	public void delete(int id)throws SQLException;	    //根据id来进行"删除"
	public void update(Person p)throws SQLException;   //根据Person类中的属性来进行"更新"
	public ListfindBy(int id)throws SQLException; 	  //根据id来进行单个查询
	public ListfindAll()throws SQLException; //将Person类当作一个集合,方便"查询所有"的属性信息
}

在com.pxw.DaoImpl包下创建 PersonDaoImpl.java

package com.pxw.DaoImpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.pxw.dao.PersonDao;
import com.pxw.entity.Person;
import com.pxw.util.DBUtils;

/**
 * 定义实现类,用来实现PersonDao接口中的操作方法
 * @author PXW
 */
public class PersonDaoImpl implements PersonDao {

	@Override//添加
	public void add(Person p) {
		
		//创建Connection对象,PreparedStatement对象
		Connection conn = null;    
		PreparedStatement pstmt = null;
		
		//获取数据库连接
		conn = DBUtils.getConnection();
		
		try {
			//获取数据库信息
			String sql = "insert into person(name,age,skills)values(?,?,?)"; 	 //添加数据的sql语法
			pstmt = conn.prepareStatement(sql);										//传入sql语句
			pstmt.setString(1, p.getName()); 									   //对象p获取姓名
			pstmt.setInt(2, p.getAge());										  //对象p获取年龄
			pstmt.setString(3, p.getSkills());								 //对象p获取描述
			int rs = pstmt.executeUpdate(); 									//添加数据属性
			if(rs>0){													       //判断rs的值是否大于0
				System.out.println("添加数据成功!");
			}else{
				System.out.println("添加数据失败!");
			}
		} catch (SQLException e) {
		
			e.printStackTrace();
		}finally{
			DBUtils.close(null, pstmt, conn); 						//释放资源/关闭数据连接
		}	
	}

	@Override//删除
	public void delete(int id) {
		//创建Connection对象,PreparedStatement对象
		Connection conn = null;								
		PreparedStatement pstmt = null;
		
		//获取数据库连接
		conn = DBUtils.getConnection();	
		
		try {
			String sql = "delete from person where id = ?";	 //添加数据的sql语法
			pstmt = conn.prepareStatement(sql);				//传入sql语句
			pstmt.setInt(1, id);	 					   //获取id
			int rs = pstmt.executeUpdate();				  //删除数据属性
			if(rs>0){									 //判断rs的值是否大于0
				System.out.println("删除数据成功!");
			}else{
				System.out.println("删除数据失败!");
			}
		} catch (SQLException e) {
		
			e.printStackTrace();
		}finally{
			DBUtils.close(null, pstmt, conn);	//释放资源/关闭数据连接
		}	
		}
		

	@Override//更新
	public void update(Person p) {
		//
		Connection conn = null;
		PreparedStatement pstmt = null;
		//
		conn = DBUtils.getConnection();
		//
		try {
			
			String sql = "update person set name = ?,age = ?,skills = ? where id = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, p.getName());
			pstmt.setInt(2, p.getAge());
			pstmt.setString(3, p.getSkills());
			pstmt.setInt(4, p.getId());
			int rs = pstmt.executeUpdate();
			if(rs>0){									 //判断rs的值是否大于0
				System.out.println("更新数据成功!");
			}else{
				System.out.println("更新数据失败!");
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		}finally{
			DBUtils.close(null, pstmt, conn);
		}
		
	}
	
	@Override
	//按条件查询
	public List findBy(int id) throws SQLException {
		 Connection conn = null;
	        PreparedStatement ps = null;
	        ResultSet rs = null;
	        Person p = null;
	        List persons = new ArrayList();
	        conn = DBUtils.getConnection();
	        try{ 
	            String sql = "select*from person where id =?";
	            ps = conn.prepareStatement(sql);
	            ps.setInt(1, id);
	            rs = ps.executeQuery();
	            while(rs.next()){
	                p = new Person();
	                p.setId(rs.getInt(1));
	                p.setName(rs.getString(2));
	                p.setAge(rs.getInt(3));
	                p.setSkills(rs.getString(4));
	                persons.add(p);
	                System.out.println("查询成功!");
	            }
	        }catch(SQLException e){
	            e.printStackTrace();
	        }finally{
	            DBUtils.close(rs, ps, conn);
	        }
	        return persons;
	    }


	@Override//查询所有
	public List findAll() {
		 Connection conn = null;
	        PreparedStatement ps = null;
	        ResultSet rs = null;
	        Person p = null;
	        List persons = new ArrayList();
	        conn = DBUtils.getConnection();
	        try{ 
	            String sql = "select id,name,age,skills from person";
	            ps = conn.prepareStatement(sql);
	            rs = ps.executeQuery();
	            while(rs.next()){
	                p = new Person();
	                p.setId(rs.getInt(1));
	                p.setName(rs.getString(2));
	                p.setAge(rs.getInt(3));
	                p.setSkills(rs.getString(4));
	                persons.add(p);
	            }
	            System.out.println("查询成功!");
	        }catch(SQLException e){
	            e.printStackTrace();
	        }finally{
	            DBUtils.close(rs, ps, conn);
	        }
	        return persons;
	    }

}

在com.pxw.Test包下创建Test.java

package com.pxw.Test;

import java.sql.SQLException;
import java.util.List;

import com.pxw.DaoImpl.PersonDaoImpl;
import com.pxw.entity.Person;

/**
 * 1.添加JUnit库
 * 2.添加@Test 标记 (注意测试方法内不可传入参数,否则无法回报异常java.lang.Exception: Method 方法名称 should have no)
 * 3.使用Junit单元测试测试查询全部数据
 * 4.测试查询所有
 * @author PXW
 */	
public class Test {
	@org.junit.Test //添加测试标记
	//查询全部数据
	public void TestfindAll(){	
		PersonDaoImpl pdi = new PersonDaoImpl(); //实例化接口对象PersonDaoImpl
			List userList = pdi.findAll(); 
			//遍历及输出
			for(Person user : userList) {	
				
				System.out.println(user);
			
			}
		}
	
	@org.junit.Test //添加测试标记
	//查询单个数据
	public void TestfindBy() throws SQLException{
		PersonDaoImpl pdi = new PersonDaoImpl(); //实例化接口对象PersonDaoImpl
		List userList = pdi.findBy(2); 
		//遍历及输出
		for(Person user : userList) {	
			
			System.out.println(user);
		
		}
	}
		
	@org.junit.Test //添加测试标记
	//添加
	public void Testadd(){
		PersonDaoImpl pdi = new PersonDaoImpl(); //实例化接口对象PersonDaoImpl
		Person p = new Person(); //实例化实体对象Person
		
			p.setName("酒剑仙");	//设置实体对象Name属性的值
			p.setAge(50);  //设置实体对象age属性的值
			p.setSkills("仙风云体术"); //设置实体对象Description属性的值
			pdi.add(p); //将实体对象设置好的属性添加入接口对象中实现添加操作
	
		}
	
	@org.junit.Test //添加测试标记
	//删除
	public void Testdelete(){
		PersonDaoImpl pdi = new PersonDaoImpl(); //实例化接口对象PersonDaoImpl
		pdi.delete(4); //对象接口调用删除方法实现删除操作
	
	}
	
	@org.junit.Test//添加测试标记
	//更新
	public void TestUpdate(){
		PersonDaoImpl pdi = new PersonDaoImpl(); //实例化接口对象PersonDaoImpl
		Person p = new Person();	//实例化实体对象Person
			p.setId(4);
			p.setName("东方不败");	//设置实体对象Name属性的值
			p.setAge(18);  //设置实体对象age属性的值
			p.setSkills("葵花宝典"); //设置实体对象Description属性的值
				pdi.update(p); //将实体对象设置好的属性添加入接口对象中实现更新操作
	}
	
}
		

注:使用JunitTest单元测试,必须先添加junit库,步骤:右键项目,选择构建路径—添加库—junit,然后点击完成(注意测试需要在相应的方法前添加@Test即可)

然后在界面右侧有个大纲字样右键需要测试的方法选择运行方式—Junit测试

DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试_第3张图片

测试结果各个方法输出如下:

TestfindAll()

查询成功!
|id=1: 人物:李逍遥, 年龄:23, 武功秘籍:御剑术|
|id=2: 人物:赵灵儿, 年龄:18, 武功秘籍:回梦|
|id=3: 人物:林月如, 年龄:19, 武功秘籍:七决剑气|
|id=4: 人物:阿奴, 年龄:18, 武功秘籍:变幻|
|id=5: 人物:剑圣, 年龄:100, 武功秘籍:预神术|
|id=6: 人物:唐钰小宝, 年龄:23, 武功秘籍:飞星术|

TestfindBy()

查询成功!
|id=2: 人物:赵灵儿, 年龄:18, 武功秘籍:回梦|

Testadd()

添加数据成功!

Testdelete()

删除数据成功!

TestUpdate()

更新数据成功!

(更新成功后,回到SQLyog软件刷新一下表信息即可看到更新后的字段)

如有错误,指明错误之处,如遇到问题,可在下方评论,我会尽最大能力解决!谢谢
 


 

你可能感兴趣的:(方法,个人见解)