第一次写博客,哈哈哈,作为一个菜鸟,就先写一下我学习 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 getObject(Class 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 list = new ArrayList();
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 values = new HashMap();
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 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();
}
}
到此一个流程就结束了
感想:
第一次写博客,总是感觉思路不清晰,以及掌握的技术熟练度不够,还有很多要学习和提高的地方啊!