如何写一个dao类方法来实现java对mysql数据库的增删改查?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何写一个dao类方法来实现java对mysql数据库的增删改查?相关的知识,希望对你有一定的参考价值。
package basic;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC
public void findAll()
try
// 获得数据库驱动
//由于长时间不写,驱动名和URL都忘记了,不知道对不对,你应该知道的,自己改一下的哈
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
Class.forName("oracle.jdbc.driver.OracleDriver");
// 创建连接
Connection conn = DriverManager.getConnection(url, userName,
password);
// 新建发送sql语句的对象
Statement st = conn.createStatement();
// 执行sql
String sql = "select * from users";
ResultSet rs = st.executeQuery(sql);
// 处理结果
while(rs.next())
//这个地方就是给你的封装类属性赋值
System.out.println("UserName:"+rs.getString(0));
// 关闭连接
rs.close();
st.close();
conn.close();
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
public void delete()
try
//步骤还是那六个步骤,前边的两步是一样的
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url,userName,password);
//这里的发送sql语句的对象是PreparedStatement,成为预处理sql对象,因为按条件删除是需要不定值的
String sql = "delete from users where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(0, 1);
int row = ps.executeUpdate();
if(row!=0)
System.out.println("删除成功!");
// 关闭连接
rs.close();
st.close();
conn.close();
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
我只写了查询和删除,添加、修改和删除非常之像,这是因为查询对数据库没有改动,而增删改都对数据库进行了修改,所以这三个非常像……呵呵,你自己看着办吧 参考技术A import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.bean.NoticeBean;
public class JDBCTest
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try
String driverName="com.mysql.jdbc.Driver";
Class.forName(driverName);
String url="jdbc:mysql://localhost:3306/java?
useUnicode=true&characterEncoding=gb2312";
conn=DriverManager.getConnection(url,"root","root");
System.out.println("连接MySql成功!!!");
stmt=null;
rs=null;
String strSql=null;
NoticeBean bean=null;
String title=null;
String content=null;
try
title="标题";
content="内容";
strSql="INSERT INTO notice(title,content) VALUES(’"+title+"’,’"+content+"’)";
stmt=conn.createStatement();
stmt.executeUpdate(strSql);
System.out.println("插入语句执行成功:"+strSql);
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("插入失败");
strSql="select * from notice";
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery(strSql);
if(rs.next())
int id=rs.getInt("id");
title =rs.getString("title");
content=rs.getString("content");
if(rs.next())
bean=new NoticeBean(id,title,content);
System.out.println("notice第一行数据是"+bean.getId()+" "+bean.getTitle()
+" "+bean.getContent());
try
strSql="delete from notice";
stmt=conn.createStatement();
stmt.executeUpdate(strSql);
System.out.println("删除完成");
catch (RuntimeException e)
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("删除失败");
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
try
if(rs!=null)
rs.close();
rs=null;
if(stmt!=null)
stmt.close();
stmt=null;
if(conn!=null)
conn.close();
conn=null;
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容
3. 基础功能
3.1. 设计BaseDao接口与BaseDaoImpl类
每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。例
实体Dao接口实现类
========================================================
User--> UserDao--> UserDaoImpl
Role--> RoleDao--> RoleDaoImpl
Department--> DepartmentDao--> DepartmentDaoImpl
Article--> ArticleDao--> ArticleDaoImpl
...
设计Dao接口(抽取接口的公共方法)
BaseDao.java----把每个dao都需要的方法放到这里,好让他们继承
public interface BaseDao<T> { void save(T entity); /** * 保存实体 * @param id */ void delete (Long id); /** * 删除实体 * @param entity */ void update(T entity); /** * 更新实体 * @param id * @return */ T getById(Long id); /** * 按id查询 * @return */ List<T> getByIds(Long[] id); /** * 按id查询 * @return */ List<T> findAll(); /** * 查询所有 */ }
UserDao.java----一些公用的方法继承BaseDao即可
public interface UserDao extends BaseDao<User>{ //自己有的特殊方法写在自己这里面 }
RoleDao.java
public interface RoleDao extends BaseDao<Role>{ }
增删改查等共有方法都有了
设计Dao实现类(抽取实现类的公共方法)
//实现RoleDao,实现所有未实现的方法 public class RoleDaoImpl implements RoleDao{ public void save(Role entity) { } public void delete(Long id) { } public void update(Role entity) { } public Role getById(Long id) { return null; } public List<Role> getByIds(Long[] id) { return null; } public List<Role> findAll() { return null; } }
public class UserDaoImpl implements RoleDao{ public void save(Role entity) { } public void delete(Long id) { } public void update(Role entity) { } public Role getById(Long id) { return null; } public List<Role> getByIds(Long[] id) { return null; } public List<Role> findAll() { return null; } }
public class BaseDaoImpl<T> implements BaseDao<T> { public void save(T entity) { } public void delete(Long id) { } public void update(T entity) { } public T getById(Long id) { return null; } public List<T> getByIds(Long[] id) { return null; } public List<T> findAll() { return null; } }
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{ }
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{ }
可以看出这两个实现类的很多方法都重复了,我们把它抽取出来,我们写一个类它事先实现了里面的公共方法,让这两个实现类继承即可。
BaseDaoImpl里方法是有了,但里面还没有内容,接下来写该实现类里面的方法内容
@SuppressWarnings("unchecked") public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory;// 通过注入得到SessionFactory,要把它放到容器里才能注入,在具体的实现类上声明@Repository private Class<T> clazz; public BaseDaoImpl() { //使用反射技术得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new类型的泛型的父类类型 this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型,只有一个泛型参数,所以写0 System.out.println("clazz--->" + clazz); } /** * 获取当前可用的session对象,用protected修饰方便子类得到session */ protected Session getSession() { return sessionFactory.getCurrentSession(); } public void save(T entity) { // 不需要自己关事务了,spring框架已经帮我们做了,我们用它的事务管理 getSession().save(entity); } public void update(T entity) { getSession().update(entity); } public void delete(Long id) { Object obj = getById(id); if (obj != null) { getSession().delete(obj); } } public T getById(Long id) { return (T) getSession().get(clazz, id); } public List<T> getByIds(Long[] ids) { return getSession().createQuery(// "FROM User WHERE id=IN(:ids)")// .setParameter("", ids) .list(); } public List<T> findAll() { return getSession().createQuery(// "FROM " + clazz.getSimpleName())// .list(); } }
说明:
4, 实体的Dao接口要继承BaseDao接口。
5, Dao的实现类要继承DaoImplBase类。
6, 也可以不继承指定的接口或类,这样就要自己写相应的方法。
7, T getById(Long id)与List<T> getByIdList(Long[] idList)不要合并为List getById(Long... ids),因为获取一个对象时也是返回List,不方便。
获取 BaseDao的类型参数T的Class
问题:
1, 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?
答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。
2, UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?
答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。
使用反射获取类型参数的真实类型的代码如下:
public DaoBaseImpl () { Type type = this.getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) type; this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; } |
说明:
1, 使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。
2, 暂时不实现getSession()方法,在后面的事务管理中实现:
protected Session getSession(){
throw new UnsupportedOperationException();
}
以上是关于如何写一个dao类方法来实现java对mysql数据库的增删改查?的主要内容,如果未能解决你的问题,请参考以下文章
ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容
java-mybaits-00202-DAO-原始DAO开发方法
java web项目中dao的接口,实现类和service接口,实现类区别