类型转换、动态排序,查询接口与mapper对应关系说明及其注意事项


一、MyBatis 自带写常见类型转换器。例如:java 类中 String 对应 mySQL中的varchar

二、自定义类型转换器

如java类中的true对应数据库字段 1,java中 false对应数据库中0。(数据的数值类型需与java类中boolean定义一个一致性约束对应关系)

实例:定义java类为Person ,sex数据类型为boolean,数据库定义类型为 int。这种情况需要自定义类型转换器


三、注意事项:

1、接口方法名和mapper.xml文件中标签的id相同
2、接口该方法的输入参数和mapper.xml文件中标签的parameterType相同
3、接口该方法的返回值和mapper.xml文件中标签的resultType相同
除了以上约定,要实现接口中方法和mapper.xml 中的SQL标签一一对应,还需要以下两点:
1、namespace的值,就是接口的全类名(接口 <---> mapper.xml 一一对应)
人为习惯:
1、SQL映射文件(mapper.xml)和接口放在同一个package下
四、${} 与 #{}【区别】:
第一点:
#{任意值}
${value} ,其中的标识只能是value
第二点:
#{} 作为参数自动会给string类型添加上''(自动类型转换)
${} 原样输出,适合于动态排序字段
作为查询以下两种情况等价:
select id,name,age from t_person_01 where name=#{value}
select id,name,age from t_person_01 where name='${value}'
动态排序:
select id,name,age,sex from t_person_01 ORDER BY ${value} ASC
第三点:
#{} :防止SQL注入
${} : 不防止
【相同点】:
parameterType 为对象类型
#{属性名}
${属性名}
五、实例举例:

1、配置文件 mybatis-03.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>
<!-- 转换器 -->
<typeHandlers>
<!-- 把java类的boolean类型转换数据 int,数据库int转换为java类的boolean类型 -->
<typeHandler handler="com.mybatis03.util.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis01"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- jack.zhao 加载映射文件 -->
<mapper resource="com/mybatis03/mapper/personMapper.xml"/>
</mappers>
</configuration>

2、类型转换器

package com.mybatis03.util;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /**
* @author :jack.zhao
* @Describe: 类型转换器(BaseTypeHandler<Boolean> java 类型)
* @date :2021-10-16 22:55
*/
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean> { /**
* java(boolean) ----> int (java 类属性映射到数据库)
* @param ps preparedStatement 参数对象
* @param i preparedStatement 对象操作位置
* @param aBoolean java值
* @param jdbcType jdbc 操作数据库类型值
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException { if(aBoolean){ ps.setInt(i,1);
} else {
ps.setInt(i,0);
}
} /**
* db(int) --------->java(boolean) (数据库映射java类属性)
* @param resultSet
* @param columnName
* @return
* @throws SQLException
*/
@Override
public Boolean getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
int sexNum = resultSet.getInt(columnName);
return sexNum ==1 ? true:false;
} @Override
public Boolean getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
int sexNum = resultSet.getInt(columnIndex);// 位置
return sexNum ==1 ? true:false;
} @Override
public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}

3、实体类

package com.mybatis03.bean;

/**
* @author :jack.zhao
* @Describe: 实体类
* @date :2021-10-16 22:55
*/
public class Person {
private int id;
private String name;
private int age;
private Boolean sex; public Person() {
} public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
} public Person(int id, String name, int age, Boolean sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
} public Boolean getSex() {
return sex;
} public void setSex(Boolean sex) {
this.sex = sex;
} 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 "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}

4、操作数据库接口类

package com.mybatis03.mapper;

import com.mybatis03.bean.Person;

import java.util.List;

/**
* @author :jack.zhao
* @Describe: 操作mybatis接口
* @date :2021-10-16 22:55
*/
public interface PersonMapper {
void delStudentById(int id);
void updateStudentById(Person person);
Person queryPersonByName(String strName);
List<Person> queryPersonOrderByColumn(String strColumn);
List<Person> queryListPersonBypersonsexWithConverter(int id);
void addPersonWithConverter(Person person);
List<Person> queryPersonByAgeAndName(Person person);
}

