Java---JDBC数据库连接

如何建表

首先,我们要想连接到数据库我们已经创建好的表中。比如我们创建了一个表,那么为了获取表中的信息,就得写一个PO类与之对应(当然这个有点鸡肋,但是后面可以对这一方面做更改,更自由)。讲到这就牵扯到如何建表和创建PO类了,我们要遵循两个原则:
1.类名即表明,2.属性名即为字段名。要与之一一对应。

如何获取连接:

连接数据库的步骤为以下几步:
1.加载驱动
2.Connection conn=DriverManage getConnection …
在客户端与数据库建立TCP连接。
3.statement:a.executeUpdate b.executeQuery

在这里插入图片描述在这里插入图片描述
介绍一下PreparedStatement接口:
在这里插入图片描述具体实现看下面代码:

public class DBConnection {
	
	private String user="root";//用户名
    private String pwd="";//密码
	private String url="这里面写你所建数据库的url";
    private Connection conn=null;
    
    static {
    	try {
    		Class.forName("com.mysql.jdbc.Driver");//加载驱动 在静态代码块中
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    }
    
    public DBConnection()
    {
    	try {
			this.conn=DriverManager.getConnection(url, user, pwd);//建立数据库连接
		} catch (SQLException e) {
			e.printStackTrace();
		}
    }
    

建立好数据库连接之后,对数据库操作大致为增删改查。
增删改API: public int executeUpdate(String sql,Object[] params){}

    public int executeUpdate(String sql,Object[] params)
    {
    	 PreparedStatement stmt=null;
    	 try {
    		 stmt=conn.prepareStatement(sql);
    		 if(params!=null)
    		 {
    			 for(int i=0;i<params.length;i++)
    			 {
    				 stmt.setObject(i+1, params[i]);
    			 }
    		 }
    			 return stmt.executeUpdate();
    		 
    	 }catch(Exception e)
    	 {
    		 e.printStackTrace();
    	 }finally
    	 {
    		 
				try {
					if(stmt!=null) stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
    	 }
    	 return 0;
    	 
    }

查API: public ArrayList executeQuery1(String sql,Object[] params,Object obj){}

 public ArrayList<Object> executeQuery1(String sql,Object[] params,Object obj)
    {
    	PreparedStatement stmt=null;
    	ResultSet rs=null;
    	ArrayList<Object> list=new ArrayList<Object>();
    	try {
    		stmt=conn.prepareStatement(sql);
    		 if(params!=null)
    		 {
    			 for(int i=0;i<params.length;i++)
    			 {
    				 stmt.setObject(i+1, params[i]);
    			 }
    		 }
    		rs=stmt.executeQuery();
    		int clos=rs.getMetaData().getColumnCount();
    		while(rs.next())
    		{
    			 Object t=ORMUtil.toObject(rs,obj.getClass());            
  			     list.add(t);
    		}
    	
    }catch(Exception e)
    	{
    	e.printStackTrace();
    	}finally {
    		try {
    			if(stmt!=null) stmt.close();
				if(rs!=null)  rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
    	}
    	 return list;
    }

下面引入一个技术叫做ORMapping.

我们所做的JDBC 是在持久层中。持久层上面是业务层(面向对象),那么就是说,用户可以在业务层只需要传入一个对象给持久层,持久层就可以把这个对象转成insert语句传给RDB(关系型数据库)。
相反在查询结果的时候,我们从RDB传给持久层一个ResultSet 结果。然后通过持久层转换成一个对象传给业务层供用户使用。
在这里插入图片描述下面提供代码:

public static String  toInsert(Object obj)
	{
		Class clz=obj.getClass();
		StringBuffer str=new StringBuffer("Insert into ");
		String tableName=clz.getSimpleName();
		str.append(tableName).append("(");
		Field field[]=clz.getDeclaredFields();
		for(int i=0;i<field.length;i++)
		{
			str.append(field[i].getName()).append(",");
		}
		int index=str.lastIndexOf(",");
		str.replace(index, index+1, ")values('");
		try {
			for(int i=0;i<field.length;i++)
			{
				field[i].setAccessible(true);
				str.append(field[i].get(obj)).append("','");
			}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		int index1=str.lastIndexOf(",");
		str.replace(index1, index1+2, ")");
		return str.toString();		
	}
	public static Object toObject(ResultSet rs,Class clz)
	{
		Object obj=null;
		try {
			obj=clz.newInstance();
			int cols=rs.getMetaData().getColumnCount();
			for(int i=0;i<cols;i++)
			{
				String fieldName=rs.getMetaData().getColumnName(i+1);
				Object value=rs.getObject(i+1);
				if(value==null) continue;
				Field field=clz.getDeclaredField(fieldName);
				field.setAccessible(true);
				if(field==null) continue;
				 String vs=value.toString();
				   if(field.getType()==Integer.class||field.getType()==Integer.TYPE)
					   field.set(obj,Integer.parseInt(vs));
				   else if(field.getType()==Double.class||field.getType()==Double.TYPE)
					   field.set(obj,Double.parseDouble(vs));
				   else if(field.getType()==Float.class||field.getType()==Float.TYPE)
					   field.set(obj,Float.parseFloat(vs));
				   else if(field.getType()==Boolean.class||field.getType()==Boolean.TYPE)
					   field.set(obj,Boolean.parseBoolean(vs));
				   else
				     field.set(obj, value);
			   }  
				  }catch(Exception e)
				 {
					e.printStackTrace();
				 }
				  return obj;
			}		

最后,这是比较基础的写法。也是很鸡肋的,后续还会进行改善。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值