既然谈到面向对象,所以,先把连接信息给搞个对象出来:

public class DBInfo {

    private String driver;

    private String host;

    private String port;

    private String user;

    private String pwd;

    private String dataBase;

    public DBInfo(){
this.driver = "com.mysql.jdbc.Driver";
this.host = "";
this.port = "";
this.user = "";
this.pwd = "";
this.dataBase = "";
} public String getDriver() {
return driver;
} public void setDriver(String driver) {
this.driver = driver;
} public String getHost() {
return host;
} public void setHost(String host) {
this.host = host;
} public String getDataBase() {
return dataBase;
} public void setDataBase(String dataBase) {
this.dataBase = dataBase;
} public String getPort() {
return port;
} public void setPort(String port) {
this.port = port;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} }

既然是操作数据库,我们就把数据库的字段给对象化一下,也就是持久化:在定义变量时,我们搞个约定,比如,数据库字段名为:test_login_name,则定义变量时为:testLoginName.

public class UserInfo {

    private int id;

    private String testName;

    private String testAge;

    private String testHeight;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getTestName() {
return testName;
} public void setTestName(String testName) {
this.testName = testName;
} public String getTestAge() {
return testAge;
} public void setTestAge(String testAge) {
this.testAge = testAge;
} public String getTestHeight() {
return testHeight;
} public void setTestHeight(String testHeight) {
this.testHeight = testHeight;
} }

好,现在有了javabean,有了数据库连接的对象了,再加一个枚举来保存数据库与bean之间的映射关系:

public enum TableBean {

    USER_INFO("com.test.bean.UserInfo");

    private String value;

    private TableBean(String value){
this.value = value;
} public String getValue(){
return value;
}
@Override
public String toString() {
return value;
} public static void main(String[] args){
System.out.println(TableBean.USER_INFO);
} }

再加一个保存ResultSetMetaData信息的类:

public class MetaData {

    public static Map<String, ResultSetMetaData> metaData = new HashMap<String, ResultSetMetaData>();

}

余下就是操作数据库了:

public class ConnectToMySQL {

    private DBInfo dbInfo;

    private Connection conn = null;

    private Statement stmt = null;

