Spring之ORM

Spring之ORMSpring之ORM

大家好,又见面了,我是你们的朋友全栈君。

ORM: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。

  • 这种方案存在以下不足:
    1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
    2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。

ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,ibatis,speedframework。

  • ORM的方法论基于三个核心原则:
      · 简单:以最基本的形式建模数据。
      · 传达性:数据库结构被任何人都能理解的语言文档化。
      · 精确性:基于数据模型创建正确标准化了的结构。
    代码展示:
    目录结构:
    在这里插入图片描述pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>Demo01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

    </dependencies>

</project>

User.java

package com.xbj.po;

public class User { 
   
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    //get set toString
    }

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--导入配置文件-->
    <context:property-placeholder location="classpath:db.properties" />

    <!--1.数据源-->
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
     </bean>
    <context:component-scan base-package="com.xbj.dao.impl" />
    <!--1. 配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 映射到上面的事务管理器-->
    <tx:advice transaction-manager="transactionManager" id="transactionInterceptor">
        <tx:attributes>
            <tx:method name="add*" />
            <tx:method name="insert*"/>
            <tx:method name="save*"/>
            <tx:method name="update*"/>
            <tx:method name="change*" />
            <tx:method name="del*"/>
            <tx:method name="remove*"/>
            <tx:method name="drop*"/>
        </tx:attributes>
    </tx:advice>
    <!-- aop切面并配置切入点入进行事物管理 指向上面的映射 -->
    <aop:config>
        <aop:advisor advice-ref="transactionInterceptor" pointcut="execution(* com.xbj.service.impl.*.*(..))" />
    </aop:config>
</beans>

db.properties

jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

UserDAO.java

package com.xbj.dao;
import com.xbj.po.User;
import java.util.List;

public interface UserDAO { 
   
    void addUser(User user);
    void delUser(Integer id);
    void updateUser(User user);
    User findUserById(Integer id);
    List<User> findAll();

    User findUserById2(Integer id);
}

UserDAOImpl.java

package com.xbj.dao.impl;


import com.xbj.dao.UserDAO;
import com.xbj.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository
public class UserDAOImpl extends JdbcDaoSupport implements UserDAO { 
   

    @Resource
   public void init(DataSource dataSource){ 
   
       super.setDataSource(dataSource);
   }

    public void addUser(User user) { 
   
        //String sql, @Nullable Object... args
        String sql = "INSERT INTO t_user VALUES (NULL,?,?,?)";
        this.getJdbcTemplate().update(sql, user.getUsername(), user.getPassword(), user.getAge());
    }

    public void delUser(Integer id) { 
   
        String sql = "DELETE FROM t_user WHERE id=?";
        this.getJdbcTemplate().update(sql, id);
    }

    public void updateUser(User user) { 
   
        String sql = "UPDATE t_user SET username=? ,password=?,age=? WHERE id=?";
        this.getJdbcTemplate().update(sql, user.getUsername(), user.getPassword(), user.getAge(), user.getId());
    }
    //自动映射,但要保证User类中的字段名与数据库的要一致
    public User findUserById(Integer id) { 
   
        String sql = "SELECT * FROM t_user WHERE id=?";
        List<User> list = this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<User>(User.class), id);
        return list.size() > 0 ? list.get(0) : null;
    }

    public List<User> findAll() { 
   
        String sql = "SELECT * FROM t_user";
        return this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<User>(User.class));
    }
    //手动映射
    public User findUserById2(Integer id) { 
   
        String sql = "SELECT * FROM t_user WHERE id=?";
        return  this.getJdbcTemplate().query(sql, new ResultSetExtractor<User>() { 
   
            public User extractData(ResultSet rs) throws SQLException, DataAccessException { 
   
                User user=new User();
                if(rs.next()){ 
   
                    user.setId(rs.getInt("id"));
                    user.setUsername(rs.getString("username"));
                    user.setPassword(rs.getString("pwd"));
                    user.setAge(rs.getInt("age"));
                }
                return user;
            }
        }, id);
    }
}

