方式1、不使用任何框架,直接使用原生的jdbc。 特点:代码较多,灵活性最强。
一般为了复用代码,会写一个DBhelper类来封装数据库的通用操作。
方式2、DAO(Data Access Object)数据存取对象模式。(参考 https://www.runoob.com/note/27029)
https://www.cnblogs.com/Believer/p/5282284.html
package DAO;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import tools.DBHelper;
import tools.DBtools;
import entity.User;
public class UserDAO{
public boolean insert(User u){
String SQL="INSERT INTO user(userID,userName,password)VALUES(?,?,?)";
Object[] params=new Object[]{u.getUserID(),u.getUserName(),u.getPassword()};
int n=DBHelper.ExecSql(SQL,params);
if(n>0) return true;
else return false;
}
public boolean delete(User u){
String sql="delete from user where userID=?";
Object[] obj=new Object[]{u.getUserID()};
int rs=DBHelper.ExecSql(sql,obj);
if(rs==1)
return true;
else
return true;
}
public boolean update(User u){
String sql="update user set username=?,password=? where userID=?";
Object[] obj=new Object[]{u.getUserName(),u.getPassword(),u.getUserID()};
int rs=DBHelper.ExecSql(sql,obj);
if(rs==1)
return true;
else
return false;
}
public static List getAllUser(){
List users=new ArrayList();
String SQL="SELECT * FROM user";
ResultSet rs=DBHelper.getResultSet(SQL);
return DBtools.ResultSettoList(rs, User.class);
}
}
3、使用ORM框架,比如Mybatis。(参考 https://blog.csdn.net/Miner_Jasber_Yon/article/details/45119603?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task)
一般有两种开发模式:
模式1.使用Dao 与 DaoImpl 的方法的MyBatis程序
user_mapper.xml 映射文件
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="findUserByName" parameterType="string"
resultType="cn.jasberyon.mybatis.pojo.User">
SELECT * FROM user_ WHERE username=#{id}
</select>
</mapper>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.jasberyon.mybatis.dao.UserDao;
import cn.jasberyon.mybatis.pojo.User;
public classUserDaoImpl implements UserDao{
private SqlSessionFactory sqlSessionFactory;
publicUserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory= sqlSessionFactory;
}
@Override
public UserfindUserByName(String selectId, String username)throwsException {
// TODO Auto-generated method stub
//从会话工厂得到会话 SqlSession
SqlSessionsession= this.sqlSessionFactory.openSession();
Useruser= session.selectOne(selectId, username);
session.close();
return user;
}
}
模式2.使用动态代理对象的MyBatis的Dao实现
user_mapper.xml 映射文件
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="findUserByName" parameterType="string"
resultType="cn.jasberyon.mybatis.pojo.User">
SELECT * FROM user_ WHERE username=#{id}
</select>
</mapper>
UserMapper.java (相当于UserDao接口)
public interfaceUserMapper {
public UserfindUserByName(String username) throwsException;
public List<User>findUserList() throwsException;
}
使用方法
SqlSessionsqlSession= this.sqlSessionFactory.openSession();
//通过 sqlSession得到UserMapper的代理对象
UserMapperuserMapper= sqlSession.getMapper(UserMapper.class);
//调用UserMapper的查询方法
List<User>list= userMapper.findUserList();
3、Repository VS DAO (参考 https://www.cnblogs.com/xishuai/p/ddd_repository.html)
仓储是DDD(领域驱动设计)中的一个层。
他是站在领域的角度看问题,而DAO是站在数据库的角度看问题。
3.1 仓储的两种设计方式:面向集合和面向持久化
面向集合和面向持久化,这两种类型的仓储设计方式,在《实现领域驱动设计》中有很详细的讲解,作者还附带了几个具体的实现,比如 Hibernate 实现、TopLink 实现等等,这个必须赞一个,感兴趣的朋友,可以进行阅读下。这面我简单说明下,这两种设计方式的不同之处,举个最直白的例子。
面向集合方式:
this.UserRepository.Add(user);
面向持久化方式:
this.UserRepository.Save(user);
可能很多朋友看到这,会不以为然,需要明确一点,在领域驱动设计中,不论是变量或是方法的命名规则都非常重要,因为其代码就是代表着一种通用语言,你要让人家可以看懂。在面向集合方式中,新对象的添加使用的是 Add,而在面向持久化方式中,不论是新对象的添加或是修改,都是使用的 Save,如果是基于 Unit Of Work(工作单元),会有 Commit。