    public ConnectToMySQL(){
dbInfo = new DBInfo();
} public DBInfo getDbInfo() {
return dbInfo;
} public void setDbInfo(DBInfo dbInfo) {
this.dbInfo = dbInfo;
} public void connect() {
this.close();
this.connectMySQL();
} public synchronized void close() {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
} private synchronized void connectMySQL() {
try {
Class.forName(dbInfo.getDriver()).newInstance();
conn = (Connection) DriverManager.getConnection("jdbc:mysql://"
+ dbInfo.getHost() + "/" + dbInfo.getDataBase() +"?useUnicode=true&characterEncoding=utf-8", dbInfo.getUser(),dbInfo.getPwd());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} } private void statement() {
if (conn == null) {
this.connectMySQL();
}
try {
stmt = (Statement) conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
} private ResultSet resultSet(String sql) {
ResultSet rs = null;
if (stmt == null) {
this.statement();
}
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
} private void executeUpdate(String sql){
if (stmt == null) {
this.statement();
}
try {
stmt.executeUpdate(sql);
} catch (SQLException e) {
System.out.println(sql);
e.printStackTrace();
}
} public List<Object> query(String tableInfo, String sql) {
List<Object> list = new ArrayList<Object>();
ResultSet rs = this.resultSet(sql);
try {
ResultSetMetaData md = rs.getMetaData();
int cc = md.getColumnCount();
while (rs.next()) {
Object object = this.getBeanInfo(tableInfo);
for (int i = 1; i <= cc; i++) {
String cn = md.getColumnName(i);
this.reflectSetInfo(object, this.changeColumnToBean(cn,"set"), rs.getObject(cn));
}
list.add(object);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} public void insert(String table, Object object){
String sql = "";
try {
this.getMetaData(table);
ResultSetMetaData md = MetaData.metaData.get(table);
int cc = md.getColumnCount();
String insertColumn = "";
String insertValue = "";
for (int i = 2; i <= cc; i++) {
String cn = md.getColumnName(i);
Object gValue = this.reflectGetInfo(object, this.changeColumnToBean(cn,"get"));
if(gValue.getClass().getSimpleName().equals("String")){
gValue = "\""+gValue+"\"";
}
if("".equals(insertColumn)){
insertColumn += cn;
insertValue += gValue;
}else{
insertColumn += ","+cn;
insertValue += ","+gValue;
}
}
sql = "insert into "+table+" ("+insertColumn+") values ("+insertValue+")";
this.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} private void getMetaData(String table){
if(!MetaData.metaData.containsKey(table)){
ResultSet rs = this.resultSet("select * from "+table+" limit 0,1");
try {
MetaData.metaData.put(table, rs.getMetaData());
} catch (SQLException e) {
e.printStackTrace();
}
}
} private Object getBeanInfo(String tableInfo){
Object object = null;
try {
object = Class.forName(tableInfo).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
} private void reflectSetInfo(Object object, String methodName, Object parameter){
try {
Class<? extends Object> ptype = parameter.getClass();
if(parameter.getClass().getSimpleName().equals("Integer")){
ptype = int.class;
}
Method method = object.getClass().getMethod(methodName, ptype);
method.invoke(object, parameter);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} private Object reflectGetInfo(Object object, String methodName){
Object value = null;
try {
Method method = object.getClass().getMethod(methodName);
Object returnValue = method.invoke(object);
if(returnValue!=null){
value = returnValue.toString();
}else{
value = "";
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return value;
} private String columnToBean(String column){
if(column.contains("_")){
int index = column.indexOf("_");
String beanName = column.substring(0, index)
+column.substring(index+1, index+2).toUpperCase()
+column.substring(index+2, column.length());
return beanName;
}
return column;
} private String changeColumnToBean(String column, String ext){
String[] col = column.split("_");
for (int i = 0; i < col.length; i++) {
column = this.columnToBean(column);
}
column =column.replaceFirst(column.substring(0, 1), column.substring(0, 1).toUpperCase());
column = ext+column;
return column;
} public static void main(String[] args) throws SQLException {
ConnectToMySQL c = new ConnectToMySQL();
c.connect();
List<Object> list = c.query(TableBean.APK_INFO.toString(), "select * from user_info"); c.insert("user_info", (UserInfo)list.get(0));
c.close();
}
}

仔细看看吧,query出来就是对象的集合,insert时,就是表名与对象就行了,至于update与delete,大家自已扩展吧!

如果把这个摸清楚,spring操作mysql数据库的原理,你也就差不多了!

JAVA操作mysql(如何更加面向对象的操作数据库)的更多相关文章

  1. java连接mysql以及增删改查操作

    java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...

  2. 简单的在jsp页面操作mysql

    ---恢复内容开始--- 上一篇讲了在DOS界面下操作mysql 现在我们来说说怎么在jsp页面中操作mysql 要用jsp页面操作mysql需要jdbc(不是非要jdbc,还有其他的) 下载地址:w ...

  3. 使用JDBC操作MySQL

    使用JDBC操作MySQL 步骤 加载驱动 连接数据库 操作数据库(增删改查) 关闭结果集,操作,数据库 准备工作 java连接MySQL的jar包 加载数据库驱动 public class Load ...

  4. python3操作mysql教程

    一.下载\安装\配置 1. python3 Python3下载网址:http://www.python.org/getit/ 当前最新版本是python3.2,下载地址是 http://www.pyt ...

  5. python操作mysql基础一

    python操作mysql基础一 使用Python操作MySQL的一些基本方法 前奏 为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_te ...

  6. MySQL数据库4Python操作mysql、索引、慢查询日志

    目录 一.Python 操作 mysql 1.1python 操作 mysql 1.2查询数据 1.3增加(添加.更新)数据 1.4修改数据 1.5删除数据 1.6SQL注入问题 1.6.1问题的引入 ...

  7. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  8. JAVA对mysql的基本操作

    一.了解几个概念(了解) 1.DriverManager 1)必须知道它是管理数据库的所有驱动程序 2)它的所有方法都是静态的,其中最重要的是getConnection()方法,我们可以通过它获取一个 ...

  9. java分享第十七天-03(封装操作mysql类)

     JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...

随机推荐

  1. MongoDB分页的Java实现和分页需求的思考

    前言 传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路. 传统分页思路 假设一页大小为10条.则 //page 1 1-10 //pa ...

  2. python 听课笔记(二)

  3. RabbitMQ的应用场景以及基本原理介绍 【转】

    http://blog.csdn.net/whoamiyang/article/details/54954780 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 背景 应用 ...

  4. Spring(十四):使用FactoryBean配置Bean

    FactoryBean简介: 1)Spring中Bean包含两种一种是普通Bean,另外一种是FactoryBean.它们都受IOC容器管理,但是也有不同之处. 2)普通Bean与FactoryBea ...

  5. Mongoose vs mongodb native driver – what to prefer?

      Paul Shan 7th Jun 2015 Mongoose or mongodb native driver, which one to use? This is one of the ini ...

  6. GitHub没有实时通知怎么办?当然是自己上手写一个啊!

    相信各位程序员对github已经不陌生了.不知道各位有没有注意到GitHub没有推送通知这个功能.当有人在我的存储库中创建了一个提取请求/问题时,我可以收到电子邮件通知,但当有人stars/forks ...

  7. 10 个超炫绘制图表图形的 Javascript 插件【转载+整理】

    原文地址 现在,有很多在线绘制图表和图形(Charts and Graphs)的 JavaScript 插件,这些插件还都是免费,以及图表库.这些插件大量出现的原因是基于一个事实:人们不再依赖于 Fl ...

  8. fortune 计算公式

    fortune 计算PV值. 举例:一笔 120.00的债权; 12天还完,3.15号借款,3.16开始还款.等额本息还款计算出每天还款: 10.22 根据 现值计算公式 PV = CFn/(1+r) ...

  9. WIN10系统如何取消右下角的通知菜单,通知图标

    鼠标左键单击通知按钮,然后点击所有设置   在通知和操作页面,取消勾选所有的通知   建议选择在任务栏显示哪些图标,然后勾选显示所有图标  

  10. SQL字符串分割解析

    常用以下三种: [1]substring( expression ,start , length ): [2]CHARINDEX ( expression1 , expression2 [ , sta ...