类型转换、动态排序,查询接口与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. mysql switch语句

    SELECT CASE the_order_status WHEN 4 THEN '待收货' WHEN 5 THEN '已收货' ELSE '其他' END AS statuss ,order_id ...

  2. Red Hat Enterprise Linux 7.2修改主机名(hostname)

    Red Hat Enterprise Linux 7.2在安装的时候,会默认生成主机名:localhost. 那么如何修改成自己想要的自己名? //格式为:用户名@主机名 比如: [root@loca ...

  3. JS 根据文件路径获取名字和后缀名

    var fileName = this.from.doc.substring(this.from.doc.lastIndexOf('/')+1); //文件名           var extNam ...

  4. MySQL(二)——常用命令

    一.MySQL服务器1.介绍安装服务:mysqld -install停止服务:net stop mysql启动服务:net start mysql用户名:root,密码:Password,连接数据库: ...

  5. 通过cglab 实现 Spring AOP

    1新建一个目标类 public class StudentService { public void delete(){ System.out.println("删除学生"); } ...

  6. 2021.9.12周六PAT甲级考试复盘与总结

    周六PAT甲级考试复盘与总结 先说结论:仍未步入"高手"行列:现在的学习节奏与方法是对的,有十万分的必要坚持下去. 题目 知识点 分数 T1 前缀和.二分 11 / 20 T2 排 ...

  7. JDK7u21反序列化详解

    目录 前言 环境 倒序分析 TemplatesImpl AnnotationInvocationHandler HashMap 总结 前言 听说jdk7u21的反序列化涉及的知识量很多,很难啃,具体来 ...

  8. Typora + PicGo做个人知识库

    最近在做个人知识库,考察了一圈各种平台和工具,发现还是直接用文件系统管理Markdown文件更符合我当前的需求.以Markdown文件作为文字载体,以文件目录作为分类结构,承载以计算机知识为主的学习笔 ...

  9. SQLSERVER存储过程基础

    SQLSERVER存储过程基础 1.声明变量 DECLARE     @F001  SMALLINT,  (三元素,声明declare+变量名+类型) @F002  INTEGER, @F003  V ...

  10. 异步servlet的原理探究

    异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...