2025年Spring之ORM

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

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

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

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

ORM的方法论基于三个核心原则:
· 简单:以最基本的形式建模数据。
· 传达性:数据库结构被任何人都能理解的语言文档化。
· 精确性:基于数据模型创建正确标准化了的结构。
代码展示:
目录结构:

pom.xml


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">
4.0.0

groupId
Demo01
1.0-SNAPSHOT



junit
junit
4.12



org.springframework
spring-context
5.1.7.RELEASE


org.springframework
spring-test
5.1.7.RELEASE


org.aspectj
aspectjweaver
1.9.2


com.mchange
c3p0

0.9.5.2

/dependency>

br />

dependency>


org.springframework

spring-orm

/artifactId>

br />

version>5.1.7.RELEASE

/version>

br />

br />

groupId>mysql

/groupId>

br /> mysql-connector-java

br />

br />

!--1.数据源-->






























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 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 list = this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper(User.class), id);
return list.size() > 0 ? list.get(0) : null;
}

public List findAll() {

String sql = "SELECT * FROM t_user";
return this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper(User.class));
}
//手动映射
public User findUserById2(Integer id) {

String sql = "SELECT * FROM t_user WHERE id=?";
return this.getJdbcTemplate().query(sql, new ResultSetExtractor() {

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


}
编程小号
上一篇 2025-07-02 13:40
下一篇 2025-03-04 11:51

相关推荐

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