JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)

简介: JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)

JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中):https://developer.aliyun.com/article/1419275


BaseDaoImpl接口实现类

/**
* 通用接口实现类
*/
public class BaseDaoImpl implements BaseDao
{
    /**
     * 通用的DML操作方法
     */
    @Override
    public int executeUpdate(String sql, Object[] param) {
        Connection conn = null;
        PreparedStatement ps = null;
        int row;
        try{
            conn = JdbcDruidUtil.getConnection();
            ps = conn.prepareStatement(sql);
            //得到参数的个数
            ParameterMetaData pd = ps.getParameterMetaData();
            for(int i =0;i<pd.getParameterCount();i++){
                ps.setObject(i+1,param[i]);
           }
               row = ps.executeUpdate();
       }catch (Exception e){
            e.printStackTrace();
            //通过自定义异常解决异常耦合问题
            throw new ApplicationException(e.getMessage());
       }finally{
          JdbcDruidUtil.closeResource(ps,conn);
       }
        return row;
   }
    /**
     * 通用查询方法
     */
    @Override
    public <T> List<T> select(String sql, Object[] param, Class<T> clazz) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<T> list = new ArrayList<>();
        try{
            conn = JdbcDruidUtil.getConnection();
            ps = conn.prepareStatement(sql);
            //得到参数的个数
            ParameterMetaData pd = ps.getParameterMetaData();
            for(int i =0;i<pd.getParameterCount();i++){
                 ps.setObject(i+1,param[i]);
           }
            rs = ps.executeQuery();
            //获取结果集信息
            ResultSetMetaData rm = rs.getMetaData();
            while(rs.next()){
                //OMR映射
                //通过反射实例化实体类对象
              T bean = clazz.newInstance();
              //实体类的属性名必须要和表的列名相同。
                for(int i=0;i<rm.getColumnCount();i++){
                    //得到列名
                    String columnName = rm.getColumnName(i+1);
                    //获取列的值
                    Object value = rs.getObject(columnName);
                    //通过BeanUtil工具类讲值映射到对象中
                  BeanUtils.setProperty(bean,columnName,value);
               }
                list.add(bean);
           }
       }catch (Exception e){
            e.printStackTrace();
            //通过自定义异常解决异常耦合问题 
            throw new ApplicationException(e.getMessage());
       }finally{
          JdbcDruidUtil.closeResource(rs,ps,conn);
       }
        return list;
   }
}


UsersDao接口

public interface UsersDao extends BaseDao {
    /**
     * 根据用户ID查询用户
     *
     */
    Users selectUsersById(int userid);
    /**
     * 修改用户信息
     */
    int updateUsersById(Users users);
    /**
     * 根据用户姓名模糊查询
     */
    List<Users> selectUsersByLikeName(String username);
}


UsersDaoImpl接口实现类

public class UsersDaoImpl extends
BaseDaoImpl implements UsersDao {
    /**
     * 根据用户ID查询用户
     * @param userid
     * @return
     */
    @Override
    public Users selectUsersById(int userid){
        Connection conn =null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Users users = null;
        try{
            conn = JdbcDruidUtil.getConnection();
            ps = conn.prepareStatement("select * from users where userid = ?");
            ps.setInt(1,userid);
            rs = ps.executeQuery();
            while(rs.next()){
                //手动orm映射
                users = new Users();
              users.setUserid(rs.getInt("userid"));
              users.setUsername(rs.getString("username"));
              users.setUserage(rs.getInt("userage"));
           }
       }catch(Exception e){
            e.printStackTrace();
            //通过自定义异常解决异常耦合问题
            throw new ApplicationException(e.getMessage());
       }finally{
          JdbcDruidUtil.closeResource(rs,ps,conn);
       }
        return users;
   }
    /**
     * 修改用户信息
     */
    @Override
    public int updateUsersById(Users users){
        String sql = "update users set userage = ? where userid = ? ";
        Object[] param = new Object[] {users.getUserage(),users.getUserid()};
        return this.executeUpdate(sql,param);
   }
    @Override
    public List<Users> selectUsersByLikeName(String username) {
        String sql = "select * from users where username like ?";
        Object[] param = new Object[] {"%"+username+"%"};
        return this.select(sql,param,Users.class);
   }
}


