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 ...
随机推荐
- 【图片识别】Java中使用tess4J进行图片文字识别(支持中文)(转)
http://blog.csdn.net/wsk1103/article/details/54173282 java中识别文字比较简单,使用的软件是tesseractocr(使用的版本是3.02,3以 ...
- ASP.NET压力测试
本文导读:对于直接面对互联网用户的WEB应用,在开发设计的时候必须格外小心,因为谁也不知道在单位时间内WEB程序访问和运行的速度.所以,在程序设计完成以后,最后针对程序进行一些严格的甚至是苛刻的测试, ...
- Web安全学习规划
一名合格的Web安全工程师是要具备很多的知识点,不但要对网站架构熟悉,通讯协议,测试流程与测试工具使用,漏洞利用脚本编写,还有需要经验的积累等. 互联网进入下半场,竞争越发的激烈,能与人工智能比肩的热 ...
- 红米1线刷救砖教程V5版(移动联通适用,线刷包永久有效)
红米1线刷救砖教程V5版(移动联通适用,线刷包永久有效) 原文来自:http://www.miui.com/thread-1890972-1-1.html?mobile=2 ,加了些自己的经验. (我 ...
- (纪录片)现代生活的秘密规则:算法 The Secret Rules of Modern Living: Algorithms
简介: The Secret Rules of Modern Living: Algorithms (2015) 导演: David Briggs主演: Marcus du Sautoy类型: 纪录片 ...
- jquery如何获取元素的滚动高度
获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 $(documen ...
- javascript数组操作大全-原创
//1.join() 方法用于把数组中的所有元素放入一个字符串,并通过指定的分隔符进行分隔. //语法:stringObject.join(a)这是它的语法 //a指定分隔符的任意字符串 //返回值: ...
- javascript64位加密
var base64 = new Object(); base64.settings = { char: "+/", pad: "=", ascii: fals ...
- 如何设置Apache中的最大连接数
Apache的主要工作模式有两种:prefork和worker 一.两种模式 prefork模式(缺省模式) prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程 ...
- Word 之 清除页眉下划线
在应用 Word 的时候,有时我们需要为文件添加页眉,但是首页却不需要.这时一般都会勾选“ 首页不同 ”并关闭页眉页脚.一种情况页眉不显示任何信息及下划线,另一种情况页眉留有下划线.以下针对第二种情况 ...