mybatis 操作数据库(05)
类型转换、动态排序,查询接口与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)的更多相关文章
- JAVA - SpringBoot项目引用MyBatis操作数据库
JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...
- MyBatis操作数据库(基本增删改查)
一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...
- 通过MyBatis操作数据库
MyBatis是一款优秀的持久层框架,同样也是做OR Mapping的.与JPA不同,MyBatis里面需要我们自己来定制sql. MyBatis和JPA的选择 其实如果业务比较操作比较简单使用JPA ...
- spring-boot-route(八)整合mybatis操作数据库
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- Mybatis 操作数据库的主键自增长
本篇文章将研究mybatis 实现oracle主键自增的机制 首先我们看对于同一张student表,对于mysql,sql server,oracle中它们都是怎样创建主键的 在mysql中 crea ...
- 非Spring环境下使用Mybatis操作数据库的流程
准备工作 1, 导入mybatis-3.2.7.jar,mysql-connector-5.1.25-bin.jar两个jar包 2, 在数据库中创建一个db_test数据库,库中有一个表为use ...
- mybatis操作数据库
导入jar包 共13包 注意:mysql-connction的版本是5.1.7版低版本可能不行 2.编写配置文件 a. 配置连接数据库的文件 a.1创建数据库 user表 a.2配置文件目录 a.2. ...
- SpringBoot-(9)-MyBatis 操作数据库
这里仅仅以插入数据为例: 一, 创建基于MyBatis的项目 具体流程参考之前帖 二,创建Mapper接口 public interface AccountMapper { @Insert(" ...
- SpringBoot 整合Mybatis操作数据库
1.引入依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...
随机推荐
- 类的基础语法阅读【Python3.8官网文档】
英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...
- golang context包
go context标准库 context包在Go1.7版本时加入到标准库中.其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据.其具体作用为: 可以通过context发送取 ...
- vue 引入 echarts 图表 并且展示柱状图
npm i echarts -S 下载 echarts 图表 mian.js 文件 引入图表并且全局挂载 //echarts 图表 import echarts from 'echarts' Vue. ...
- shell循环语句until
until 条件 do 执行命令 done until 循环与 while 循环在处理方式上刚好相反. 当条件成立的时候,停止循环.
- 20210719 noip20
考场 后两题是原题,教练说不用写了(ycx 不讲武德) T1 先手模了 \(n\le5\) 的情况,尝试找规律失败.那就只能 DP 了,最终没搞出来. 记忆化搜索打了 \(n\le20\) 的表,交了 ...
- Stream流方法引用
一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...
- FastDFS 配置 Nginx 模块及访问测试
#备注:以下nginx-1.10.3源码目录根据nginx版本号不同会有相应的变化,以nginx版本号为准#一.安装 Nginx 和 fastdfs-nginx-module1,安装 Nginx 请看 ...
- 离散化模板题 II ——重复元素离散化后的数字不相同
离散化模板题 II --重复元素离散化后的数字不相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字不相同. 输入 第一行 ...
- 安卓使用讯飞sdk报错
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.iflytek.cloud.SpeechSy ...
- mybatis一对一联表查询的两种常见方式
1.一条语句执行查询(代码如下图) 注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...