加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

一起学MyBatis之入门篇(2)

发布时间:2020-12-14 18:05:08 所属栏目:大数据 来源:网络整理
导读:概述 本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean类型,在数据库中则是int类型,则需要进行java类型到jdbc类型的转换,

概述

本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean类型,在数据库中则是int类型,则需要进行java类型到jdbc类型的转换,仅供学习分享使用,如有不足之处,还请指正。

转换方法

实现类型转换有两种方法,本文主要采用第2种方法。如下所示:

  1. 实现TypeHandler 接口,但是比较麻烦。
  2. 继承BaseTypeHandler<T>基类,实现抽象方法,其中T表示待转换类型,即Java中的源类型。

应用场景

说明:

  1. 有一个Student类,属性stuSex性别是Boolean类型,true表示男,false表示女,
  2. 在数据库中有一个Student表,stuSex字段,是int类型,1表示男,0表示女,
  3. 则需要在java类型和jdbcType之间进行转换,才能正确显示。

类型转换实现步骤

1.新增BooleanAndIntConverter转换类,该类继承BaseTypeHandler<Boolean>基类,如下所示:

需要实现的抽象方法有4个【1个set方法(java-->jdbcType的转换),3个get方法(jdbcType-->java的转换)】,

 1 package com.hex.converter;
 2 
 3 import java.sql.CallableStatement;
 4  java.sql.PreparedStatement;
 5  java.sql.ResultSet;
 6  java.sql.SQLException;
 7 
 8  org.apache.ibatis.type.BaseTypeHandler;
 9  org.apache.ibatis.type.JdbcType;
