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);
    }


}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 蚁剑安装以及使用方法

    蚁剑安装以及使用方法一 蚁剑如何安装蚁剑安装分两个步骤一个是下载源代码 还有一个加载器 用加载器去加载源代码 下载的的文件路径一定要记得蚁剑源码下载 https github com AntSwordProj antSword 蚁剑加载器下载 https github com AntSwordProj AntSword Loader 下载之后解压缩之后是这样的点击 AntSword Loader v4 0 3 win32 x64 这个文件打开 AntSword exe 点击初始化点击初始化点击选

    2025年12月10日
    2
  • 微信 开发诡异的40029错误invalid code错误 443 failed to respond错误的解决办法

    微信 开发诡异的40029错误invalid code错误 443 failed to respond错误的解决办法情景:使用静默授权或感知授权的方式将请求绑定到微信公众号的菜单栏上。链接如下:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 当点击菜单按钮时微信

    2022年6月11日
    47
  • 弗曼学习法,你在用吗?

    弗曼学习法,你在用吗?今天简单的谈论一下弗曼学习法,是被学术界认为最niubi的学习方法。理查德.弗曼(1918-1988)1965年获得诺贝尔物理学奖,美籍犹太人,也是最早提出纳米的人。之所以以他的名字命名改学习方法,想必不用说大家也都知道了,总之很厉害一个人就是了。 弗曼学习法的原理,可以用一句话来概括(透过现象看本质),比方说我们刚学习、接触一个知识点,按照正常的逻辑就是去学会怎么使用它就行了,而带来的弊端就是,当时,亦或者一段时间内我们能记得,但是随着时间加长,没有使用过这个知识点,我们便会很快就忘记了。因为我

    2022年6月13日
    37
  • J2ME 开发工具

    J2ME 开发工具J2ME开发工具1.J2ME高级开发工具高级的MIDP应用程序开发工具能够帮助开发人员简化J2ME开发过程,包括Sun提供的官方开发工具WTK和手机厂商提供的专属SDK.J2MEWi

    2022年7月27日
    10
  • 手机分辨率分类「建议收藏」

    手机分辨率分类「建议收藏」1、VGA(640×480)分辨率,(VideoGraphicsArray)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。主要基于VGA显示卡的计算机、笔记本等设备,而在一些既要求显示彩色高分辨率图像又没有必要使用计算机的设备上,VGA技术的应用却很少见到。2、QVGA即”Quarter

    2022年8月13日
    2
  • html右浮动代码_html+css+js

    html右浮动代码_html+css+js网上一般的网页浮动广告代码都是基于jquery的,受jiquery版本及浏览器限制,非常容易出现不兼容的情况,本站分享一段纯js网页浮动广告代码,简单兼容。html代码:javascript代码:window.onload=function(){varx=50,y=60;varxin=true,yin=true;varstep=1;vardelay=10;varobj=docu…

    2022年9月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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