MyBatis是java项目持久层框架中比较优秀的一个,几乎满足项目中的一切需求。
MyBatis的核心是Mapper文件,Mapper文件中接收java对象参数,写sql语句,返回Java对象结果,所以下面讲解的知识都是在Mapper文件中的操作。
主要内容有:
在MyBatis的基本使用中,根据id查找对象的xml片段是:
说明:
传递参数需要注意两点,一是设置参数类型,二是怎么接收参数。
参数类型使用parameterType属性指定,参数类型需要写全类名或者写别名。
如果参数类型是int,全类名的写法如下:
parameterType="java.lang.Integer"
框架定义了常用类型的别名,java.lang.Integer的别名是int,所以int数据可以可以直接这么写:
parameterType="int"
##框架中定义的别名有:
8个基本数据类型,string,map。
注意:java.util.List不是默认别名,需要写全类名。
如果参数是我们自定义的类,比如:com.honor.mybatis.model.StudentModel写法如下:
parameterType="com.honor.mybatis.model.StudentModel"
这种写法比较麻烦,且此时是字符串,容易出错。所以此时需要自定义别名,然后使用别名即可。
MyBatis框架定义别名写在全局配置文件中(SqlMapConfig.xml)即可,如下:
此时在Mapper文件中使用别名即可,如下:
parameterType="studentModel"
接收int参数示例如下:
说明:
接收com.honor.mybatis.model.StudentModel参数示例如下:
说明:
1,接收List
说明:
2,接收List
说明:
Map
说明:
当Map的value是Student时示例如下:
说明:
查询数据条数的sql返回值都是int,示例如下:
说明:
返回string类型的数据。示例如下:
返回对象的标准写法如下:
说明:
如果数据库表字段名和类的字段名相同,则可以简写:
返回List结合和返回单个对象在Mapper文件中的写法完全一样,返回值仍然写List中元素的类型,sql完全不变,只是sqlsession对象调用的方法不同。sqlsession的调用如下:
List studentModelList = sqlSession.selectList("student.queryList", student);
返回map对象示例如下:
注:此时返回的map对象的键分别是name和age,即与表字段名保持一直。
自定义map的key的写法如下:
在开发中很多情况下需要插入数据时返回主键,MyBatis中提供了该方法。但MySql和oracle数据库返回主键的方法不同。
具体如下:
insert into student (name,age)
values(#{name},#{age})
说明:
sqlsession的代码如下:
//row为影响的条数
int row = sqlSession.insert("student.insert", student);
//id为返回的主键id
int id = student.getId();
具体如下:
Select 序列名.nextval from dual
insert into user(id,student,age)
values(#{id},#{student},#{age})
注:因为roacle的主键id不是自增长的,所以一个表要关联一个序列号,获取下一个序列号的值当作表的主键。
在上面的示例中sql语句都不是严格的写法,严格应该如下:
insert into student (name,age)
values(#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
严格的写法要在获取数据时指定数据类型,jdbcType即是指定数据类型。
相信很多人在使用Mybatis时遇到过下面问题:
org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter.
Most JDBC drivers require that the JdbcType must be specified for all nullable parameters.
Caused by: java.sql.SQLException: 无效的列类型: 1111
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
......
产生这个异常的原因是:当某个参数为null时,系统不知道该参数是什么数据类型,此时就会报错。
但是,我有一个大大的❓,为什么大部分时候都不报错,只有个别情况下报错。希望看到此处的大神给予留言帮助,感激不尽!
解决上面问题的方式就是使用jdbcType指定数据类型。
常用的对应关系如下:
VARCHAR String
NUMERIC java.math.BigDecimal
INTEGER int
BIGINT long
DOUBLE double
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
在mapper.xml文件中定义resultMap的方式如下:
说明:
注:此时jdbyType的数据类型与上面讲的jdbcType的类型一致,但此时使用双引号,上面不需要双引号。
使用示例如下:
说明:
resultMap有两大作用:
在mapper.xml文件中可以定义sql片段,然后被其他地方使用。具体如下:
id, name, age
说明:
说明:
sql片段的最大作用就是复用,类似于java代码中的字符串常量,也便于修改维护。
mapper.xml文件是一个xml文件,一些字符被作为xml的定义符号,当sql语句中使用这些特殊符号时需要做特殊处理。处理方式有两种,一种是使用转译字符,另外一种使用。
常见的需要转译的字符如下:
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
例如:sql如下:
create_date_time >= #{startTime} and create_date_time <= #{endTime}
写在“”里面的字符不会被mybatis解析,直接拼接到sql语句中。如下:
大于等于
= ]]>
小于等于
例如:sql如下:
create_date_time = ]]> #{startTime} and create_date_time #{endTime}
MyBatis是一个非常优秀的框架,不仅将sql与代码分离,而且提供了很好的数据交互方式。