一起学MyBatis之入门篇(2)
概述本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean类型,在数据库中则是int类型,则需要进行java类型到jdbc类型的转换,仅供学习分享使用,如有不足之处,还请指正。 转换方法实现类型转换有两种方法,本文主要采用第2种方法。如下所示:
应用场景说明:
类型转换实现步骤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 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,有以下几点,需要注意:
级联属性假如学生有两个属性: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 配置别名因为本类中会频繁用到,所示配置了别名,方便使用,如下所示: 设置别名,忽略大小写,当一个类频繁用到时,则可以定义别名 typeAliases3 每一个类,定义一个别名 4 <typeAlias type="com.hex.mybatis.Product" alias="product" /> 5 6 以下批量定义别名,所有包里面的类名,就是别名 7 package name="com.hex.mybatis"8 除了自定义别名,MyBatis还内置了需要别名 9 > 备注日出未必意味着光明,太阳也无非是一颗晨星;只有在我们醒着时,才是真正的破晓 !!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |