JAVA操作mysql(如何更加面向对象的操作数据库)
既然谈到面向对象,所以,先把连接信息给搞个对象出来:
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(如何更加面向对象的操作数据库)的更多相关文章
- java连接mysql以及增删改查操作
java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...
- 简单的在jsp页面操作mysql
---恢复内容开始--- 上一篇讲了在DOS界面下操作mysql 现在我们来说说怎么在jsp页面中操作mysql 要用jsp页面操作mysql需要jdbc(不是非要jdbc,还有其他的) 下载地址:w ...
- 使用JDBC操作MySQL
使用JDBC操作MySQL 步骤 加载驱动 连接数据库 操作数据库(增删改查) 关闭结果集,操作,数据库 准备工作 java连接MySQL的jar包 加载数据库驱动 public class Load ...
- python3操作mysql教程
一.下载\安装\配置 1. python3 Python3下载网址:http://www.python.org/getit/ 当前最新版本是python3.2,下载地址是 http://www.pyt ...
- python操作mysql基础一
python操作mysql基础一 使用Python操作MySQL的一些基本方法 前奏 为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_te ...
- MySQL数据库4Python操作mysql、索引、慢查询日志
目录 一.Python 操作 mysql 1.1python 操作 mysql 1.2查询数据 1.3增加(添加.更新)数据 1.4修改数据 1.5删除数据 1.6SQL注入问题 1.6.1问题的引入 ...
- day06 python代码操作MySQL
day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...
- JAVA对mysql的基本操作
一.了解几个概念(了解) 1.DriverManager 1)必须知道它是管理数据库的所有驱动程序 2)它的所有方法都是静态的,其中最重要的是getConnection()方法,我们可以通过它获取一个 ...
- java分享第十七天-03(封装操作mysql类)
JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...
随机推荐
- __attribute__中constructor和destructor[总结]
1.前言 最近看到一份代码,看到一个函数前面用__attribute__((destructor))修饰,当时感觉有点怪怪的,搜了整个程序,也没发现哪个地方调用这个函数.于是从字面意思猜想,该函数会在 ...
- Pandas DataFrame学习笔记
对一个DF r1 r2 r3 c1 c2 c3 选行: df['r1'] df['r2':'r2'] #包含r2 df[df['c1']>5] #按条件选 选列: df['c1'] ...
- Modbus常用功能码协议详解
Modbus常用功能码协议详解 01H-读线圈状态 1)描述:读从机线圈寄存器,位操作,可读单个或者多个: 2)发送指令: 假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x003 ...
- 内建DNS服务器--BIND
参考 BIND 官网:http://www.isc.org/downloads/bind/ 1.系统环境说明 [root@clsn6 ~]# cat /etc/redhat-release CentO ...
- oracle 学习blogs
http://blog.sina.com.cn/s/blog_5dfbafd20100sxv7.html
- Linux FastDFS 分布式文件系统安装
Linux FastDFS 分布式文件系统安装 2013 年 3 月 11 日 – 09:21 | 930 views | 收藏 (No Ratings Yet) FastDFS是一款类Google ...
- C#.NET常见问题(FAQ)-如何使用右下角托盘图标notifyIcon
1 拖放一个NotifyIcon控件,并设置图标,还有显示的文字 2 双击这个控件,即当最小化了主窗体,然后双击这个右下角图标的时候,要显示主窗体(大部分程序的用户体验都是这样干的,比如QQ,双击 ...
- Android 之 PackageManager获取的应用程序信息与AndroidManifest文件中设置的信息不一致问题
有时我们需要用 PackageManager 来获取应用程序的版本号和版本名称等信息,通过以下代码来获取: PackageManager manager = getPackageManager(); ...
- C++ 第十一课 标准c内存函数
calloc() 分配一个二维储存空间 free() 释放已分配空间 malloc() 分配空间 realloc() 改变已分配空间的大小 calloc 语法: #include <st ...
- 动态加载jar包(二)
上次说的加载jar包,有几个问题没有解决: 1.如果项目包含了其他的jar包如何解决? 2.如何规范上传的jar包的类和方法? 下面就解决一下上面两个问题 一.首先编写被调用的类,这次使用maven工 ...