当前位置: 首页 > news >正文

如何制作网站教程东莞路桥投资建设公司招聘

如何制作网站教程,东莞路桥投资建设公司招聘,用QQ群做网站排名,深圳市宝安区中心医院是三甲吗说明:干过Java都知道,数据库的数据类型与Java中属性的类型是不完全一致的,Java中的int类型,MySQL有与之对应的int类型,但MySQL的json类型,Java就没有与之对应的类型,还有例如MySQL的地理坐标类型…

说明:干过Java都知道,数据库的数据类型与Java中属性的类型是不完全一致的,Java中的int类型,MySQL有与之对应的int类型,但MySQL的json类型,Java就没有与之对应的类型,还有例如MySQL的地理坐标类型,Java中也是没有与之对应的类型。

当然,json类型我们可以用第三方库(如fastjson中)的 JSONObject 类型来对应,但直接使用查询数据库是封装不了的。

本文介绍如何自定义一个数据类型处理器,来处理这种情况,实现数据库类型到Java类型的转换。

场景

如下,实体类User的extraInfo字段,类型是 JSONObject,表示用户的扩展信息;

import com.alibaba.fastjson.JSONObject;
import lombok.Data;/*** 用户*/
@Data
public class User {private Long userId;private String username;private String password;private JSONObject extraInfo;
}

数据库中的类型是 json

在这里插入图片描述

查询

import com.hezy.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface UserMapper {List<User> selectAllUser();
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hezy.mapper.UserMapper"><select id="selectAllUser" resultType="com.hezy.pojo.entity.User" >select * from tb_user</select>
</mapper>

测试

    @Testpublic void selectTest4() {List<User> users = userMapper.selectAllUser();System.out.println("users = " + users);}

封装不进来

在这里插入图片描述

数据类型处理器

创建一个类型处理器,如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;import java.sql.*;@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.OTHER)
public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {/*** 设置参数*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.toJSONString());}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return json != null ? JSONObject.parseObject(json) : null;}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String json = rs.getString(columnIndex);return json != null ? JSONObject.parseObject(json) : null;}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String json = cs.getString(columnIndex);return json != null ? JSONObject.parseObject(json) : null;}
}

其中,类上的注解,

  • @MappedTypes(JSONObject.class):表示JavaBean中的数据类型,是JSONObject;

  • @MappedJdbcTypes(JdbcType.OTHER):表示的是数据库中的类型,这里没有JSON,可以选择OTHER;


其中,四个成员方法,

第一个:表示数据存入到数据库中的操作,数据库中json类型能接收的是json格式的字符串,所以需要toString();

后面三个:表示读取数据库后,数据转为Java中的操作,这里就可以将数据库类型再转为Java中的JSONObject类型;

两种使用方式

第一种很简单,再当前类型处理器上打上 @Component 注解,只要类型符合,都会执行该类的方法,相当于加了一层拦截器,如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.stereotype.Component;import java.sql.*;@Component
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.OTHER)
public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {/*** 设置参数*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.toJSONString());}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return json != null ? JSONObject.parseObject(json) : null;}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String json = rs.getString(columnIndex);return json != null ? JSONObject.parseObject(json) : null;}/*** 获取数据库中的值*/@Overridepublic JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String json = cs.getString(columnIndex);return json != null ? JSONObject.parseObject(json) : null;}
}

查询,可以看到数据能封装到JavaBean中

在这里插入图片描述


方式二,在查询的 resultMap 中,封装数据的同时,指定数据类型处理器,如下:

    <resultMap id="getAllUser" type="com.hezy.pojo.entity.User"><result column="user_id" property="userId" /><result column="username" property="username" /><result column="password" property="password" /><result column="extra_info" property="extraInfo" typeHandler="com.hezy.config.JSONObjectTypeHandler" /></resultMap><select id="selectAllUser" resultMap="getAllUser" >select * from tb_user</select>

查询,也可以封装进来

在这里插入图片描述

但需要注意,因为这种方式,只对这个查询方法生效,如果你的项目中有其他 insert() 方法,对应字段也需要指定数据类型处理器

    <insert id="insert" parameterType="com.hezy.pojo.entity.User">insert into tb_user(user_id, username, password, extra_info)values(#{userId},#{username},#{password},#{extraInfo, typeHandler=com.hezy.config.JSONObjectTypeHandler})</insert>

不然就会报下面这个错误

在这里插入图片描述

另外

通过上面的介绍,我们可以思考这两点,

  • 通过数据类型处理器,数据库和编程语言之间的数据可以自由、灵活地互相转换,数据库存的是int,也能给你转为字符串;

  • 能看出数据库和编程语言,对于数据定义是不一致的,数据库专注存储,所以划分更细致具体,编程语言重逻辑,所以定义更自由;

总结

本文介绍了如何在Mybatis中自定义一个数据类型处理器

http://www.dtcms.com/a/429479.html

相关文章:

  • 响应式设计的网站怎么做电影网站app
  • 怀化二手车网站网站建设简述需求分析的基本概念及内容
  • 有的网站打开的是html结尾的路径有的不是如何在亚马逊做公司网站
  • 网站自动秒收录工具网站开发html php
  • 自己建设网站模版可以帮忙做网站做公司
  • 电子商务网站建设需求分析天津怎么建立企业网站
  • 网站设计服务有哪些创建wordpress网站
  • 网站建设哪家公司比较好网页设计报价模板
  • 小米商城兰州做网络优化
  • 邢台哪个公司做网站好黄骅市天气预报
  • 上海高端网站建设服务器山西城乡和建设厅网站
  • 网站首页改版费用高密网站建设价格
  • 现在网站开发技术有哪些梅州市住房和建设局网站
  • 网络推广学校培训排名优化的公司
  • 企业网站建设可以分为几个层次wordpress本地文章上传到服务器
  • 建设部网站网站建设app线上推广
  • 有哪些网站可以卖自己做的图片seo产品优化免费软件
  • 音乐网站怎么做无线增值业务做网站为什么可以自学
  • 阿里巴巴网站做推广效果怎么样哪里学网站建设与管理
  • 张家口建设局网站南通市通州建设局网站
  • 可以做投票的网站自己做网站下载怎么
  • 广西执业药师培训网站网站建设费用计入哪个科目
  • 找最新游戏做视频网站上海政策最新规定
  • 软件工作室网站模板工商注册名字查询系统
  • 威海做网站的哪家好知乎关键词排名优化工具
  • 网站名字重复去哪里找做网站 的客户
  • 怎么更改网站备案信息青岛推广软件
  • 国外单页制作网站模板网站开发 书籍
  • 个体户做网站有用吗WordPress批量发布插件
  • 湖南微信网站公司电话号码市场营销的主要应用领域