目录
一、动态sql语句编写
1.1 标签介绍
2、简单示例
二、自定义类型转换器typeHandler学习
1、自定义类型转换器typeHandler的原因与步骤:
2、 自定义示例 (将DATE类型的数据转换为时间戳存储到数据库中)
3、 在MyBatis核心配置文件中进行注册
三、pageHelper插件的使用
1、在pom.xml导入坐标
2、在MyBatis核心配置文件中进行注册
3、调用pageHelper
4、分页结果展示
1.1.1 if标签
if标签通常用于WHERE语句、UPDATE语句、INSERT语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。
1.1.2 chose标签
MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。
属性介绍:
collection:collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合。
item :表示在迭代过程中每一个元素的别名
index :表示在迭代过程中每次迭代到的位置(下标)
open :前缀
close :后缀
separator :分隔符,表示迭代时每个元素之间以什么分隔
1.1.3 where标签
用于替换where 1=1的标签
1.1.4 set 标签
当在update语句中使用if标签时,如果最后的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置set关键字,和剔除追加到条件末尾的任何不相关的逗号。
1.1.5 trim标签
trim标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能。
属性介绍:
prefix:前缀覆盖并增加其内容
suffix:后缀覆盖并增加其内容
prefixOverrides:前缀判断的条件
suffixOverrides:后缀判断的条件
2.1 pojo类:User
private int id;
private int age;
private String username;
private Date birthday;
2.2 Usermapper接口
public interface UserMapper {
/**
* 根据条件查用户(where if 标签)
* @param user
* @return
*/
public User findUser1(User user);
/**
* 根据条件查用户(where choose、when、otherwise 标签)
* @param user
* @return
*/
public User findUserByCondition2(User user);
/**
* 根据条件查用户(trim 标签)
* @param user
* @return
*/
public User findUserByCondition3(User user);
/**
* 根据多个id查询用户(foreach标签)
* @param ids
* @return
*/
public List findUsersByIds(List ids);
/**
* 批量插入user(foreach标签)
* @param users
*/
public void insertUserList(List users);
/**
* 查询所有用户,演示pageHelper插件
* @return
*/
public List findAll();
/**
* 更新用戶set标签
* @param user
*/
public void updateUser(User user);
}
2.3 sql语句的抽取与引用
抽取:
引用:
2.4 Usermapper.xml实现
select * from user
insert into user (username, age, birthday)
values
(#{user.username}, #{user.age}, #{user.birthday})
update user
username=#{username},
age=#{age},
birthday=#{birthday}
where id=#{id}
2.5 如果想sql语句在控制台打印出来在mybatis核心配置文件中加入
2.6测试文件
public class UserTest {
private UserMapper userMapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config2");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
userMapper=sqlSession.getMapper(UserMapper.class);
}
//根据多个id批量查询用户
@Test
public void findUsersByIds(){
List integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
List users = userMapper.findUsersByIds(integers);
for (User user : users) {
System.out.println(user.toString());
}
}
}
Mybatis已经提供了默认的类型处理器,最基本的类型已经有内置的
可以自己处理不支持的或非标准的类型。具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个JDBC类型。
开发步骤:
1、定义转换类继承类BaseTypeHandler
2、覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时 mysql的字符串类型转换成 java的Type类型的方法
3、在MyBatis核心配置文件中进行注册
4、测试转换是否正确
public class MyDateTypeHandler extends BaseTypeHandler {
//将Java类型转换为java类型
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
//获得时间戳
long time = parameter.getTime();
//i 为参数序号
ps.setLong(i, time);
}
//将数据库类型转换为java类型
//String columnName 要转换的字段名称
//ResultSet rs查询出的结果集 虚拟机会根据不同的场合调用不同的方法 ,后面三个返回值相同
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
//获取结果集中的时间戳数据转换为Date
long time = rs.getLong(columnName);
Date date = new Date(time);
return date;
}
//将数据库类型转换为java类型
@Override
public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
long time = rs.getLong(columnIndex);
Date date = new Date(time);
return date;
}
//将数据库类型转换为java类型
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
long time = cs.getLong(columnIndex);
Date date = new Date(time);
return date;
}
}
com.github.pagehelper
pagehelper
5.0.2
com.github.jsqlparser
jsqlparser
0.9.5
@Test
public void finAll(){
//设置分页相关参数,当前页+每页显示条数
PageHelper.startPage(3,3);
List all = userMapper.findAll();
for (User user : all) {
System.out.println(user.toString());
}
//获取分页相关参数
PageInfo pageInfo=new PageInfo(all);
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示条数:"+pageInfo.getPageSize());
System.out.println("总条数:"+pageInfo.getSize());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("上一页:"+pageInfo.getPrePage());
System.out.println("下一页:"+pageInfo.getNextPage());
System.out.println("是否是第一个:"+pageInfo.isIsFirstPage());
System.out.println("是否是最后一个:"+pageInfo.isIsLastPage());
}