使用公共的增删改查,可以节省时间,也可以减少代码量。
在BaseDao 接口中:
public interface BaseDao {
/**
* 通用的增刪改方法
* @param sql
* @param param
* @return
*/
public int excutesql(String sql,Object[]param);
/**
* 通用的改方法
* @param sql 需要查詢的sql語句
* @param classt 需要返回的字符集
* @param param 參數
* @return
*/
public List excuteQuery(String sql, Class classt,Object...param);
}
在BaseDaoImpl中:
public class BaseDaoImpl implements BaseDao{
/**
* 通用的增删改的方法
*/
public int exetesql(String sql, Object[] param) {
//获取连接
Connection connection = JDBCUtil.connection();
try {
PreparedStatement p = connection.prepareStatement(sql);
//设置参数
for(int i=0;i<param.length;i++){
p.setObject(i+1, param[i]);
}
int i=p.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
/**
* 通用的查询方法
*/
public List excuteQuery(String sql, Class classt, Object... param) {
List list = new ArrayList();
//1.获取链接
Connection connection = JDBCUtil.connection();
try {
//2.批处理
PreparedStatement p = connection.prepareStatement(sql);
//3.设置参数
if(null!=param){
for(int i=0;i<param.length;i++){
p.setObject(i+1, param[i]);
}
}
//4.获取结果集
ResultSet r= p.executeQuery();
//5.获取对象
Object obj;
//6.获取字节码对象里面的属性
Field[] fields = classt.getFields();
//7。得到结果集的字段数,字段名
ResultSetMetaData metaData = r.getMetaData();
// System.out.println("");
//8.循环输出
int columnCount = metaData.getColumnCount();//9.获取列的总数
System.out.println(columnCount);
while(r.next()){
obj = classt.newInstance();
//10.循环列
for(int i=1;i<= columnCount; i++){
//11.获取列
String columnLabel = metaData.getColumnLabel(i);//别名
String columnName = metaData.getColumnName(i);//列名
System.out.println("columnLabel: "+columnLabel);
System.out.println("columnName: "+columnName);
// 12.根据属性名称获取对应的属性
if(null!=columnLabel){
Field df = classt.getDeclaredField(columnName);
if(null!=df){
df.setAccessible(true);//13.将私有的打开
df.set(obj, r.getObject(columnLabel));//14.设值,设列名
}
}
}
//15.添加到list里面
list.add(obj);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return list;
}
在JDBCUtil工具类:
public class JDBCUtil {
static String NAME="root";
static String PASS="root";
static String URL="jdbc:mysql://127.0.0.1:3306/mysql";
static String DRIVER="com.mysql.Driver";
static
{
//1.读取properties文件
InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//2.获取一个properties对象
Properties properties = new Properties();
//3.判断不为空
if(resourceAsStream!=null)
{
try {
properties.load(resourceAsStream);
NAME=properties.getProperty("NAME");
PASS=properties.getProperty("PASS");
URL=properties.getProperty("URL");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static Connection connection()
{
Connection con=null;
try {
Class.forName("DRIVER");
con=DriverManager.getConnection(URL, NAME, PASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
jdbc.properties配置文件:
name=root
pass=root
url=jdbc:mysql://127.0.0.1:3306/mysql
driver=com.mysql.jdbc.Driver
如果我需要查询数据库的 Commodity表时:1.CommodityDao 接口先继承BaseDao类,里面可以什么都不用写
2.在CommodityDaoImpl 实现类中也继承相应的接口public interface CommodityDao extends BaseDao { }
public class CommodityDaoImpl extends BaseDaoImpl implements CommodityDao{
}
3.在service层调用dao层
public interface CommodityService { public List<CommodityEntity> getCommodityList();}public class CommodityServiceImpl implements CommodityService { CommodityDao commodityDao=new CommodityDaoImpl(); public List<CommodityEntity> getCommodityList(){ String sql="select * from CommodityEntity"; List<CommodityEntity> list = commodityDao.excuteselect(sql, CommodityEntity.class, new Object[]{}); return list; }
4.最后直接在action层掉用service层就可以了
// 调用service,调用对应的方法 CommodityService commodityService = new CommodityServiceImpl();