如何写一个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接口,实现类区别

java web项目中dao的接口,实现类和service接口,实现类区别

Java框架之spring—jdbcTemplate

java的mvc模式中bean.dao.service三层中都放啥东西啊?能具体说说吗?