MyBatis的ORM映射

目录

什么是ORM

一,列的别名

二,结果映射

三,总结


什么是ORM

ORM:对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。

2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

MyBatis只能自动维护库表"列名"与"属性名"相同时的对应关系,二者不同时无法自动ORM,如下:

一,列的别名

在SQL中使用 as 为查询字段添加列别名,以匹配属性名:

在RoleDao接口中

java 复制代码
public List<Role> findAll();

在RoleDao.xml文件中

java 复制代码
<select id="findAll" resultType="com.by.pojo.Role" >
        select id, role_name as roleName, role_desc as roleDesc from role
    </select>

在测试类中

java 复制代码
public class MyBatisTset {
        private SqlSession sqlSession;
        private InputStream inputStream;
        @Before
        public void init() throws IOException {
            //加载配置文件
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            //创建SessionFactory
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //使用数据的会话实例
            sqlSession = sessionFactory.openSession();
        }
        @Test
        public void testFindAll(){
            RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
            List<Role> roleList = roleDao.findAll();
            for (Role role : roleList) {
                System.out.println(role);
            }
        }
        @After
        public void close() throws IOException {
            sqlSession.close();
            inputStream.close();
        }
}

输出结果:

如果我们的查询很多,都使用别名的话写起来岂不是很麻烦,有没有别的解决办法呢?

二,结果映射

在RoleDao接口中

java 复制代码
public List<Role> findAll2();

在RoleDao.xml文件中

java 复制代码
<!--
        id:和select查询标签的返回值保持一致
        type: 映射实体的全类名
    -->
    <resultMap id="findAll2ResultMap" type="com.by.pojo.Role">
        <!--
            描述主键字段的映射关系:
                property:实体类的属性
	            column:数据表字段名称
        -->
        <id property="id" column="id" />

        <!--
            描述非主键字段的映射关系:
                property:实体类的属性
	            column:数据表字段名称
        -->
        <result property="roleName" column="role_name" />
        <result property="roleDesc" column="role_desc" />
    </resultMap>
    <select id="findAll2" resultMap="findAll2ResultMap" >
        select * from role
    </select>

在测试类中

java 复制代码
public class MyBatisTset {
        private SqlSession sqlSession;
        private InputStream inputStream;
        @Before
        public void init() throws IOException {
            //加载配置文件
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            //创建SessionFactory
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //使用数据的会话实例
            sqlSession = sessionFactory.openSession();
        }
        @Test
        public void testFindAll(){
            RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
            List<Role> roleList = roleDao.findAll2();
            for (Role role : roleList) {
                System.out.println(role);
            }
        }
        @After
        public void close() throws IOException {
            sqlSession.close();
            inputStream.close();
        }
}

输出结果

三,总结

ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。

ORM技术特点:

1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。

2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

ORM的优缺点

1.ORM的缺点是会牺牲程序的执行效率和会固定思维模式。

2.从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。

相关推荐
jokerest1235 小时前
web——sqliabs靶场——第十三关——报错注入+布尔盲注
mybatis
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
WindFutrue8 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
AiFlutter9 小时前
Java实现简单的搜索引擎
java·搜索引擎·mybatis
天天扭码12 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
武子康1 天前
Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段
java·sql·设计模式·架构·mybatis·代理模式
2的n次方_1 天前
MyBatis——#{} 和 ${} 的区别和动态 SQL
数据库·sql·mybatis
jokerest1232 天前
web——sqliabs靶场——第十二关——(基于错误的双引号 POST 型字符型变形的注入)
数据库·sql·mybatis
天蓝蓝235282 天前
Lucene数据写入流程
java·mybatis·lucene
shiming88792 天前
Lucene数据写入与数据刷盘机制
java·mybatis·lucene