mapper

mybatis重要知识点(必背)

一笑奈何 提交于 2020-02-06 12:37:33
*Mapper动态代理 开发方式只需要程序员开发Mapper接口(相当于Dao接口),Mybatis框架会根据接口定义创建接口的动态代理对象,代理对象的方法同Dao接口实现类中的方法。 Mapper接口开发需要遵循以下4个规范:## 标题  Mapper映射文件中的 namespace与mapper接口的类路径相同***。  Mapper接口 方法名 和Mapper映射文件中定义的每个 Sql的id *相同  Mapper接口方法的 输入参数类型 和Mapper映射文件中定义的每个Sql的 ParameterType的类型 相同  Mapper接口方法的输出参数类型和Mapper映射文件中定义的每个Sql的resultType的类型相同 <?xml version="1.0" encoding="UTF-8"?> ** ** ** ** select * from user where id = #{id} ** [ ] > Mybatis官方推荐使用Mapper接口的方式开发Dao,这样程序员就不用去开发实现类了,这种方式是我们后面进入企业的主流方式。但是有一些企业还是用第一种方式开发Dao,因为在介绍Mybatis时,我们知道Mybatis的前身是ibatis,而ibatis是没有提供这种方式开发Dao的,所有很多公司还没有习惯使用第二种方式开发Dao。 **

MyBatis学习笔记

廉价感情. 提交于 2020-02-06 08:47:34
mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 HelloWorld 基本流程 1、创建全局配置文件,配置mybatis的一些操作 2、创建sql映射文件,该文件中配置了每个sql,以及sql的封装规则 3、将该sql映射文件注册到全局配置文件中 4、根据全局配置文件创建SqlSessionFactory对象,并且获取SqlSession对象 5、使用SqlSession对象执行写好的sql操作 mybatis全局配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> < configuration > < environments default = " development " > <

EmitMapper与NLiteMapper在多接口继承下映射的问题

