目录
前言
一、力扣打卡
二、Mybatis继续学习
1. MyBatis的Dao层实现
1.1 传统开发方式
1.2 代理开发方式
2. MyBatis的映射文件的深入
2.1 动态Sql语句
2.2 myBatis核心配置文件的深入
总结
好好学习!
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
public List> fourSum(int[] nums, int target) {
if (nums == null || nums.length < 4)
return new ArrayList<>();
Arrays.sort(nums);
List> res = new ArrayList<>();
// O(n^3)
for (int i = 0; i < nums.length - 3; i++) {
// 忽略后面与前面重复的元素
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < nums.length - 2; j++) {
// 忽略后面与前面重复的元素
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
int partSum = nums[i] + nums[j];
int left = j + 1;
int right = nums.length - 1;
while (left < right) {
int sum = partSum + nums[left] + nums[right];
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
while (left < right && nums[left] == nums[++left]);
while (left < right && nums[right] == nums[--right]);
}
}
}
}
return res;
}
1. 编写UserDao接口
UserMapper接口【也可以是UserDao】
package com.wxy.dao;
import com.wxy.domain.User;
import java.io.IOException;
import java.util.List;
public interface UserMapper {
public List findAll() throws IOException;
}
UserMapperImpl
package com.wxy.impl;
import com.wxy.dao.UserMapper;
import com.wxy.domain.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserMapperImpl implements UserMapper {
@Override
public List findAll() throws IOException {
// Resources.getResourceAsStream("sqlMapconfig.xml")
//配置核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("com.wxy.mapper/sqlMapperConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行操作
List userList = sqlSession.selectList("userMapper.findAll");
return null;
}
}
userMapper.xml映射文件
1. 代理开发方式的介绍
2. 实现过程
步骤一:namespace和mapper接口的全限定名相同
步骤二:mapper接口中的方法名和mapper.xml中的每个statement的id相同
步骤三:mapper接口中的输入参数要和mapper.xml中的paramType相同
步骤四:mapper接口的输出参数要和mapper.xml中的resultType相同
3. 实现代码
①编写接口UserDao
public interface UserDao(){
public List findAll();
}
②编写映射文件
③编写测试
public static void main(String[] args){
//配置核心文件
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapperConfig.xml");
//获得工厂方法
SqlSessionFactory sqlSessionFacy=new sqlSessionFactoryBulider().builder(resourceAsStream);
//获得Session会话对象
SqlSession sqlSession=sqlSessionFactry.openSession();
UserMapper mapper= sqlSession.getMapper(UserDao.class);
List list=mapper.findAll();
System.out.print(list);
}
1. 动态sql语句概述
Mybatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,此时在前面的学习中我们的SQL就不能满足要求了。
我们之前使用的是如下的方式:
但是这个存在一个不足就是当你的中间有一个变量没有给与初始值的时候就会报整个为空
【这里补充一个小的知识点】
Log4j根据日志信息的重要程度,分OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
Log4j官方建议实际实用的话,Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
2. 动态sql之
3.动态sql之
4. sql片段的抽取
select * from user
1. typeHandlers标签
①②
package com.wxy.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
import java.util.Date;
public class DateHandler extends BaseTypeHandler {
//负责将java类型转换为数据库需要的类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
long time = date.getTime();
preparedStatement.setLong(i,time);
}
//将数据库中的某些数据的类型转换为Java类型
//String参数 要转换的字段的名称
//ResultSet 查询出的结果集
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//获取结果集中需要的数据(long),将其转换为date类型并返回
long aLong = resultSet.getLong(s);
Date date=new Date(aLong);
return date;
}
//将数据库中的某些数据的类型转换为Java类型
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long aLong = resultSet.getLong(i);
Date date=new Date(aLong);
return date;
}
//将数据库中的某些数据的类型转换为Java类型
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long aLong = callableStatement.getLong(i);
Date date=new Date(aLong);
return date;
}
}
③
④
package com.wxy.test;
import com.wxy.domain.User;
import com.wxy.mapper.UserMapper;
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.Test;
import java.io.InputStream;
import java.util.Date;
public class MybatisTest {
@Test
public void test1() throws Exception{
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//创建user
User user =new User();
user.setId(4);
user.setUsername("hah");
user.setPassword("acd");
user.setBirthday(new Date());
//执行保存操作
mapper.save(user);
sqlSession.commit();
sqlSession.close();
}
}
2. plugins标签
①
com.github.pagehelper
pagehelper
3.7.5
com.github.jsqlparser
jsqlparser
0.9.1
②
③
@Test
public void test3() throws Exception{
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//设置分页的相关参数 当前页和每页显示的条数
PageHelper.startPage(1,2);
List userList = mapper.findAll();
for(User user:userList){
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
优化
@Test
public void test3() throws Exception{
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//设置分页的相关参数 当前页和每页显示的条数
PageHelper.startPage(1,2);
List userList = mapper.findAll();
for(User user:userList){
System.out.println(user);
}
//获得与分页相关的参数
PageInfo pageInfo=new PageInfo(userList);
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示条数:"+pageInfo.getPageSize());
System.out.println("总条数:"+pageInfo.getTotal());
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());
sqlSession.commit();
sqlSession.close();
}
}
每日美文
A person so long as has the willpower,can transcend his enviroment.
一个人只要有意志力,就可以超越他所处的环境
今天主要学习了Mybatis的代理开发以及mybatis映射文件和核心文件的深入
1. Mybatis的代理开发需要满足四个条件
①接口的全限定名为映射文件的namespace
②接口的方法名为映射文件的id
③接口的输出为映射文件的resultType
④接口的输入为映射文件的paramType
2. 映射文件的深入
这里主要讲了
select * from user
id=#{id}
#{id}
3. 核心配置文件的深入
这里主要讲了typeHandlers和plugins两个标签!
typeHanders步骤
①创建一个新的类继承BaseTypeHandler
②实现其中的四个方法
③添加核心配置文件(自定义注册类型处理器)
④编写测试类
plugins步骤
①导入坐标(jsqlparser和pagehander)
②配置插件
③配置测试类
最后测试类中的常用的语句(配置)
InputStream resourceAsStream=Resources.getResourceAsStream("核心配置文件路径");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBulider().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);