MyBatis(一)入门

MyBatis(一)

入门使用步骤;
基础方式Statement的增删改查CRUD;
mapper动态代理方式的crud (MyBatis接口开发)

入门使用步骤

概括:

  1. 导入MyBatis和MySQL的jar包。
  2. src下新建并配置conf.xml文件。(配置数据库驱动、连接、用户名、密码)
  3. 表 - 类, 类的映射文件。
  4. 执行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类型)转换

  1. 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表示出来。
如:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值