MyBatis(一)
入门使用步骤;
基础方式Statement的增删改查CRUD;
mapper动态代理方式的crud (MyBatis接口开发)
入门使用步骤
概括:
- 导入MyBatis和MySQL的jar包。
- src下新建并配置conf.xml文件。(配置数据库驱动、连接、用户名、密码)
- 表 - 类, 类的映射文件。
- 执行sql操作,测试
1. 导入MyBatis和MySQL的jar包。
2. src下新建并配置conf.xml文件。(配置数据库驱动、连接、用户名、密码; 映射文件的路径)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置数据库信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!--mysql驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!--数据库连接-->
<property name="url" value="jdbc:mysql://localhost:3306/nftcdatabase1?serverTimezone=UTC" />
<property name="username" value="root" /> <!--用户名-->
<property name="password" value="123" /> <!--密码-->
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!--数据库中某张表对应的 实体类的 映射文件的路径-->
<mapper resource="com/nftc/entity/personMapper.xml" />
</mappers>
</configuration>
3. 表 - 类, 类的映射文件。
- 在数据库中建表xxx
- 编写对应实体类Xxx
- 新建类的配置文件xxxMapper.xml
public class Person {
int id;
String name;
int age;
public Person() {
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.id+" "+this.name+" "+this.age;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace写实体类的完整包名 -->
<mapper namespace="com.nftc.entity.Person">
<!-- id唯一表示一个sql语句,resultType写返回值的类型,parameterType写参数的类型 -->
<select id="queryPerson" resultType="com.nftc.entity.Person" parameterType="int">
select * from person where id= #{id} <!-- 此处的#{id}表示占位符 -->
</select>
</mapper>
4. 执行sql操作,测试
public static void main(String[] args) throws IOException {
//得到conf.xml对应的Reader
Reader reader = Resources.getResourceAsReader("conf.xml");
//由输入流提供的配置信息建立SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//得到SqlSession,相当于jdbc中的Connection
SqlSession sqlSession = sqlSessionFactory.openSession();
String statement = "com.nftc.entity.Person.queryPerson";
//指定执行那个实体类Mapper.xml中定义的那条sql语句(namespace.id),并给出参数。得到返回值
Person person = sqlSession.selectOne(statement,1);
System.out.println(person);
//关闭会话
sqlSession.close();
}
conf.xml配置文件解析
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 通过environments的default值 和 environment的 id 来指定 MyBatis运行时的数据库环境-->
<environments default="development">
<!-- 开发环境(自己的计算机),id名称可以随便起 -->
<environment id="development">
<!-- 事务提交方式:
JDBC:利用JDBC方式处理事务(需要手工去写commit rollback close)(如果更改了数据库,而不写commit的话,关闭连接后,数据库还是原来的,并没有做出改变)
MANAGED:将事务交由 其他组件去托管(spring ,jobss),默认 会关闭连接。
以下配置默认不会关闭连接
<transactionManager type="MANAGED"/>
<property name="closeConnection" value="false"/>
-->
<transactionManager type="JDBC" />
<!-- 数据源类型:
UNPOOLED:传统的JDBC模式(每次访问数据库,均需要 打开、关闭等数据库操作,但是 打开、关闭数据库是比较消耗性能的)
POOLED:使用数据库连接池(90%情况下用这个)(数据库连接池里存在很多数据库连接,需要时取一个连接,用完归还给连接池,连接不被关闭,在多线程的情况下可以并发获取连接)
JNDI:从tomcat中获取一个内置的数据库连接池 (数据库连接池-数据源 )
-->
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
<!-- 部署环境,真正的项目应该在 发布的那台计算机上运行 -->
<environment id="shishi">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@192.168.1.183:1521:ORCL"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
<!-- 测试环境 -->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@192.168.1.111:1521:ORCL"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件(映射文件一般要放在实体类所在包路径下,此处的路径只用写 包路径+映射文件名) -->
<mapper resource="org/lanqiao/entity/studentMapper.xml"/>
</mappers>
</configuration>
一、基础方式的增删改查CRUD:
数据库 表person
实体类 Person类
int id;
String name;
int age;
构造函数
geteer
setter
toString
数据库表 和 实体类 的 映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace写实体类的完整包名 -->
<mapper namespace="com.nftc.entity.Person">
<!-- 查询一个人 -->
<select id="queryPerson" resultType="com.nftc.entity.Person" parameterType="int">
select * from person where id= #{id} <!-- 此处的#{id}表示占位符(要和实体类中的属性名字相同) -->
</select>
<!-- 查询所有人 -->
<select id="queryAllPerson" resultType="com.nftc.entity.Person" >
select * from person
</select>
<!-- 插入一个人 -->
<insert id="insertPerson" parameterType="com.nftc.entity.Person">
insert into person(id,name,age) values(#{id}, #{name}, #{age})
</insert>
<!--
sql语句中的属性,要和数据库表中的属性名字相同。
#{id}表示占位符(要和实体类中的属性名字相同)
-->
<!-- 删除一个人 -->
<delete id="deletePersonByid" parameterType="int">
delete from person where id= #{id}
</delete>
<!-- 更改一个人 -->
<update id="updatePersonByid" parameterType="com.nftc.entity.Person">
update person set name= #{name}, age= #{age} where id= #{id}
</update>
<!--
mybatis 规定一个sql语句只能有一个parameterType和一个resultType。
当输入参数不是一个基本类型时,可以用 类、数组
当输出结果有很多行时,可以只表示出 一行的类型,即可。
-->
</mapper>
-
映射文件写sql语句(标签)的规则。
-
mybatis约定:
- 输入参数parameterType 和 输出参数resultType ,在形式上都只能有一个
-
如果输入参数 :是简单类型(8个基本类型+String) 是可以使用任何占位符,#{xxxx}
如果是对象类型,则必须是对象(实体类)的属性 #{实体类属性名} -
输出参数: 如果返回值类型是一个 对象(如Person),则无论返回一个、还是多个,
resultType都写成com.nftc.entity.Person
即 resultType=“com.nftc.entity.Person”
执行sql操作
以下3句是固定的
//得到conf.xml作为Reader(输入文本流)
Reader reader = Resources.getResourceAsReader("conf.xml");
//由reader提供的参数 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//由SqlSessionFactory 创建 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();//SqlSession理解为Connection
//查询某个人
String statement = "com.nftc.entity.Person.queryPerson";
Person person = sqlSession.selectOne(statement,1);
System.out.println("查询某个人"+person);
sqlSession.commit();//此处如果不commit,关闭后,数据库内容不会有改变。
sqlSession.close();
public static void main(String[] args) throws IOException {
//以下3句是固定的
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();//SqlSession理解为Connection
//查询全部人
String statement22 = "com.nftc.entity.Person.queryAllPerson";
List<Person> list = sqlSession.selectList(statement22) ;
System.out.println("查询全部人"+list);
//查询某个人
String statement = "com.nftc.entity.Person.queryPerson";
Person person = sqlSession.selectOne(statement,1);
System.out.println("查询某个人"+person);
//增加一个人 注意增加的行的主键不能喝原来的重复,否则会抛出异常
String statement1 = "com.nftc.entity.Person."+"insertPerson";
Person per1 = new Person(56,"太阳",34);
sqlSession.insert(statement1, per1);
String statement222 = "com.nftc.entity.Person.queryAllPerson";
List<Person> list2 = sqlSession.selectList(statement222) ;
System.out.println("查询全部人"+list2);
//删除一个人
String statement2 = "com.nftc.entity.Person."+"deletePersonByid";
sqlSession.delete(statement2, 1);
String statement2223 = "com.nftc.entity.Person.queryAllPerson";
List<Person> list23 = sqlSession.selectList(statement2223) ;
System.out.println("查询全部人"+list23);
//修改一个人的信息
String statement33 = "com.nftc.entity.Person."+"updatePersonByid";
//Person person4 =new Person(2,"aa",44);或者如下更清晰,实质一样,只用传进去一个Person对象就行
Person person4 = new Person();
//选择指定的人
person4.setId(2);
//修改信息为
person4.setName("aa");
person4.setAge(44);
sqlSession.update(statement33, person4);
String statement22234 = "com.nftc.entity.Person.queryAllPerson";
List<Person> list234 = sqlSession.selectList(statement22234) ;
System.out.println("查询全部人"+list234);
sqlSession.commit();//此处如果不commit,关闭后,数据库内容不会有改变。
sqlSession.close();
}
总结:
注意事项:
- 如果使用的 事务方式为 jdbc,则需要 手工commit提交,即session.commit();
- 所有的标签 <select> <update>等 ,都必须有sql语句,但是sql参数值可选
select* from person where id= #{xx}
sql有参数:session.insert(statement, 参数值 );
sql没参数:session.insert(statement);
API:
SqlSession调用方法实现数据库CRUD
二、mapper动态代理方式的crud (MyBatis接口开发):
原则:约定优于配置
3中配置方式:
-
硬编码方式
abc.java
Configuration conf = new Configuration();
con.setName(“myProject”) ; -
配置方式:
abc.xml
myProject -
约定:默认值就是myProject
实质“:
匹配的过程:(约定的过程)
1.根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2.根据 接口的方法名 找到 mapper.xml文件中的SQL标签 (方法名=SQL标签Id值)
以上2点可以保证: 当我们调用接口中的方法时,
程序能自动定位到 某一个Mapper.xml文件中的sqL标签
以上,可以通过接口的方法->SQL语句
MyBatis接口开发具体实现的步骤:
基础环境:mybatis.jar/ojdbc.jar、conf.xml、mapper.xml
(不同之处)每个mapper.xml都增加一个接口,mapper.xml中的每个sql语句都要在接口中定义一个方法。将接口.class传给SqlSession.通过接口的全称类名.接口的方法名确定sql语句。不需要再用namespace.id确定sql语句。
1. 定义mapper.xml文件对应的接口,mapper.xml中的每个sql语句都要在接口中定义一个方法
- 接口,接口中的方法必须遵循以下约定:
1. 方法名和mapper.xml文件中标签的id值相同
2. 方法的 输入参数 和mapper.xml文件中标签的 parameterType类型一致 (如果mapper.xml的标签中没有 parameterType,则说明方法没有输入参数)
3. 方法的返回值 和mapper.xml文件中标签的 resultType类型一致 (无论查询结果是一个 还是多个(student、List),在mapper.xml标签中的resultType中只写 一个(Student);如果没有resultType,则说明方法的返回值为void)
约定的目标: 省略掉statement,即根据约定 直接可以定位出SQL语句 - 除了以上约定,要实现 接口中的方法 和 Mapper.xml中SQL标签一一对应,还需要以下1点:
namespace的值 ,就是 接口的全类名( 接口 - mapper.xml 一一对应)
2. conf.xml配置 Mapper.xml的路径
<mappers>
<!-- @@@@@映射文件的路径(从构建路径的目录开始 到映射文件) -->
<mapper resource="com/nftc/mapper/personMapper.xml" />
</mappers>
3. 调用 mapper接口的方法执行sql语句
执行:
StudentMapper studentMapper = session.getMapper(StudentMapper.class) ;
studentMapper.方法();
通过session对象获取接口(session.getMapper(接口.class);),再调用该接口中的方法,程序会自动执行该方法对应的SQL。
习惯:SQL映射文件(mapper.xml) 和 接口放在同一个包中 (注意修改conf.xml中加载mapper.xml文件的路径)
//由Mapper接口的全称类名,可定位到某个namespace为 Mapper接口的全称类名 的mapper.xml映射文件
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);//@@@@@
//由Mapper接口调用的方法名,定位到映射文件中某个sql语句
List<Person> list = personMapper.queryAllPerson();//@@@@@
- conf.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置数据库信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/nftcdatabase1?serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!-- @@@@@映射文件的路径(从构建路径的目录开始 到映射文件) -->
<mapper resource="com/nftc/mapper/personMapper.xml" />
</mappers>
</configuration>
- personMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- @@@@@namespace写mapper接口的完整包名 -->
<mapper namespace="com.nftc.mapper.PersonMapper">
<!-- 查询一个人 -->
<select id="queryPerson" resultType="com.nftc.entity.Person" parameterType="int">
select * from person where id= #{id} <!-- 此处的#{id}表示占位符(要和实体类中的属性名字相同) -->
</select>
<!-- 查询所有人 -->
<select id="queryAllPerson" resultType="com.nftc.entity.Person" >
select * from person
</select>
<!-- 插入一个人 -->
<insert id="insertPerson" parameterType="com.nftc.entity.Person">
insert into person(id,name,age) values(#{id}, #{name}, #{age})
</insert>
<!--
sql语句中的属性,要和数据库表中的属性名字相同。
#{id}表示占位符(要和实体类中的属性名字相同)
-->
<!-- 删除一个人 -->
<delete id="deletePersonByid" parameterType="int">
delete from person where id= #{id}
</delete>
<!-- 更改一个人 -->
<update id="updatePersonByid" parameterType="com.nftc.entity.Person">
update person set name= #{name}, age= #{age} where id= #{id}
</update>
<!--
mybatis 规定一个sql语句只能有一个parameterType和一个resultType。
当输入参数不是一个基本类型时,可以用 类、数组
当输出结果有很多行时,可以只表示出 一行的类型,即可。
-->
</mapper>
- PersonMapper.java接口
package com.nftc.mapper;
import java.util.List;
import com.nftc.entity.Person;
public interface PersonMapper {
/*@@@@@mybatis约定:
* 1.函数名 和 映射文件中sql标签的 id相同
* 2.参数 和 对应标签的parameterType属性值 类型相同
* 如果没写parameterType,则不写参数
* 3.返回值 和 对应标签的resultType属性值 类型相同
* 如果没写resultType, 则返回值为void
* 注意 如果查询语句返回的结果可能有多个 要用List<resultType对应的类>,如果有一个则只写resultType对应的类。
*
* */
Person queryPerson(int id);
List<Person> queryAllPerson();//@@@@@
void insertPerson(Person person);
void deletePersonByid(int id );
void updatePersonByid(Person person);
}
- Person.java
和用statement方式的一样 - 测试
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
//查询全部人List<Person> list =
//由Mapper接口的全称类名,可定位到某个namespace为 Mapper接口的全称类名 的mapper.xml映射文件
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);//@@@@@
//由Mapper接口调用的方法名,定位到映射文件中某个sql语句
List<Person> list = personMapper.queryAllPerson();//@@@@@
System.out.println("查询全部人"+list);
//查询某个人
Person person = personMapper.queryPerson(1);
System.out.println("查询某个人"+person);
//增加一个人
Person per1 = new Person(199,"太阳",34);
personMapper.insertPerson(per1);
list = personMapper.queryAllPerson();
System.out.println("查询全部人"+list);
//删除一个人
personMapper.deletePersonByid(199);
list = personMapper.queryAllPerson();
System.out.println("查询全部人"+list);
//修改一个人的信息
Person person4 =new Person(56,"aa",44);
personMapper.updatePersonByid(person4);
list = personMapper.queryAllPerson();
System.out.println("查询全部人"+list);
sqlSession.commit();
sqlSession.close();
}
优化
1. 属性文件。
实质:
从属性文件读取,数据库连接参数。
实现:
- 1.将数据库连接参数key,value对从conf.xml文件中剥离出来, 用db.properties文件保存,
- 2.在conf.xml中通过标签指明参数来源的文件为db.properties文件。便于后期管理。
db.properties文件:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/nftcdatabase1?serverTimezone=UTC
username=root
password=123
conf.xml
<configuration>标签下
<!-- @@@@@@指明数据库连接参数 的resource -->
<properties resource="db.properties"></properties>
<!-- 配置数据库信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" /><!-- @@@@@此处类似于EL表达式 -->
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
2. 全局参数设置
一般不需要设置,牵一发动全身。
设置方式:
3. 起别名:
实质:是给java中的类起别名,在需要写java全称类名的地方可以由别名代替**
-
实现步骤:
a.在conf.xml中通过标签<typeAliases>,起别名
b.在mapper.xml中就可以用类的别名代替 类全称类名。(且可以 忽略大小写 ) -
例子:如com.nftc.entity.Person 定义别名为Person,则person ,PERSON都可以代替com.nftc.entity.Person,即mapper.xml中resultType=“com.nftc.entity.Person”,可以写成resultType="Person"或resultType=“PERSON”。
<!-- 配置一个或多个别名 -->
<typeAliases>
<!-- 定义一个别名 -->
<!-- <typeAlias type="com.nftc.entity.Person" alias="Person" />-->
<!-- 批量定义别名,mybatis自动将包内所有类,都起别名,即全类名 都 可以用 类名代替 -->
<package name="com.nftc.entity"/>
</typeAliases>
- mybatis常见内置的 java类的别名。
下图中映射的类型即 java中的变量的类型, 都可以用别名 来代替。
4. 类型处理器(类型转换器)
java中变量的类型和数据库中的字段的类型可以不一样。
实质:实现java中变量的类型和数据库字段类型(jdbc类型)的转换
- MyBatis自带一些常见的类型处理器(可以自动转换)
java类型- 数据库类型:
int - NUMBER(oracle中的数值类型)
String - CHAR/VARCHAR
2. 自定义MyBatis类型处理器
实现自定义的类型转换
java变量类型 -数据库(jdbc类型)
示例:从上表可知 java中的 变量类型Boolean 和 jdbc类型INTEGRE, 没有内置类型处理器,无法匹配,需要手动匹配
实体类Person: 变量类型Boolean 变量名sex
true:表示男
false:表示女
表student: jdbc类型INTEGRE 字段名sex
1:表示男
0:表示女
实质:
在执行sql语句之前,通过类型转换器setXXX方法, 将要传给sql语句的参数, 按照自定义规则转换成 ,数据库表中 的字段值。
在执行sql语句之后,通过类型转换器的getXXX方法,对 结果集ResultSet 中的 字段值,按照自定义规则 转换为, 实体类变量值。
- 自定义类型转换器(Boolean -INTEGER)实现步骤:
a.创建转换器:需要实现TypeHandler接口
通过阅读源码发现,此接口有一个实现类 BaseTypeHandler ,因此 要实现转换器有2种选择:
i.实现接口TypeHandler<T>接口
ii.继承BaseTypeHandler<T>,实现接口方法(T 为java变量的类型)
b.配置conf.xml
c.执行sql语句是,仍然是调用Mapper接口的 方法。
A .类型转换器:
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
throws SQLException {
if(parameter == true) {
ps.setInt(i, 1);
}else {
ps.setInt(i, 0);
}
}
@Override
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
if( rs.getInt(columnName) == 1) {
return true;
}else return false;
}
@Override
public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
if( rs.getInt(columnIndex) == 1) {
return true;
}else return false;
}
@Override
public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
if( cs.getInt(columnIndex) == 1) {
return true;
}else return false;
}
}
对BaseTypeHandler中 要实现方法的解析:
B . conf.xml配置,
在标签里边写:
handler : 类型转换器的 全称类名
javaType :要转换的java变量类型
jdbcType :jdbc中的类型(数据库字段类型) (坚持大写)
如:
<!-- 注册写好的类型转换器 -->
<typeHandlers>
<typeHandler handler="com.nftc.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>
- 需要注意的问题: 在要写数据库(jdbc)类型的地方,坚持大写 ,INTEGER
C. XxxMapper.xml中,将resultType改为resultMap,在resultMap标签中,javaType,jdbcType,typeHandler配置 类型转换。
<!-- 查询一个人 -->
<select id="queryPerson" resultMap="personMapping" parameterType="int">
select * from person where id= #{id} <!-- 此处的#{id}表示占位符(要和实体类中的属性名字相同) -->
</select>
<resultMap type="Person" id="personMapping">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="sex" column="sex" javaType="Boolean" jdbcType="INTEGER" typeHandler="com.nftc.converter.BooleanAndIntConverter"/>
</resultMap>
解释:
总结:
resultMap可以实现2个功能:
1.属性-字段的映射关系
property column
2. 类型转换
javaType,jdbcType,typeHandler
只需写一个 resultMap,其他的都可以识别出来。
也可以 在 需要转换地方 ,用javaType,jdbcType表示出来。
如: