>

Mybatis动态标签,Mybatis的类型处理器

- 编辑:金沙国际平台登录 -

Mybatis动态标签,Mybatis的类型处理器

Mybatis在预管理语句(PreparedStatement)中设置一个参数时,会用私下认可的typeHandler举办管理。

咱们好,笔者是IT修真院,一枚正直纯洁善良的如刚入门的Java技术员,先天试着给我们大快朵颐一下有关mybaits动态标签的剧情

那句话是何许看头吧,当你想用姓名查询一位的音信时

背景介绍

<select  parameterType="string" resultRole="role">    select rolename,phonenumber from t_role where rolename = #{rolname}</select>

mybatis是怎么?说到用JDBC访谈数据库,除了供给本身写SQL之外,还要操作Connection, Statment, ResultSet 那个手协助性质的代码;

Mybatis调用这么些查询语句时会先生成预处理语句

拜望分歧的表,还恐怕会写过多同样的代码,繁琐和清淡。而用Mybatis,只要求提供关键性的SQL语句,别的的工作,像加载驱动,创建连接,Statement,

select rolename,phonenumber from t_role where rolename = ?

JDBC相关的有些动作交给Mybatis,减弱重复性的工作,更加多的关心在增删改查等操作层面上,把手艺细节封装在底层

以此‘?’也正是占位符里面应该填什么值吗?

文化解析

此刻因为rolename是String类型的,rolename就能去找StringTypeHandler这一个Mybatis自个儿已经完毕的Computer

观念的使用JDBC的艺术,不经常候须求结合复杂的的SQL语句,还索要去拼接,稍不留意如何空格,引号;都会变成错误。Mybatis的动态SQL作用正是为了消除这种主题素材,

public class StringTypeHandler implements TypeHandler<String> {    @Override    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {        ps.setString(i, parameter);    }    @Override    public String getResult(ResultSet rs, String columnName) throws SQLException {        return rs.getString(columnName);    }    @Override    public String getResult(ResultSet rs, int columnIndex) throws SQLException {        return rs.getString(columnIndex);    }    @Override    public String getResult(CallableStatement cs, int columnIndex) throws SQLException {        return cs.getString(columnIndex);    }}

其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成极度灵活的SQL语句,进而加强开荒职员的频率。

我们前几日只需求看率先个法子,rolename看到那一个艺术就可以掌握,那些‘?’占位符原本应该填笔者要好。

编码实战

结果集和仓库储存进程同理。

最大的主题素材便是不会用,直接看代码吧,小demo

假诺Mybatis找不到品种的调换器就不知底该干嘛了,像上边那句代码

图片 1图片 2图片 3图片 4图片 5常用

<insert  parameterType="person">    insert into people(id, name, phonenumber)    values(#{id}, #{name},#{phonenumber})</insert>

越多研究

phonenumber那些类是团结创设的,长这么:

1;mybatis中sql语句的#{}占位符和${}占位符有何分化?

private String countryCode;    private String stateCode;    private String number;    public PhoneNumber() {    }    // 021-3359-3216    public PhoneNumber(String str) {        String[] number = str.split;        this.countryCode = number[0];        this.stateCode = number[1];        this.number = number[2];    }    // 021,3359,3216    public PhoneNumber(String countryCode, String stateCode, String number) {        this.countryCode = countryCode;        this.stateCode = stateCode;        this.number = number;    }    public String getAsString() {        return countryCode + "-" + stateCode + "-" + number;    }    public String getCountryCode() {        return countryCode;    }    public void setCountryCode(String countryCode) {        this.countryCode = countryCode;    }    public String getStateCode() {        return stateCode;    }    public void setStateCode(String stateCode) {        this.stateCode = stateCode;    }    public String getNumber() {        return number;    }    public void setNumber(String number) {        this.number = number;    }

${}是Properties文件中的变量占位符,它能够用于标签属性值和sql内部,属于静态文本替换,比方${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql实施前会利用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,

因而大家需求报告Mybatis应该在预管理语句占位符中填什么,那时候就须求和煦再一次定义八个typeHandler.

2;MyBatis中的标签和where子句的区分?

public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber> {    //遇到PhoneNumber参数的时候应该如何在ps中设置值    //ps.setXXX()    @Override    public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)            throws SQLException {        ps.setString(i, parameter.getAsString;    }    //查询中遇到PhoneNumber类型的应该如何封装    //stuedent.setTelPhone(new PhoneNumber("021-3359-3216"))    @Override    public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {        return new PhoneNumber(rs.getString(columnName));    }    //查询中遇到PhoneNumber类型的应该如何封装    @Override    public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {        return new PhoneNumber(rs.getString(columnIndex));    }    //CallableStatement使用中遇到了PhoneNumber类型的应该如何封装    @Override    public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {        return new PhoneNumber(cs.getString(columnIndex));    }}

三个是标签,叁个是sql语句,二者能够高达同等的效用,可是前面三个更加灵活

想尝试的话,这里有代码。源码下载

3;set和if 五个都足以决断多少个规范化是还是不是空,那八个有啥分化 ?

三个用于update;另七个if更确切的乃是where,适用于select

4;Mybatis是哪些将sql实施结果封装为对象对象并回到的?

经过设置重临值类型,resulttype/resultmap

5;当实体类中的属性名和表中的字段名分歧样 ,怎么做 ?

会询问出null;那一年能够再起来设置号map;对应字段;类似于起别称

6;数据库字段有下划线?

同上;

7;动态标签和动态sql???

不八个概念;一个是标签;贰个是注脚的sql语句

8;set的时候自个儿传三个Student进去,都不为null,不过本身只想改他的体重字段能或不可能办到,遵照if !=null的话,四个字段都会update吧?

您传进去三个,不过只接受俩.......

9;type和map???

MyBatis中在查询进行select映射的时候,再次来到类型可以用resultType,也足以用resultMap,resultType是

直接代表回去类型的,而resultMap则是对表面ResultMap的援引,可是resultType跟resultMap不可能并且设有。

在MyBatis进行询问映射时,其实查询出来的每壹特性质都以坐落贰个应和的Map里面的,在那之中键是属性名,值则是其相应的值。①当提供的归来类型属性是resultType时,MyBatis会将Map里面的键值对抽取赋给resultType所钦点的靶子对应的品质。

所以实际MyBatis的每五个查询映射的回到类型都以ResultMap,只是当提供的归来类型属性是resultType的时候,MyBatis对电动的给把相应的值赋给resultType所钦赐对象的属性。②当提供的回到类型是resultMap时,

因为Map不能够很好代表领域模型,就须求自己再进一步的把它转化为对应的对象,这经常在复杂查询中很有功用。

参谋文献

PPT

视频

招待出席java职务系统

多多指教,错误之处!!!

本文由编程发布,转载请注明来源:Mybatis动态标签,Mybatis的类型处理器