你说的曾经没有我的故事 提交于 2020-02-06 06:48:22
先恭喜下 风云 的NLiteMapper组件在映射性能上有很大提高! 说正题:我在使用 EmitMapper 的过程中发现,如果在一次映射中,from类型是interface(暂且叫InterfaceA吧),并且该interface(InterfaceA)又继承自另一个interface(暂且叫InterfaceB吧),这时候,InterfaceB中的属性不会映射至to类型,这样会造成映射属性数据不完的问题。出于好奇,我又测试一下 风云 的NLiteMapper看能解决我遇到的这个问题,答案在后面! 验证一下我刚说的话,下面是整个测试的一个简单类图 测试代码很简单 static void Main(string[] args) { ClassAImpISub from = new ClassAImpISub(); from.StrA = "StrA"; from.StrB = "StrB"; //emit mapper var to = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<ISub, ClassB>().Map(from); Console.WriteLine("after emit mapper:"); Console.WriteLine("ClassAImpISub.StrA={0}

AutoMapper之自定义解析

浪子不回头ぞ 提交于 2020-02-06 06:47:50
自定义解析 4.自定义解析 AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理。AutoMapper为此提供一种方案:自定义解析。 4.1示例 我们先对类Source中Value1和Value2进行求和运算,再映射到类Destination中Total。 public class Source { public int Value1 { get; set; } public int Value2 { get; set; } } public class Destination { public int Total { get; set; } } AutoMapper提供了接口IValueResolver实现自定义解析,其中包含有源类型,源对象,目标类型,目标对象等信息。 //IValueResolver接口 public interface IValueResolver<in TSource, in TDestination, TDestMember> { TDestMember Resolve(TSource source, TDestination destination, TDestMember destMember, ResolutionContext

AutoMapper(五)

旧时模样 提交于 2020-02-06 06:43:03
返回总目录 Dynamic和ExpandoObject映射 AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象。 namespace FifthAutoMapper { //定义一个Person类 public class Person { public int Age { get; set; } public string Name { get; set; } } //主程序 class Program { static void Main(string[] args) { //不需要CreateMap同样可以映射,这就是所谓的“零配置” //Mapper.CreateMap<MyDynamicClass, Person>().ReverseMap(); //将一个动态对象映射到一个普通实例 dynamic dynamicObj = new ExpandoObject();//ExpandoObject对象包含可在运行时动态添加或移除的成员 dynamicObj.Age = 103; dynamicObj.Name = "tkb至简"; Person person = Mapper.Map<Person>(dynamicObj); Console.WriteLine("person.Age={0},Name={1}", person

AutoMapper(三)

十年热恋 提交于 2020-02-06 06:41:33
返回总目录 自定义类型转换 有时,需要完全控制一个类型到另一个类型的转换。一个类型一点都不像另一个类型,而且转换函数已经存在了,在这种情况下,你想要从一个“宽松”的类型转换成一个更强壮的类型,例如一个string的源类型到一个int32的目标类型。 这里有两个类Source和Destination,要把前者映射到后者,代码如下: public class Source { public string Value1 { get; set; } public string Value2 { get; set; } public string Value3 { get; set; } } public class Destination { public int Value1 { get; set; } public DateTime Value2 { get; set; } public Type Value3 { get; set; } } 截至发稿前,官方文档这样描述的 “因为AutoMapper不清楚从string到int,Datetime或Type的映射,如果要尝试映射的话,AutoMapper就会抛出异常(在映射时和配置检查时)”。 为了创建 这些类型的映射,我们必须提供自定义的类型转换器,我们有三种方法这样做: void ConvertUsing(Func<TSource,

(八)Spring事务管理

Deadly 提交于 2020-02-05 23:06:21
事务概念 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性。 事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。 事务四个属性ACID 原子性(atomicity) 事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用 一致性(consistency) 一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中 隔离性(isolation) 可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏 持久性(durability) 事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中的 业务场景示例 (此处代码基于Mybatis整合后)给userDao接口新增两个方法,删除和增加用户 //添加一个用户 int addUser(User user); //根据id删除用户 int deleteUser(int id); mapper文件,我们故意把 deletes 写错,测试 <insert id="addUser" parameterType="com.kuang.pojo.User"> insert into user (id

MyBatis接口绑定及多参数

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 13:56:05
文章目录 MyBatis接口绑定方案及多参数传递 map方式实现多参数传递 接口绑定 接口实现多参数传递 MyBatis接口绑定方案及多参数传递 在MyBatis的增删改查中都发现只能传递一个参数,如果想要传递多参数可以使用map的方式将参数传递进去 map方式实现多参数传递 < select id = " selectByMap " resultType = " User " parameterType = " map " > select * from user where username=#{username} and password=#{password}; </ select > Map < String , String > map = new HashMap < > ( ) ; map . put ( "username" , "reverie" ) ; map . put ( "password" , "123456" ) ; User u = sqlSession . selectOne ( "cn.com.mapper.selectByMap" , map ) ; System . out . println ( u ) ; 在select标签中,使用map作为parameterType,使用#{key}的方式获取map中的数据 从而间接的传递了多参数

Spring-boot集成mybatis

久未见 提交于 2020-02-05 05:26:49
首先添加依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> 如果不想把xml文件放在resources目录下进行编辑,需要添加 <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> 详细代码如下: pom文件 <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4

谈谈个人网站的建立(八)—— 缓存的使用

淺唱寂寞╮ 提交于 2020-02-05 03:09:57
欢迎访问我的网站 http://www.wenzhihuai.com/ 。感谢,如果可以,希望能在GitHub上给个star,GitHub地址 https://github.com/Zephery/newblog 。 一、概述  1.1 缓存介绍 系统的性能指标一般包括响应时间、延迟时间、吞吐量,并发用户数和资源利用率等。在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。 缓存常用语: 数据不一致性、缓存更新机制、缓存可用性、缓存服务降级、缓存预热、缓存穿透 可查看 Redis实战(一) 使用缓存合理性 1.2 本站缓存架构 从没有使用缓存,到使用mybatis缓存,然后使用了ehcache,再然后是mybatis+redis缓存。 步骤: (1)用户发送一个请求到nginx,nginx对请求进行分发。 (2)请求进入controller,service,service中查询缓存,如果命中,则直接返回结果,否则去调用mybatis。 (3)mybatis的缓存调用步骤:二级缓存->一级缓存->直接查询数据库。 (4)查询数据库的时候,mysql作了主主备份。 二、Mybatis缓存 2.1 mybatis一级缓存