java方式连接数据操作数据库
package com.bdqn.dao.impl;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverAction;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.regex.Matcher;
import javax.swing.plaf.InputMapUIResource;
import com.bdqn.bean.annotation.Column;
import com.bdqn.bean.annotation.Id;
import com.bdqn.bean.annotation.Table;
import com.bdqn.dao.IBaseDao;
import com.bdqn.util.DbUtil;
import com.bdqn.util.StringUtil;
public class BaseDaoimpl<T> implements IBaseDao<T>{
private static Connection conn;
private static String URL;//连接路径
private static String DRIVER;//数据库驱动
private static String USER;//用户名
private static String PASSWORD; //登陆密码
static {
init();
}
public static void init() {
//1.我们使用类的 字节码对象提供一个方法,getResourceAsStream 获取这个属性文件
InputStream in= BaseDaoimpl.class.getResourceAsStream("/jdbc.properties");
//2.
Properties props=new Properties();
//3.通过load去加载一个流,加载进来之后,属性的值装配到了这个Props对象中
try {
props.load(in);
DRIVER = props.getProperty("driver");
URL = props.getProperty("url");
USER = props.getProperty("user");
PASSWORD = props.getProperty("password");
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 得到数据连接 并登录数据库
*/
@Override
public Connection getConnection() {
try {
//一个连接对象,有可能是null ,有可能不是null,只是关闭了
if(conn == null || conn.isClosed() ) {
//驱动 得到 连接对象 路径 用户名 用户密码
conn= DriverManager.getConnection(URL, USER, PASSWORD);
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 执行Sql语句
* 影响行数
*/
@Override
public int executeUpdate(String sql, Object...objects) {
conn = getConnection(); //本类方法
//1 通过连接对象获取ps
PreparedStatement ps =null;
int row=0;
try {
conn.setAutoCommit(false);
ps= conn.prepareStatement(sql);
for(int i=0; i<objects.length;i++) {
ps.setObject(i+1, objects[i]);
}
row =ps.executeUpdate();//执行语句
//进行事务提交
// conn.commit();
} catch (SQLException e) {
//保持数据统一性 捉到的错误进行回滚
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
DbUtil.close(conn, ps);
}
return 0;
}
/**
* 按照id查询 得到一个集合
*/
@Override
public Map<String, Object> queryByPrimaryKey(String sql, Object key) {
conn= getConnection();
//通过连接对象获取ps,
PreparedStatement ps= null;
ResultSet rs =null;
ResultSetMetaData rsmd = null;
Map<String,Object> map= new HashMap<>();
try {
ps= conn.prepareStatement(sql);
ps.setObject(1, key);
//获取结果集
rs=ps.executeQuery();
rsmd=rs.getMetaData();
int row=0;
//结果集封装
while(rs.next()) {
if(row >0) {
throw new RuntimeException("查出不止一个,万万不行的");
}
row++;
//什么当key 什么当值
for(int i=0; i<rsmd.getColumnCount();i++) {
map.put(rsmd.getColumnLabel(i+1), rs.getObject(i+1));
}
System.out.println("以下是你要查询的员工");
System.out.println("id\tname\tsex\taddress\tPhone\temall");
System.out.print(rs.getInt(1)+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getString(3)+"\t");
System.out.print(rs.getString(4)+"\t");
System.out.print(rs.getString(5)+"\t");
System.out.print(rs.getString(6)+"\t");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DbUtil.close(conn, ps);
}
return map;
}
/**
* 客观查找(可以按条件查找)
*/
@Override
public List<Map<String, Object>> selectTive(String sql, Object...objects) {
conn= getConnection();
//通过对象连接对象
PreparedStatement ps= null;
ResultSet rs= null;
ResultSetMetaData rsmd=null;
List<Map<String ,Object>> list=new ArrayList<>();
try {
ps= conn.prepareStatement(sql);
for(int i=1;i<=objects.length;i++) {
ps.setObject(i,objects[i-1]);
}
rs= ps.executeQuery();
rsmd=rs.getMetaData();
//结果集的封装
while(rs.next()) {
Map<String,Object> map =new HashMap<>();
for(int i=0; i<rsmd.getColumnCount();i++) {
map.put(rsmd.getColumnLabel(i+1), rs.getObject(i+1));
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DbUtil.close(conn, ps);
}
return list;
}
/**
* 按照id查找把整个对象插入
*/
@Override
public T selectByKey(String sql, Object id, Class<T> clz) {
T obj= null;
Map<String,Object>map =queryByPrimaryKey(sql, id);
try {
obj=clz.newInstance();
Method[] methods = clz.getDeclaredMethods();
Iterator<Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, Object>entry =it.next();
String key= entry.getKey();
String camel=StringUtil.under2Camel(key);
//如果使用的是下划线风格,讲其转换为驼峰命名风格.\
Object value= entry.getValue();
for(int j = 0 ; j < methods.length ;j ++) {
String method = methods[j].getName();
method = method.substring(3, method.length());
if(method.equalsIgnoreCase(camel) && methods[j].getName().startsWith("set")) {
methods[j].invoke(obj, value);
}
}
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
/**
* 对象 客串化
*/
@Override
public T one(Class<T> clz, Serializable id) {
String tableName= clz.getSimpleName();
String sql ="select * from"+tableName+"where id =?";
System.err.println(sql);
T o=selectByKey(sql, id, clz);
return null;
}
@Override
public T selectOne(Class<T> clz, Serializable id) {
//使用反射动态分析数据,有那些自动
// 1 扫描类注解 2扫描字段注解
Annotation[] classAns = clz.getDeclaredAnnotations();
Field[] fields = clz.getDeclaredFields();
String tableName = null;
List<String> columns = new ArrayList<>();
String key = null;
if(classAns.length > 0 ) {
for(int i = 0 ; i < classAns.length; i++) {
if(classAns[i].annotationType().getSimpleName().equals("Table")) {
Table table = (Table) classAns[i];
tableName = table.name();
if(tableName == null || tableName.equals("")) {
tableName = clz.getSimpleName();
}
}
}
} else {
tableName = clz.getSimpleName();
}
Map<String, String> field2Column = new HashMap<>();
if(fields.length > 0) {
// 获取每一filed的时候就顺便把这个fieldName和value都获取了
for(int i = 0 ; i < fields.length ; i++) {
Annotation[] filedAnnotaions = fields[i].getDeclaredAnnotations();
for (Annotation annotation : filedAnnotaions) {
if(annotation.annotationType().getSimpleName().equals("Column")) {
// 如果加上@Column注解的话。
Column col = (Column) annotation;
columns.add(col.name());
field2Column.put(col.name(), fields[i].getName());
}
if(annotation.annotationType().getSimpleName().equals("Id")) {
// 如果加上@Column注解的话。
Id _id = (Id) annotation;
key = _id.name();
field2Column.put(_id.name(), fields[i].getName());
}
}
}
}
StringBuilder sb = new StringBuilder();
sb.append("select " + key + " , ");
for (String string : columns) {
sb.append(" " + string + ",");
}
// 去除最后一个逗号
sb.deleteCharAt(sb.length()-1);
sb.append(" from " + tableName + " where " + key + " = ? ");
String sql = sb.toString();
System.out.println(sql);
Map<String, Object> map = queryByPrimaryKey(sql, id);
T obj = map2Bean(map,field2Column,clz);
return obj;
}
private T map2Bean(Map<String, Object> map, Map<String, String> field2Column, Class<T> clz) {
try {
T o = clz.newInstance();
// 去调用它的所有的set方法
Method[] methods = clz.getDeclaredMethods();
for (Method method : methods) {
// 遍历field2Column 取它每个值去匹配set方法
Iterator<Entry<String, String>> it = field2Column.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
// 转换大小写之后比较contains还不够安全,采用equsls比较
String methodName = method.getName();
// 如果有某些方法长度不满足3,这个时候截取无疑是不安全的。
if(methodName.length() > 3) {
methodName = methodName.substring(3);
if(methodName.equalsIgnoreCase(value) && method.getName().startsWith("set")) {
// 证明这个值满足条件的
method.invoke(o, map.get(key));
}
}
}
}
return o;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<T> list(String sql, Class<T> clz, Object... objects) {
List<T> list= new ArrayList<>();
List<Map<String,Object>> l = selectTive(sql, objects);
Method[] methods=clz.getDeclaredMethods();
for(int i=0; i<l.size();i++) {
try {
T obj=clz.newInstance();
Map<String, Object> map = l.get(i);
Iterator<Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, Object> entry = it.next();
String key = entry.getKey();
String camel = StringUtil.under2Camel(key);
// 如果使用的是下划线风格,将其转换为驼峰命名 的风格。
Object value = entry.getValue();
for(int j = 0 ; j < methods.length ;j ++) {
String method = methods[j].getName();
method = method.substring(3, method.length());
if(method.equalsIgnoreCase(camel) && methods[j].getName().startsWith("set")) {
methods[j].invoke(obj, value);
}
}
}
list.add(obj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return list;
}
}
java方式连接数据操作数据库的更多相关文章
- 使用python简单连接并操作数据库
python中连接并操作数据库 图示操作流程 一.使用的完整流程 # 1. 导入模块 from pymysql import connect # 2. 创建和数据库服务器的连接,自行设置 服务器地址, ...
- PHP连接MYSQL操作数据库
PHP连接MYSQL操作数据库 <?php $con = mysql_connect("localhost","root",""); ...
- jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?
jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...
- 【node】node连接mongodb操作数据库
1.下载第三方模块mongodb cnpm install mongodb --save 2.检测是否连接成功 1.引入第三方模块mongodb并创建一个客户端 const MongoClient = ...
- 【node】------node连接mongodb操作数据库------【巷子】
1.下载第三方模块mongodb cnpm install mongodb --save 2.检测是否连接成功 1.引入第三方模块mongodb并创建一个客户端 const MongoClient = ...
- 使用Java API连接和操作HBase数据库
创建的数据库存储如下数据 表结构 java代码 public class HbaseTest { /** * 配置ss */ static Configuration config = null; p ...
- JAVA连接、操作数据库的DBHelper
工厂模式的DBHelper 1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.Prepa ...
- java批量插入数据进数据库中
方式1: for循环,每一次进行一次插入数据. 方式2: jdbc的preparedStatement的batch操作 PreparedStatement.addBatch(); ...... Pre ...
- Python 连接、操作数据库
使用python3+pymysql 一.安装python3 a) 从网上下载安装吧 二.安装pymysql https://pypi.python.org/pypi/PyMySQL h ...
随机推荐
- python学习笔记 改变字符串中的某一位
a = ' a = list(a) a[2] = ' news = ''.join(a) print news,a 注意不能使用 news = '' news.join(a) 因为news.join只 ...
- ajax实现用户名校验的传统和jquery的$.post方式
第一种:传统的ajax异步请求,后台代码以及效果在最下边 首先我们在eclipse中创建一个注册页面regist.jsp,创建一个form表单,注意,由于我们只是实现用户名校验的效果,下边红色部门是我 ...
- Ipad弹出UIAlertControllerStyleActionSheet时发生崩溃
pad弹出UIAlertControllerStyleActionSheet时,在iphone上运行正常,但在ipad上崩溃,解决代码如下: UIAlertController *alertVc = ...
- Foundation框架中日期的操作
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSDate *date1=[NSD ...
- js实现谷歌网站统计
基本方法 function ga() { if (window.ga) { window.ga.apply(null, arguments); } else { stack.push(argument ...
- 【tyvj P4879】骰子游戏
http://www.tyvj.cn/p/4879 首先,投一个骰子,每个数字出现的概率都是一样的.也就是不算小A的话,n个人投出x个骰子需要的次数和点数无关. 计数问题考虑dp,令f(i,j)为前i ...
- html标签对应的英文原文 - 司徒正美
标签 对应英文 说明 <!--> / 注释 <!DOCTYPE> document type 文档类型 <a> anchor 超链接 <abbr> ab ...
- Windows下docker的安装,将ASP.NET Core程序部署在docker中
参考文章: https://www.cnblogs.com/jRoger/p/aspnet-core-deploy-to-docker.html https://www.cnblogs.com/jRo ...
- Object-C中release的机制问题
今天写了例如以下的一段代码: for (NSInteger i = 0; i < 10000000; i++) { UIView * v = [[UIView alloc] init]; [v ...
- HLJU 1223: 寻找区间和 (交替推进法)
1223: 寻找区间和 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 13 Solved: 4 [Submit][Status][pid=1223& ...