问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在编写jdbc的时候要写很多sql很麻烦,能不不能封装一个jdbc的操作,类似于hibernate那样,操作对象就可以

发布网友 发布时间:2022-04-07 17:42

我来回答

3个回答

懂视网 时间:2022-04-07 22:04

       JDBC连接数据库基本的步骤是固定的,这样就可以考虑封装一个工具类来简化数据库操作。

         封装时用到了Java中的properties配置文件,是以一种键值对的形式存在的,可以把连接数据库要动态的信息保存到里面,这样比较直观,不容易出错,而且容易维护。

         把配置文件放到src下就可以,如果要放到包下面就配置文件的相对路径就必须从包名开始。

         Demo :

         db.properties

         

mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8
mysqlUser=root
mysqlPwd=1234
oracleDriver=oracle.jdbc.driver.OracleDriver
oracleURL=jdbc:oracle:thin:@localhost:1521:orcl
oracleUser=scott
oraclePwd=tiger

         JDBCUtil.java

 

package com.wxisme.jdbcutil;

import java.io.Closeable;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * JDBC数据库操作工具类 简化数据库操作
 * @author wxisme
 *
 */
public class JDBCUtil {
	//资源文件
	static Properties pros = null;
	//静态初始化 当加载JDBCUtil类时调用
	static { 
		pros = new Properties();
		try {
			//加载资源文件
			InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
			if(in == null) {
				throw new FileNotFoundException("配置文件未找到");
			}
			pros.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取数据库连接
	 * @return Connection
	 */
	public static Connection getMySQLConnection() {
		Connection conn = null;
		try {
			//加载数据库驱动
			Class.forName(pros.getProperty("mysqlDriver"));
			//获取数据库连接
			conn = DriverManager.getConnection(pros.getProperty("mysqlURL"),
					pros.getProperty("mysqlUser"),pros.getProperty("mysqlPwd"));
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public static Connection getOracleConn(){
		try {
			Class.forName(pros.getProperty("oracleDriver"));
			return DriverManager.getConnection(pros.getProperty("oracleURL"),
					pros.getProperty("oracleUser"),pros.getProperty("oraclePwd"));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 关闭io资源
	 * @param io
	 */
	public static void closeFile(Closeable ... io) {
		for(Closeable temp : io) {
			if(temp != null) {
				try {
					temp.close();
				} catch (IOException e) {
					System.out.println("文件关闭失败");
					e.printStackTrace();
				}
			}
		}
	}
	
	//关闭JDBC资源 注意顺序
	public static void close(ResultSet rs,Statement ps,Connection conn) {
		try {
			if(rs!=null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(ps!=null){
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Statement ps,Connection conn){
		try {
			if(ps!=null){
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Connection conn){
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	

}

   UtilTest.java

package com.wxisme.jdbcutil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class UtilTest {

	public static void main(String[] args) {
		Connection conn = JDBCUtil.getMySQLConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select * from student where id = ?";
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, 1);
			rs = ps.executeQuery();
			
			while(rs.next()) {
				System.out.println(rs.getString("name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 还可以进一步封装成线程安全的工具类。

封装JDBC工具类

标签:

热心网友 时间:2022-04-07 19:12

声明注解


/**
 * 
 * @author 深圳远标培训中心
 *
 */
@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public abstract Class clazz();
public abstract String tableName() default "";
}

/**
 * 
 * @author 深圳远标培训中心
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IdKey {

public abstract String idColumn();
public abstract boolean isGeneraterKey () default false;
}

/**
 * 
 * @author 深圳远标培训中心
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String columnName();
}

编写实体类使用注解


/**
 * @author 深圳远标培训中心
 * 
 *
 */
@Table(clazz=Student.class,tableName="student")
public class Student {

@IdKey(idColumn="stu_id",isGeneraterKey=true)
private Integer stuId;

@Column(columnName="stu_name")
private String stuName;
@Column(columnName="stu_no")
private String stuNo;
public String getStuName() {
return stuName;
}

编写封装


/**
 * 
 * @author 深圳远标培训中心
 *
 * @param <T>
 */
public class BaseDao<T> {

public void save(T object,Class clazz) throws Exception{

StringBuffer sb = new StringBuffer(" insert into ");
String tableName;
List params = new ArrayList();
Field fieldKey = null;
boolean flag = false;
//获取字节码上的注解 获取表名称
if(clazz.isAnnotationPresent(Table.class)){
Table tableAnnotation = (Table) clazz.getAnnotation(Table.class);
tableName = tableAnnotation.tableName();
System.out.println(tableName);
sb.append(tableName).append("( ");
StringBuffer values = new StringBuffer(" values (");

//获取数据库的列的名称
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f : declaredFields){
if(f.isAnnotationPresent(Column.class)){
Column columnAnnotation =  f.getAnnotation(Column.class);
String columnName = columnAnnotation.columnName();
sb.append(columnName).append(",");

f.setAccessible(true);
Object v = f.get(object);
params.add(v);
values.append("?,");
}
if(f.isAnnotationPresent(IdKey.class)){
IdKey idkeyAnnotation = f.getAnnotation(IdKey.class);
if(idkeyAnnotation.isGeneraterKey()){
f.setAccessible(true);
flag = true;
fieldKey = f;
}
}
}
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" ) ");

values.deleteCharAt(values.lastIndexOf(","));
values.append(" ) ");

sb.append(values.toString());

System.out.println(sb.toString());
System.out.println(Arrays.toString(params.toArray()));

Integer key = execute(sb.toString(),params,true);
System.out.println(key);

//设置主键到对象中
fieldKey.set(object, key);

}



}


private Integer execute(String sql, List params,boolean flagGeneraterKey) throws Exception {
Integer key = null;
//测试数据库的连接
String url = "jdbc:mysql://localhost:3306/test0908"; //数据库连接字符串
String user = "root";
String password = "root";
String driver = "com.mysql.jdbc.Driver";

//1、注册驱动
Class.forName(driver);
//2、获取数据库连接
Connection conn =  DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = null;

if(flagGeneraterKey){
//3.1 预编译sql语句  PreparedStatement.RETURN_GENERATED_KEYS 会获取主键的值
pstmt =  conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
} else {
pstmt =  conn.prepareStatement(sql);
}


for(int i = 0; i < params.size(); i ++){
pstmt.setObject(i+1, params.get(i));
}



//3.2执行sql语句
pstmt.executeUpdate();

if(flagGeneraterKey){
//获取主键的值
ResultSet rs =  pstmt.getGeneratedKeys();//获取主键的集合
while(rs.next()){
//获取集合的的元素
key = rs.getInt(1);//1表示第一列
System.out.println("生成的主键的值:" + key);
}
rs.close();
}


//4 资源关闭
conn.close();
pstmt.close();
return key;
}

}

测试


public class Test {

public static void main(String[] args) throws Exception {
Student stu = new Student();
stu.setStuName("itJOB");
stu.setStuNo("深圳远标培训中心");

BaseDao<Student> bd = new BaseDao<Student>();
bd.save(stu, Student.class);

System.out.println("=========" +   stu.getStuId());
}
}

热心网友 时间:2022-04-07 20:30

肯定可以的,相信你能写出来
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
vivo y3t手机能拨打和接听电话,不能收发短信 vivoy3t手机突然接收不到短信 vivoy3短信消息怎么提醒 无奈什么意思是什么 怎样让炒出的丝瓜不发黑? 钟表是以什么计量时间 钟表以( )、()、( )计量时间。 钟表以( )、()、( )单位计量时间 紫荆花开放时间 《青春 须臾成殇》渭伊的txt全集下载地址 谁有好看的武侠小说 《七夜雪》 初衷 生于七月的植物有哪些?谢谢... 此段JDBC连接程序不能插入NULL。高手看看帮忙解决一下 奥克斯热水器使用方法? 十二生肖皇宫所属哪个肖 十二生肖中皇宫里生肖是什么 海底龙宫戏珍形容什么生肖 马儿飞奔闯六关,龙在龙宫多自在。猜生肖 龙到天宫告猴王 猜一生肖 深往海底龙宫里是什么生肖?怎么解释? 求解释《水中陆地都适应,东海龙宫借神针》打一生肖 中国平安和中国平安人寿是什么关系 水中陆地都适应,东海龙宫借神针。解一生肖。 平安保险主要有什么区别 搜遍龙宫都是宝猜一生肖 中国人寿保险与平安保险的区别?? 龙在龙宫多自在打一生肖 中国人寿保险与中国平安保险的区别?那种更值得信任。 莲花身富贵命住龙宫猜生肖 惊蛰 吃什么 驾驶员考试科目三出现人工评判是怎么回事? 2017年科目三考试的评判标准有哪些 驾照科目三考试有什么新规定 劳动仲裁开庭费用大概多少 劳动仲裁开庭要多少钱,劳动仲裁开庭费用 劳动仲裁开庭需要钱吗 请律师代理出庭仲裁要多少费用?? 劳动仲裁开庭后要不要收费? 劳动仲裁开庭后是自己辩论,还是*派人给双方辩论,劳动仲裁开庭的费用怎么收取? 申请劳动仲裁开庭需要交钱吗? 为什么我家的电脑的音箱一个会响一个不会响? 申请劳动仲裁要开庭吗 劳动局开庭要收费吗? 劳动仲裁开庭吗 电脑音箱为什么两个喇叭只有一个响 电脑音箱只有一个响怎么办? 母亲的感恩用蒙语写作文 孝敬父母的蒙文作文 我的母亲蒙语作文