菜鸟级JDBC入门

第一次写博客,哈哈哈,作为一个菜鸟,就先写一下我学习 JDBC 的理解 ,讲解一下入门以及应用。希望能有所帮助。

使用工具以及材料 : eclipse  mysql  sqlyog(连接mysql数据库的工具)jar包 mysql-connector-java-5.1.40.jar


第一步:创建一个WEB 工程,引入jar包(以mysql为例子):mysql-connector-java-5.1.40.jar

接下来在classpath下新建一个 名字为 jdbc.properties 的配置文件,以方便灵活配置数据库,以下是配置

driver=com.mysql.jdbc.Driver //mysql的驱动类随便配置,也可以更改oracle的
jdbcUrl=jdbc:mysql://localhost:3306/teach  //数据库地址
user=root 
password=123456

新建一个类名为 JDBCTools 的工具类,以后可以直接作为工具类

1.操作数据库第一步肯定要创建一个连接,所以:

//获取数据库连接
public  Connection getConnection() throws InstantiationException,
                 IllegalAccessException, ClassNotFoundException, 
                    SQLException, IOException{

        //以下四个变量分别将要赋值为配置文件的值
		String driverClass = null;
		String jdbcUrl = null;
		String user = null;
		String password = null;
		
        
         //用输入流读取配置文件 getResourceAsStream默认读取类路径下的文件
		InputStream in =
		getClass().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");
		
        //利用反射实例化驱动类
		//4 加载驱动  -》jdbcDriverClass静态代码块自己注册驱动程序
	    Class.forName(jdbcDriverClass);
	    
	    //4创建连接用driverManager
	    Connection connection = DriverManager.getConnection(url, user, password);

		return connection;
	}

 

2.获取数据库连接之后就可以操作数据库,对之进行增删改查了   

    1.获取连接                           2.编写sql 使用连接  获取PreparedStatement(sql) 

    3.填充sql中的变量               4 执行数据库操作

    5 对相应的数据进行操作     6关闭数据库连接

以下是一个通用的获取任意一个数据库实体类的方法 ,方法中会调用一个反射方法,还有一个释放连接的方法会在下面一一列举出来

public <T> T getObject(Class<T> clazz, String sql, Object... args) {
		T entity = null;
		// 1获取connection\
		Connection con = null;
		PreparedStatement preparedStatement = null;
        //结果集
		ResultSet resultSet = null;
        //结果集元数据
		ResultSetMetaData resultSetMetaData = null;
		int total = 0;
		List<T> list = new ArrayList<T>();
		try {
			con = JdbcTools.getConnection();
			preparedStatement = con.prepareStatement(sql);
			// 填充sql中的变量
			for (int i = 0; i < args.length; i++) {
				preparedStatement.setObject(i + 1, args[i]);
			}
			resultSet = preparedStatement.executeQuery();
			resultSetMetaData = resultSet.getMetaData();
			total = resultSetMetaData.getColumnCount();

			if (resultSet.next()) {
				Map<String, Object> values = new HashMap<String, Object>();
				for (int i = 0; i < total; i++) {
					String columnLable = resultSetMetaData
							.getColumnLabel(i + 1);
					Object columnValue = resultSet.getObject(i + 1);
					//填充MAP对象
					values.put(columnLable, columnValue);					
				}
				
				//利用反射创建CLASS 对应的对象
				entity = clazz.newInstance();
				//遍历MAP 对象 用反射填充对象的属性值
				//属性名为Map 的key
				for(Map.Entry<String, Object> entry : values.entrySet()){
					String property = entry.getKey();
					Object value = entry.getValue();
					
					//反射添加对象
					ReflectTools.settFieldValue(clazz, property, value , entity);
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
                //释放连接
                JdbcTools.closeJdbcResourse(resultSet, preparedStatement, con);
		}
		return entity;
	}

以下是利用反射将某一个对象的属性进行赋值

public static void settFieldValue(Class<?> clazz, String propertyName,
			Object value , Object desObj) throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException, InstantiationException {

		Field[] fields = clazz.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			
			if (propertyName.equals(fields[i].getName().toString())) {
				Method method = clazz.getMethod("set"
						+ upercaseFirstWord(propertyName) , fields[i].getType());
				//System.out.println(method.toString());
				//Object obj = method.getReturnType();
				//System.out.println(obj);
				method.invoke(desObj, value);
			}
		}

	}

//字符串首字母大写
public static String upercaseFirstWord(String converString) {
		char[] cs = converString.toCharArray();
		cs[0] -= 32;
		return String.valueOf(cs);
	}

释放数据库的连接,将占用的资源释放掉

public static void closeJdbcResourse(ResultSet res, Statement statement,
			Connection con) {
		try {
			if (res != null) {
				res.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		try {
			if (statement != null) {
				statement.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		try {
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

到此一个流程就结束了

感想:

第一次写博客,总是感觉思路不清晰,以及掌握的技术熟练度不够,还有很多要学习和提高的地方啊!

展开阅读全文

没有更多推荐了,返回首页