5、测试类

package com.mybatis03.test;

import com.mybatis03.bean.Person;
import com.mybatis03.mapper.PersonMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test; import java.io.Reader;
import java.util.List; /**
* @author :jack.zhao
* @Describe: 测试类
* @date :2021-10-16 22:55
*/
public class test03 { // 查询集合信息(带转换器)
@Test
public void selectList() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
List<com.mybatis03.bean.Person> personList = personMapper.queryListPersonBypersonsexWithConverter(1001);
System.out.println("查询所有人员信息为:"+personList);
session.close();
} // 增加人员信息(带转换器)
@Test
public void addPerson() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
Person person = new Person(1008,"wangwu",29,true);
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
personMapper.addPersonWithConverter(person);
session.commit(); // 因为配置的是JDBC方式需要手动执行commit操作
System.out.println("添加人员信息成功!");
session.close();
} // 根据ID删除指定信息
@Test
public void delPesonByID() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
personMapper.delStudentById(1008);
session.commit(); // 因为配置的是JDBC方式需要手动执行commit操作
System.out.println("删除人员信息成功!");
session.close();
} // 修改人员信息
@Test
public void updateStudentById() throws Exception{
Person person = new Person(1008,"chenjiu",36,false);
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
personMapper.updateStudentById(person);
session.commit(); // 因为配置的是JDBC方式需要手动执行commit操作
System.out.println("修改人员信息成功!");
session.close();
} // 根据名称查询人员信息
@Test
public void selectListByName() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = personMapper.queryPersonByName("chenjiu");
System.out.println("查询所有人员信息为:"+person);
session.close();
} // 查询所有人员信息,然后根据传入的字段进行排序(动态排序)
@Test
public void queryPersonOrderByColumn() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
List<Person> personList = personMapper.queryPersonOrderByColumn("id");
System.out.println("查询所有人员信息为:"+personList);
session.close();
} @Test
public void queryPersonByAgeAndName() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-03.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession();
Person person = new Person();
person.setAge(28);
person.setName("%ch%");
// 动态代理
PersonMapper personMapper = session.getMapper(PersonMapper.class);
List<Person> personList = personMapper.queryPersonByAgeAndName(person);
System.out.println("查询所有人员信息为:"+personList);
session.close();
}
}

6、mapper文件内容

