如何建表
首先,我们要想连接到数据库我们已经创建好的表中。比如我们创建了一个表,那么为了获取表中的信息,就得写一个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;
}
最后,这是比较基础的写法。也是很鸡肋的,后续还会进行改善。