对象的关联关系


关联关系简介


关联关系(Association),是一种拥有的关系,它使一个对象知道另 一个对象的属性和方法。关联可以是双向的,也可以是单向的。在 Java语言中,关联关系一般使用成员变量来实现。


对象的关联关系解决了什么问题


在多表查询时,使用对象关联关系能够更合理的存放查询到的结果集数据。


关联关系的方向性


单向 只在一侧关联了对方。

双向 两侧相互关联了对方。


创建对象的关联关系


创建表


orders表

CREATE TABLE `orders` (
  `orderid` int(11) NOT NULL AUTO_INCREMENT,
  `orderprice` float(11,2) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`orderid`),
  KEY `orders_fk` (`user_id`),
  CONSTRAINT `orders_fk` FOREIGN KEY
(`user_id`) REFERENCES `users` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


items表

CREATE TABLE `items` (
  `itemid` int(11) NOT NULL,
  `itemname` varchar(30) DEFAULT NULL,
  `itemprice` float(11,2) DEFAULT NULL,
  `itemnum` int(11) DEFAULT NULL,
  PRIMARY KEY (`itemid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


orders_itmes表

CREATE TABLE `orders_items` (
  `order_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  PRIMARY KEY (`order_id`,`item_id`),
  KEY `orders_items_fk2` (`item_id`),
  CONSTRAINT `orders_items_fk` FOREIGN KEY
(`order_id`) REFERENCES `orders` (`orderid`),
  CONSTRAINT `orders_items_fk2` FOREIGN KEY
(`item_id`) REFERENCES `items` (`itemid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


对象的关联关系


Users对象


public class Users {
    private int userid;
    private String username;
    private int userage;
    //创建与Orders的关联关系
    private List<Orders> orders = new ArrayList<>();
    public List<Orders> getOrders() {
        return orders;
   }
    public void setOrders(List<Orders> orders) {
        this.orders = orders;
   }
  @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username +'\'' +
                ", userage=" + userage +
                '}';
   }
    public int getUserid() {
        return userid;
   }
    public void setUserid(int userid) {
        this.userid = userid;
   }
    public String getUsername() {
        return username;
   }
    public void setUsername(String username)
   {
        this.username = username;
   }
    public int getUserage() {
        return userage;
   }
   public void setUserage(int userage) {
        this.userage = userage;
   }
}


Orders对象


public class Orders {
    private int orderid;
    private double orderprice;
    //关联Users
    private Users users;
    //关联Items
    private List<Items> items =new ArrayList<>();
    public int getOrderid() {
        return orderid;
   }
    public void setOrderid(int orderid) {
        this.orderid = orderid;
   }
    public double getOrderprice() {
        return orderprice;
   }
    public void setOrderprice(double orderprice) {
        this.orderprice = orderprice;
 }
    public Users getUsers() {
        return users;
   }
    public void setUsers(Users users) {
        this.users = users;
   }
    public List<Items> getItems() {
        return items;
   }
    public void setItems(List<Items> items)
   {
        this.items = items;
   }
}


Items对象


public class Items {
    private int itemid;
    private String itemname;
    private double itemprice;
    private int itemnum;
    //关联Orders
    private List<Orders> orders = new ArrayList<>();
    public int getItemid() {
        return itemid;
   }
    public void setItemid(int itemid) {
        this.itemid = itemid;
   }
    public String getItemname() {
        return itemname;
   }
    public void setItemname(String itemname)
   {
        this.itemname = itemname;
   }
    public double getItemprice() {
        return itemprice;
   }
    public void setItemprice(double itemprice) {
        this.itemprice = itemprice;
   }
    public int getItemnum() {
        return itemnum;
   }
    public void setItemnum(int itemnum) {
        this.itemnum = itemnum;
   }
    public List<Orders> getOrders() {
        return orders;
   }
    public void setOrders(List<Orders> orders) {
        this.orders = orders;
   }
}


使用对象关联关系存放查询数据


需求:查询用户ID为1的用户信息他的订单信息,以及订单中所包含 的商品信息。


SQL语句

select * from users u,orders o, orders_items oi, items i WHERE u.userid = o.user_id and o.orderid = oi.order_id and oi.item_id = i.itemid and u.userid =1


UserDao接口

    /**
     * 查询用户ID为1的用户信息他的订单信息,
     * 以及订单中所包含的商品信息。
     */
    Users selectUsers(int userid);


UsersDaoImpl接口实现类

/**
     * 查询用户ID为1的用户信息他的订单信息,
     * 以及订单中所包含的商品信息。
     */
    @Override
    public Users selectUsers(int userid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Users users =new Users();
        try{
            conn = JdbcDruidUtil.getConnection();
            ps = conn.prepareStatement("select * from users u,orders o, orders_items oi, items i WHERE\n" + "u.userid = o.user_id and o.orderid = oi.order_id and oi.item_id = i.itemid \n" + "and u.userid =?");
            ps.setInt(1,userid);
            rs = ps.executeQuery();
        while(rs.next()){
                //Users对象的ORM映射
              users.setUserid(rs.getInt("userid"));
              users.setUsername(rs.getString("username"));
              users.setUserage(rs.getInt("userage"));
                //Orders对象的ORM映射
                Orders orders = new Orders();
                orders.setOrderid(rs.getInt("orderid"));
                orders.setOrderprice(rs.getDouble("orderprice"));
                users.getOrders().add(orders);
                //Items对象的ORM映射
                Items items = new Items();
                items.setItemid(rs.getInt("itemid"));
                items.setItemname(rs.getString("itemname"));
                items.setItemprice(rs.getDouble("itemprice"));
                items.setItemnum(rs.getInt("itemnum"));
                orders.getItems().add(items);
           }
       }catch (Exception e){
            e.printStackTrace();
            //通过自定义异常解决异常耦合问题
            throw new ApplicationException(e.getMessage());
       }finally{
           JdbcDruidUtil.closeResource(rs,ps,conn);
       }
        return users;
   }


UsersService接口

Users findUsers(int userid);


UsersService接口实现类

@Override
    public Users findUsers(int userid) {
        UsersDao ud = new UsersDaoImpl();
        return ud.selectUsers(userid);
   }


目录
相关文章
|
1月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
219 2
|
1月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
2月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
184 1
|
2月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
262 8
|
2月前
|
存储 弹性计算 安全
现有数据库系统中应用加密技术的不同之处
本文介绍了数据库加密技术的种类及其在不同应用场景下的安全防护能力,包括云盘加密、透明数据加密(TDE)和选择列加密。分析了数据库面临的安全威胁,如管理员攻击、网络监听、绕过数据库访问等,并通过能力矩阵对比了各类加密技术的安全防护范围、加密粒度、业务影响及性能损耗。帮助用户根据安全需求、业务改造成本和性能要求,选择合适的加密方案,保障数据存储与传输安全。
存储 人工智能 机器人
104 0
|
2月前
|
SQL 数据管理 BI
数据库操作三基石:DDL、DML、DQL 技术入门指南
本文围绕数据库操作核心语言 DDL、DML、DQL 展开入门讲解。DDL 作为 “结构建筑师”,通过CREATE(建库 / 表)、ALTER(修改表)、DROP(删除)等命令定义数据库结构;DML 作为 “数据管理员”,以INSERT(插入)、UPDATE(更新)、DELETE(删除)操作数据表记录,需搭配WHERE条件避免误操作;DQL 作为 “数据检索师”,通过SELECT结合WHERE、ORDER BY、LIMIT等子句实现数据查询与统计。三者相辅相成,是数据库操作的基础,使用时需注意 DDL 的不可撤销性、DML 的条件约束及 DQL 的效率优化,为数据库学习与实践奠定基础。
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
2519 1
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
323 0
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
196 0

热门文章

最新文章