<?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">
<mapper namespace="com.mybatis03.mapper.PersonMapper"> <delete id="delStudentById" parameterType="int">
DELETE from t_person_01 where id =#{id}
</delete> <update id="updateStudentById" parameterType="com.mybatis03.bean.Person">
UPDATE t_person_01 SET NAME =#{name},age = #{age},sex=#{sex,javaType=boolean,jdbcType=INTEGER} where id =#{id}
</update>
<select id="queryPersonByName" parameterType="String" resultMap="personResult">
select
id,name,age,sex
from
t_person_01
where
name ='${value}' </select> <!-- 查询使用类型转换器
1、如果类中属性和表中字段能够合理匹配(string-varchar),则可以使用resultType;否则(boolean-int)使用resultMap
2、如果类中属性名和表中字段名能够合理匹配(personNo-personsNo),则可以使用resultType;否则(id-personNo)使用resultMap
where
id=#{id}
-->
<select id="queryListPersonBypersonsexWithConverter" parameterType="int"
resultMap="personResult">
select
id,name,age,sex
from
t_person_01 </select> <insert id="addPersonWithConverter" parameterType="com.mybatis03.bean.Person">
INSERT INTO t_person_01(id,name,age,sex) VALUES (#{id},#{name},#{age},#{sex,javaType=boolean,jdbcType=INTEGER})
</insert>
<resultMap type="com.mybatis03.bean.Person" id="personResult">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="sex" column="sex" javaType="boolean" jdbcType="INTEGER"/>
</resultMap> <!-- 动态排序 -->
<select id="queryPersonOrderByColumn" parameterType="String" resultMap="personResult">
select
id,name,age,sex
from
t_person_01
ORDER BY ${value} ASC
</select> <select id="queryPersonByAgeAndName" parameterType="com.mybatis03.bean.Person" resultMap="personResult">
<!--
select
id,name,age,sex
from
t_person_01
where age = #{age} or name like #{name}
--> <!-- 上下的sql语句等价 -->
select
id,name,age,sex
from
t_person_01
where age = #{age} or name like '%${name}%'
</select>
</mapper>

数据库测试数据:

创建数据库sql语句:

mybatis 操作数据库(05)的更多相关文章

  1. JAVA - SpringBoot项目引用MyBatis操作数据库

    JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...

  2. MyBatis操作数据库(基本增删改查)

    一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...

  3. 通过MyBatis操作数据库

    MyBatis是一款优秀的持久层框架,同样也是做OR Mapping的.与JPA不同,MyBatis里面需要我们自己来定制sql. MyBatis和JPA的选择 其实如果业务比较操作比较简单使用JPA ...

  4. spring-boot-route(八)整合mybatis操作数据库

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  5. Mybatis 操作数据库的主键自增长

    本篇文章将研究mybatis 实现oracle主键自增的机制 首先我们看对于同一张student表,对于mysql,sql server,oracle中它们都是怎样创建主键的 在mysql中 crea ...

  6. 非Spring环境下使用Mybatis操作数据库的流程

    准备工作 1,  导入mybatis-3.2.7.jar,mysql-connector-5.1.25-bin.jar两个jar包 2,  在数据库中创建一个db_test数据库,库中有一个表为use ...

  7. mybatis操作数据库

    导入jar包 共13包 注意:mysql-connction的版本是5.1.7版低版本可能不行 2.编写配置文件 a. 配置连接数据库的文件 a.1创建数据库 user表 a.2配置文件目录 a.2. ...

  8. SpringBoot-(9)-MyBatis 操作数据库

    这里仅仅以插入数据为例: 一, 创建基于MyBatis的项目 具体流程参考之前帖 二,创建Mapper接口 public interface AccountMapper { @Insert(" ...

  9. SpringBoot 整合Mybatis操作数据库

    1.引入依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...

随机推荐

  1. 类的基础语法阅读【Python3.8官网文档】

    英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...

  2. golang context包

    go context标准库 context包在Go1.7版本时加入到标准库中.其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据.其具体作用为: 可以通过context发送取 ...

  3. vue 引入 echarts 图表 并且展示柱状图

    npm i echarts -S 下载 echarts 图表 mian.js 文件 引入图表并且全局挂载 //echarts 图表 import echarts from 'echarts' Vue. ...

  4. shell循环语句until

    until 条件 do 执行命令 done until 循环与 while 循环在处理方式上刚好相反. 当条件成立的时候,停止循环.

  5. 20210719 noip20

    考场 后两题是原题,教练说不用写了(ycx 不讲武德) T1 先手模了 \(n\le5\) 的情况,尝试找规律失败.那就只能 DP 了,最终没搞出来. 记忆化搜索打了 \(n\le20\) 的表,交了 ...

  6. Stream流方法引用

    一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...

  7. FastDFS 配置 Nginx 模块及访问测试

    #备注:以下nginx-1.10.3源码目录根据nginx版本号不同会有相应的变化,以nginx版本号为准#一.安装 Nginx 和 fastdfs-nginx-module1,安装 Nginx 请看 ...

  8. 离散化模板题 II ——重复元素离散化后的数字不相同

    离散化模板题 II --重复元素离散化后的数字不相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字不相同. 输入 第一行 ...

  9. 安卓使用讯飞sdk报错

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.iflytek.cloud.SpeechSy ...

  10. mybatis一对一联表查询的两种常见方式

    1.一条语句执行查询(代码如下图)  注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...