原生测试方法:

package com.xbj;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test01 { 
   

    @Test
    public void t1() throws Exception { 
   
        Class.forName("com.mysql.jdbc.Driver");
        //DriverManager JDBC大管家
        Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
        PreparedStatement psmt=connection.prepareStatement("SELECT * from t_user WHERE age > ?");
        psmt.setInt(1,33);
        ResultSet rs=psmt.executeQuery();
        while (rs.next()){ 
   
          Integer id=  rs.getInt("id");
          String username=rs.getString("username");
          System.out.println(id+"--"+username);
        }
    }
}

Spring测试方法;

package com.xbj;


import com.xbj.dao.UserDAO;
import com.xbj.po.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 
   "classpath:applicationContext.xml"})
public class Test02 { 
   
    @Autowired
    private UserDAO userDAO;
    @Test
    public void t1(){ 
   
        List<User> users=userDAO.findAll();
        for (User user:users){ 
   
            System.out.println(user);
        }
    }
    @Test
    public void t2(){ 
   
        User user=userDAO.findUserById(8);
        System.out.println(user);
    }
    @Test
    public void t3(){ 
   
        User user=new User();
        user.setUsername("hanmeimei");
        user.setPassword("ok");
        user.setAge(16);
        userDAO.addUser(user);
    }
    @Test
    public void t4(){ 
   
        User user=userDAO.findUserById(5);
        user.setUsername("HMM");
        userDAO.updateUser(user);
    }
    @Test
    public void t5(){ 
   
        userDAO.delUser(5);
    }

    @Test
    public void t6(){ 
   
       User user= userDAO.findUserById2(2);
       System.out.println(user);
    }


}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106634.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 在pycharm中配置anaconda环境_anaconda pycharm环境配置

    在pycharm中配置anaconda环境_anaconda pycharm环境配置在pycharm中如果出现了nopythoninterpreterconfiguredfortheproject表示你没有给这个工程提供一个解释器如果已经安装pychrm在后期怎么配置解释器呢:![在这里插入图片描述](https://img-blog.csdnimg.cn/20210713171532445.png)file中选择setting然后点击右边的设置,Add进行配置,还是进入systeminterpreter,需要注意的是在Pycharm中选择错了anaconda.

  • LoadRunner11下载以及详细激活成功教程说明

    LoadRunner11下载以及详细激活成功教程说明http://blog.csdn.net/oyzl68/article/details/9973143前期准备:LoadRunner11下载请猛戳这里 传送门LoadRunner激活成功教程文件下载请猛戳这里 传送门LoadRunner注册表清理工具下载请猛戳这里 传送门LoadRunner11激活成功教程方法:一、覆盖激活成功教程文件首先请下载LoadRunner激活成功教程文件,

  • nginx启动、重启、关闭

    方式一:传统方法一、启动  cdusr/local/nginx/sbin./nginx二、重启  更改配置重启nginx  kill-HUP主进程号或进程号文件路径或者使用cd/usr/local/nginx/sbin./nginx-sreload  判断配置文件是否正确 nginx-t-c/usr/local/nginx/conf/nginx.conf或者cd…

  • contemptible_bank conflict

    contemptible_bank conflict本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可。本作品(李兆龙博文,由李兆龙创作),由李兆龙确认,转载请注明版权。

  • Makefile常用模板「建议收藏」

    Makefile常用模板「建议收藏」做开发的特别是C/C++开发者一般都会用到Makefile,然而多数时候在公司做项目都不需要自己去写Makefile,仅仅停留在能看懂的基础上。因为make命令编译实在是太方便了,所以自己写写小项目用一用还是挺好的。网上关于Makefile教程也很多,总结一下近几年用到的常用脚本,方便自己查阅,如果能帮到别人那便是极好的^_^。单文件项目其实一个文件的项目也没必要写Makefil…

  • idea 在线激活码【中文破解版】

    (idea 在线激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号