10 
11 /**
12  * 类型转换器(java-jdbc之间的类型转换)
13  * 方法:1.实现接口TypeHandler
14  * 2.或者继承基类
15  * @author Administrator
16  * Boolean:表示待转换类型,即源类型
17  */
18 public class BooleanAndIntConverter extends BaseTypeHandler<Boolean> {
19 
20     21      * 结果是可空的返回内容
22      * rs:结果集
23      * columeName:列名
24      25     @Override
26     public Boolean getNullableResult(ResultSet rs,String columeName) throws SQLException {
27         int num=rs.getInt(columeName);
28         return num==1?true:false;
29     }
30 
31     /***
32 33 34      * colomeIndex:列索引
35      36 37     int columeIndex) 38         rs.getInt(columeIndex);
39         40 41 
42     43 44      * cs:存储过程方式
45      46 47     public Boolean getNullableResult(CallableStatement cs,1)">48         cs.getInt(columeIndex);
49         50 51 
52     53      * set表示 java--jdbc类型
54      * ps:表示预编译的sql对象
55      * i:表示修改的位置索引
56      * parameter:表示参数的java类型
57      * arg3:表示数据的类型
58      59 60     void setNonNullParameter(PreparedStatement ps,1)">int i,Boolean parameter,JdbcType arg3) 61         // 如是true,则数据库类型为1,否则数据类型为false
62         if(parameter){
63             ps.setInt(i,1);
64         }else{
65             ps.setInt(i,066         }
67 68 }

2. 在MyBatis的配置文件中,声明类型转换,和environments平级,如下所示:

jdbcType="INTEGER"是枚举类型,必须大写。

1 <typeHandlers>
2     typeHandler handler="com.hex.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER" />
3 </>

3.定义一个Student类,该类有一个stuSex属性,是boolean类型

 2 * 性别
private boolean stuSex;
 5 
 isStuSex() {
 7     return}
void setStuSex( stuSex) {
10     this.stuSex =11 }

4.查询时,需要在Mapper文件中进行配置类型转换,如下所示:

resultMap type="Student" id="studentResult" 2      id property="stuId" column="stuId" 3      result ="stuName"="stuName" 4      ="stuAge"="stuAge" 5      <!-- 此处需要类型转换,需要说明一下:jdbcType的值必须大写,是枚举类型 -->
 6      ="stuSex"="boolean"="INTEGER" 7  resultMapselect id="queryStudentById" resultMap="studentResult" parameterType="int"    select * from Student where stuId = #{id}
10 select>

注意:

如果jdbc类型和java的类型完全一致,则使用resultType,否则用resultMap
如果java中的字段名称和java中的字段名称一致,则用resultType,否则用resultMap

5. 增加StudentMapper接口,采用动态代理的方式进行调用

 com.hex.mybatis;
 java.util.List;
 4 
interface StudentMapper {
 6      7      * 通过ID查询:动态代理 1. 函数名称和Mapper标签ID一致 2. 参数类型和parameterType对应的一致 3.
     * 返回值和resultType一致
     * 
     * @param pid
@return
12      13     Student queryStudentById(int pid);
14 
15          * 新增
17  student
19      void addStudent(Student student);
21 
22     
23     24      * 通过地址查询学生
26 27      28     List<Student> queryStudentByAddress(Student student);
29 
30 }

6. 对于新增,则需要在语句中进行类型转换,如下所示:

如果需要类型转换,则需要如下写法:#{stuSex,javaType=boolean,jdbcType=INTEGER},进行boolean和INTEGER类型的转换

insert ="addStudent"="Student" 2     insert into Student(stuId,stuName,stuAge,stuSex)values(#{stuId},#{stuName},#{stuAge},#{stuSex,jdbcType=INTEGER})
insert>

对于入参,即ParameterType,有以下几点,需要注意:

  1. 如果是 简单类型(8个基本类型+String):
    • 可以采用#{id}方式,其中id可以任意值,且会自动进行类型转换,给String类型加上单引号,可以防止SQL注入。
    • 可以采用${value}的方式写,必须是value,不可以写其他,且原样输出,不会给String加上单引号,不可以防止SQL注入。
  2. 如果是复杂类型,则需要写属性名,两者都一样

级联属性

假如学生有两个属性:homeAddress(家庭地址),schoolAddress(学校地址),有一个Address地址类,包含这两个属性,如下所示:

class Address {
 2     
 3          * 家庭住址
private String homeAddress;
     * 学校住址
 9       String schoolAddress;
11     
12     public String getHomeAddress() {
13          homeAddress;
 setHomeAddress(String homeAddress) {
16         this.homeAddress =18      String getSchoolAddress() {
19          schoolAddress;
20 21      setSchoolAddress(String schoolAddress) {
22         this.schoolAddress =24 }

而Student类中有一个地址属性,如下所示:

 1          * 地址
 4      Address address;
 5     
 Address getAddress() {
 7          address;
 9 
 setAddress(Address address) {
11         this.address =12     }

以下进行模糊查询,在Mapper文件中配置,如下所示:

="queryStudentByAddress"    select * from Student where homeAddress like  '%${address.homeAddress}%' and schoolAddress like '%${address.schoolAddress}%'
>

此处采用${address.homeAddress}进行模糊查询,而不是#{xxxx}的方式,方便拼接。

采用动态代理的方式测试代码如下:

static void main(String[] args)  IOException {
 2     以输入流的方式加载配置文件
 3     String resource = "mybatis-config.xml" 4     InputStream inputStream = Resources.getResourceAsStream(resource);
 5     创建SqlSessionFactory对象,build第二个参数指定environment的id,,如果不写,默认配置default.
 6     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
创建会话对象
 8     SqlSession session = sqlSessionFactory.openSession();
10     StudentMapper mapper=session.getMapper(StudentMapper.    Student student =  mapper.queryStudentById(2);
    System.out.println(student);
    System.out.println("查询成功");
    Student student2=new Student(2,"lili",true,20);
    mapper.addStudent(student2);
    session.commit();
    System.out.println("新增成功");
关闭会话对象
19     Student student = Student();
20     Address address=new Address("S","S"    student.setAddress(address);
22      List<Student> lstStudents =    mapper.queryStudentByAddress(student);
23      for(Student s : lstStudents){
        System.out.println(s);
     }
26      System.out.println("查询成功"27     session.close();
28 29     
View Code

配置别名

因为本类中会频繁用到,所示配置了别名,方便使用,如下所示:

 设置别名,忽略大小写,当一个类频繁用到时,则可以定义别名 typeAliases3      每一个类,定义一个别名 4      <typeAlias type="com.hex.mybatis.Product" alias="product" /> 5         
6      以下批量定义别名,所有包里面的类名,就是别名 7     package name="com.hex.mybatis"8      除了自定义别名,MyBatis还内置了需要别名 9 >

备注

日出未必意味着光明,太阳也无非是一颗晨星;只有在我们醒着时,才是真正的破晓 !!!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读