提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这篇demo是有关于java连接数据库的方式
提示:以下是本篇文章正文内容,下面案例可供参考
一、JDBC是什么?
jdbc是java databases conn;一个Java连接数据库的接口,本文介绍的是java和mysql的jdbc
二、使用步骤
1.下载java-mysql的jar包
下载地址:https://dev.mysql.com/downloads/connector/j/
进入下面的页面选择适合自己的jar下载
2.部署jar包到项目
-
讲下载的jar包放到工程的lib目录下
-
部署jar包为项目依赖(右击lib下的jar包add as library)
.
3.JDBC工具类
示例代码,仅供参考
final static String URL="jdbc:mysql://127.0.0.1:3306/databases";
final static String USER="userName";
final static String PWD="passward";
public static Connection createConn(){
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//连接
return DriverManager.getConnection(URL, USER, PWD);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭资源
* @param conn 链接
* @param stat 陈述
*/
public static void close(Connection conn, Statement stat, ResultSet resultSet){
if(resultSet!=null){
try{
resultSet.close();
}catch (Exception e){
}
}
if(conn!=null){
try {
conn.close();
}catch (Exception e){
}
}
if(stat!=null){
try {
stat.close();
}catch (Exception e){
}
}
}
//注意:每一个sql语句对应他的预处理参数
public static boolean trancPreDML(List<String> sqlList,List<Object>...params){
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.createConn();
//设置事务提交方式为非自动提交
conn.setAutoCommit(false);
//执行语句
for (int j=0;j<sqlList.size();j++) {
ps = conn.prepareStatement(sqlList.get(j));
//如何进行赋值操作,给 ?占位符进行赋值操作
// 个数通过可变参数获取
List<Object> param = params[j];
for (int i = 0;i<param.size();i++){
//在SQL中 ? 从1开始,现在i = 0开始,需要注意
ps.setObject(i+1,param.get(i));
}
// 进行陈述 返回结果集
int result = ps.executeUpdate();
}
conn.commit();
return true;
}catch (Exception e){
try {
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}finally {
close(conn,ps,null);
}
return false;
}
/**
* 完成增,删,改 共同操作
* @param sql 增,删,改 任意sql
* @param params 参数对当前SQL中?赋值操作
* @return 结果集 返回SQL的影响的行数
*/
public static int preDML(String sql,Object... params){
Connection conn = null;
PreparedStatement ps = null;
try {
// conn = DBUtil.getConn();
conn = DBUtil.createConn();
ps = conn.prepareStatement(sql);
//如何进行赋值操作,给 ?占位符进行赋值操作
// 个数通过可变参数获取
for (int i = 0;i<params.length;i++){
//在SQL中 ? 从1开始,现在i = 0开始,需要注意
ps.setObject(i+1,params[i]);
}
// 进行陈述 返回结果集
return ps.executeUpdate();
}catch (Exception e){
}finally {
DBUtil.close(conn,ps,null);
}
return 0;
}
/**
* 对于任意一张表,任意一个SQL查询,都可以进行数据查询 一行数据
* @param clazz 告诉表对应 实体bean,就是指具体类型
* @param sql 操作当前表 查询
* @param params 对当前 占位符赋值操作
* @param <T> 操作完成返回的具体类型
* @return
*/
public static <T> T preQuery(Class<T> clazz,String sql, Object... params ){
//声明三个对象 JDBC
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
// 异常处理
try {
conn = DBUtil.createConn();
ps = conn.prepareStatement(sql);
// 给当前的占位符进行赋值操作
for (int i = 0; i <params.length ; i++) {
ps.setObject(i+1,params[i]);
}
rs = ps.executeQuery();
//通过元数据获取到所有列的数量,获取到当前列名字
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
if(rs.next()){
T t = clazz.newInstance(); // newInstance 这个方法调用无参
for (int i = 0; i <columnCount ; i++) {
// 获取列的名字 rsmd中
String columnName = rsmd.getColumnName(i + 1);
// 获取列的数据 rs中
Object value = rs.getObject(i + 1);
// 可以通过反射,获取到当前属性对象,然后通过回调方式进行赋值操作
Field field = clazz.getDeclaredField(columnName);
// 进行破解当前私有属性
field.setAccessible(true);
// 回调
field.set(t,value);
//关闭权限
field.setAccessible(false);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,rs);
}
return null;
}
/**
*当前这个方法不支持Blob存储,不是万能
* @param clazz 类型
* @param sql sql语句
* @param params 对sql语句??进行赋值操作
* @param <T> 如果list 中size 是 0,当前查询失败,如果1 就查询一条数据,list.get(0) 获取当前数据
* @return
*/
public static <T> List<T> preQueryAll(Class<T> clazz, String sql, Object... params){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<T> list = new ArrayList<>();
try {
conn = DBUtil.createConn();
ps = conn.prepareStatement(sql);
for (int i = 0; i <params.length; i++) {
ps.setObject(i+1,params[i]);
}
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()){
// 获取每一行,行中列不变
T t = clazz.newInstance();
for (int i = 0; i <columnCount ; i++) {
// 列的名字 列的数据
String columnName = rsmd.getColumnLabel(i + 1);
Object value = rs.getObject(i + 1);
// 列的名字和类中属性名字一致,所以可以使用反射
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
//回调
field.set(t,value);
field.setAccessible(false);
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,rs);
}
return list;
}
## 4.测试连接
在单体测试框架中测试
@Test
public void testConn(){
Connection conn = DBUtil.createConn();
System.out.println(conn);
}
如果输出结果不为空则java连接mysql成功
# 总结
注意在连接过程中,数据库的配置,版本都以及jdbc的版本都要兼容,可能导致连接失败