基本原理;保存数据时,把需要保存的对象的属性值全部取出来再拼凑sql语句
查询时,将查询到的数据全部包装成一个java对象。
先定规则:
1)数据库的每一个表对象一个实体类,表中的每一个字段对应实体类的中的一个属性。并且实体类的名字和表的名字相同,属性名和字段名相同,大小写没有关系,因为数据库一般不区分大小写。
3、编写连接数据库的工厂类
4、编写操作数据库的Dao类
5、编写测试类进行测试
打印结果:
查询时,将查询到的数据全部包装成一个java对象。
先定规则:
1)数据库的每一个表对象一个实体类,表中的每一个字段对应实体类的中的一个属性。并且实体类的名字和表的名字相同,属性名和字段名相同,大小写没有关系,因为数据库一般不区分大小写。
2)为实体类中的每一个属性添加标准的set和get方法。
1、首先数据库得有一个表,表名为User。如图:
2、创建一个实体类
/*
* 实体类信息
* */
public class User {
private int id;
private String name;
private String password;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3、编写连接数据库的工厂类
import java.sql.Connection;
import java.sql.DriverManager;
/*
* 连接数据库
* */
public class Connect2DBFactory {
public static Connection getDBConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/ssh";
String user = "root";
String password = "tiger";
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
4、编写操作数据库的Dao类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import com.zl.entity.User;
import com.zl.utils.Connect2DBFactory;
/*
* 通过反射拼接得到sql语句
* */
public class PersonDao {
// 得到保存对象的sql
public static String getsaveObjectSql(Object object) {
// 定义一个sql字符串
String sql = "insert into ";
// 得到对象的类
Class c = object.getClass();
// 得到对象中所有的方法,包括继承父类的方法
Method[] methods = c.getMethods();
// 得到对象中所有的属性
Field[] fields = c.getFields();
// 得到对象类的名字
String cName = c.getName();
// 从类的名字中解析出表名,左包含右不包含
String tableName = cName.substring(cName.lastIndexOf(".") + 1, cName.length());
// 拼接sql语句
sql = sql + tableName + "(";
List<String> filedlist = new ArrayList<String>();
List valueList = new ArrayList();
for (Method method : methods) {
String methodName = method.getName();
if (methodName.startsWith("get") && !methodName.startsWith("getClass")) {
String fieldname = methodName.substring(3, methodName.length());
filedlist.add(fieldname);
System.out.println("字段名字----->" + fieldname);
try {
Object value = method.invoke(object, null);
System.out.println("执行方法返回的值:" + value);
if(value instanceof String){
valueList.add("\""+value+"\"");
System.out.println("字段值------>" + value);
}else{
valueList.add(value);
System.out.println("字段值------>" + value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
for (int i = 0; i < filedlist.size(); i++) {
if (i < filedlist.size() - 1) {
sql = sql + filedlist.get(i) + ",";
}
if (i == filedlist.size() - 1) {
sql = sql + filedlist.get(i) + ")" + " values" + "(";
}
}
for (int i = 0; i < valueList.size(); i++) {
if (i < valueList.size() - 1) {
sql = sql + valueList.get(i) + ",";
}
if (i == valueList.size() - 1) {
sql = sql + valueList.get(i) + ")";
}
}
return sql;
}
// 增加对象到数据库
public static boolean savePerson(User user) {
Connection con = Connect2DBFactory.getDBConnection();
String sql = getsaveObjectSql(user);
try {
// Statement statement=(Statement) con.createStatement();
PreparedStatement psmt = con.prepareStatement(sql);
psmt.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 从数据库查询数据
public static String getQuerysql(Object object, String where, Object[] conditions) {
Connection conn = Connect2DBFactory.getDBConnection();
String fullclassname = object.getClass().getName();
String className = fullclassname.substring(fullclassname.lastIndexOf(".") + 1, fullclassname.length());
String sql = null;
PreparedStatement ps;
// 后面可以拼接where 1=1
if (where == null) {
sql = "select * from " + className + " where 1=1";
return sql;
} else {
sql = "select * from " + className + " where 1=1 and " + where;
String selectSql = sql + " Array:";
try {
ps = conn.prepareStatement(sql);
// sql语句中的填充占位符
if (conditions.length == 0) {
return sql;
}
for (int i = 0; i < conditions.length; i++) {
// if(){} int,string,date
if (conditions[i] instanceof Integer) {
ps.setInt(i + 1, (int) conditions[i]);
// selectSql = selectSql + " :" +
// conditions[i].toString();
// System.out.println();
// while (set.next()) {
// System.out.println(set.getString("name").toString());
// }
}
if (conditions[i] instanceof String) {
ps.setString(i + 1, (String) conditions[i]);
}
if (conditions[i] instanceof Date) {
ps.setTimestamp(i + 1, (Timestamp) conditions[i]);
}
// ps.setInt(i, conditions[i]);
}
ResultSet set = ps.executeQuery();
String array = null;
for (Object o : conditions) {
if (o == conditions[0]) {
array = o.toString();
} else {
array = array + "," + o.toString();
}
}
System.out.println(selectSql + "[" + array + "]");
} catch (SQLException e) {
e.printStackTrace();
}
return sql;
}
}
public static List<User> queryPerson(User user) {
String sql = PersonDao.getQuerysql(user, null, null);
Connection conn = Connect2DBFactory.getDBConnection();
PreparedStatement psmt;
ResultSet results;
List<User> users;
try {
psmt = conn.prepareStatement(sql);
results = psmt.executeQuery();
users = new ArrayList<User>();
while (results.next()) {
User u = new User();
int id = Integer.parseInt(results.getString("id"));
String name = results.getString("name");
String password = results.getString("password");
int age = Integer.parseInt(results.getString("age"));
u.setId(id);
u.setName(name);
u.setPassword(password);
u.setAge(age);
users.add(u);
}
return users;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
5、编写测试类进行测试
import java.util.List;
import org.junit.Test;
import com.zl.dao.PersonDao;
import com.zl.entity.User;
/*
* 测试类,测试写好的方法
* */
public class TestPerson {
@Test
public void testsave() {
User user = new User();
user.setAge(20);
user.setId(2);
user.setName("小燕子");
user.setPassword("芝麻开门");
// System.out.println(PersonDao.getsaveObjectSql(user));
PersonDao.savePerson(user);
}
@Test
public void testselect() {
User user = new User();
int id = 2;
String name = "小燕子";
// System.out.println(PersonDao.getQuerysql(user, null, null));
System.out.println(PersonDao.getQuerysql(user, "id=? and name=?", new Object[] { id, name }));
}
@Test
public void testquery() {
User user = new User();
List<User> users = PersonDao.queryPerson(user);
for (User u : users) {
System.out.println(u.getName());
}
System.out.println(PersonDao.queryPerson(user).size());
}
}
打印结果:
testselect():
select * from User where 1=1 and id=? and name=? Array:[2,小燕子]
select * from User where 1=1 and id=? and name=?
testquery():
zl
小燕子
2