mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化
MyBatis对象分析
- 测试代码示例
package com.example.test;
import com.example.pojo.Student;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class TestStudent {
@Test
public void testGetAll() throws IOException {
//使用文件流获取核心配置文件SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//取出sqlSession对象
SqlSession sqlSession = factory.openSession();
//完成查询操作
List<Student> list = sqlSession.selectList("wangxun.getAll");
list.forEach(System.out::println);
//关闭sqlSession
sqlSession.close();
}
@Test
public void testGetById() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
SqlSession sqlSession = factory.openSession();
//按主键查询
Student student = sqlSession.selectOne("wangxun.getById", 3);
System.out.println(student);
//关闭SqlSession
sqlSession.close();
}
@Test
public void testGetByName() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
SqlSession sqlSession = factory.openSession();
//按照姓名模糊查询
List<Student> students = sqlSession.selectList("wangxun.getByName", "三");
students.forEach(System.out::println);
//关闭SqlSession
sqlSession.close();
}
@Test
public void testInsert() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
SqlSession sqlSession = factory.openSession();
//插入数据
int num = sqlSession.insert("wangxun.insert", new Student("小涵", "0321@qq.com", 20));
//切记:在所有的增删改后,必须手动提交
sqlSession.commit();
if (num == 1) {
System.out.println("插入成功!");
}else{
System.out.println("插入失败!");
}
//关闭SqlSession
sqlSession.close();
}
@Test
public void testDelete() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//执行删除语句
int num = sqlSession.delete("wangxun.delete", 5);
sqlSession.commit();
if(num == 1){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
//关闭SqlSession
sqlSession.close();
}
@Test
public void testUpdate() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
SqlSession sqlSession = factory.openSession();
//执行更新语句
int num = sqlSession.update("wangxun.update", new Student(1, "小何", "hehe@qq.com", 20));
sqlSession.commit();
if(num == 1){
System.out.println("更新成功!");
}else{
System.out.println("更新失败!");
}
//关闭SqlSession
sqlSession.close();
}
}
- Resources类
- 解析SqlMapConfig,xml文件,创建出相应的对象
- InputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
- SqlSessionFactory接口
- DefaultSqlSessionFactory是其一个实现类
- ctrl + h 可以快捷查看本接口的子接口及其实现类
- SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
- DefaultSqlSessionFactory是其一个实现类
- SqlSession接口
- DefaultSqlSession是其一个实现类
测试代码简化
- 简化后的测试代码
package com.example.test;
import com.example.pojo.Student;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestStudent {
//SqlSession对象
SqlSession sqlSession;
//获取SqlSession对象
@Before
public void createSqlSession() throws IOException {
//使用文件流获取核心配置文件SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//取出sqlSession对象
sqlSession = factory.openSession();
}
//归还SqlSession对象
@After
public void closeSqlSession(){
sqlSession.close();
}
@Test
public void testGetAll() throws IOException {
//完成查询操作
List<Student> list = sqlSession.selectList("wangxun.getAll");
list.forEach(System.out::println);
}
@Test
public void testGetById() throws IOException {
//按主键查询
Student student = sqlSession.selectOne("wangxun.getById", 3);
System.out.println(student);
}
@Test
public void testGetByName() throws IOException {
//按照姓名模糊查询
List<Student> students = sqlSession.selectList("wangxun.getByName", "三");
students.forEach(System.out::println);
}
@Test
public void testInsert() throws IOException {
//插入数据
int num = sqlSession.insert("wangxun.insert", new Student("小涵", "0321@qq.com", 20));
//切记:在所有的增删改后,必须手动提交
sqlSession.commit();
if (num == 1) {
System.out.println("插入成功!");
}else{
System.out.println("插入失败!");
}
}
@Test
public void testDelete() throws IOException {
//执行删除语句
int num = sqlSession.delete("wangxun.delete", 5);
sqlSession.commit();
if(num == 1){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
@Test
public void testUpdate() throws IOException {
//执行更新语句
int num = sqlSession.update("wangxun.update", new Student(1, "小何", "hehe@qq.com", 20));
sqlSession.commit();
if(num == 1){
System.out.println("更新成功!");
}else{
System.out.println("更新失败!");
}
}
}
实体类别名注册
- 单个实体类起别名
<!-- 为实体类注册别名
注意标签的出现顺序
-->
<typeAliases>
<typeAlias type="com.example.pojo.Student" alias="student"/>
</typeAliases>
- 批量为实体类起别名
<typeAliases>
<!-- 包下的所有实体类自动起别名(规范):
别名是实体类类名的驼峰命名法
-->
<package name="com.example.pojo"/>
</typeAliases>
<!-- 例如:
com.example.pojo包下有实体类:Studnet
则使用到该实体类的sql标签可以如下表示:
-->
<select id="getAll" resultType="student">
select
id, name, email, age
from
student
</select>
设置日志输出
- 配置示例
<!-- 设置日志输出sql语句底层执行的代码-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
- 测试示例
package com.example.test;
import com.example.pojo.Student;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestStudent {
//SqlSession对象
SqlSession sqlSession;
//获取SqlSession对象
@Before
public void createSqlSession() throws IOException {
//使用文件流获取核心配置文件SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//取出sqlSession对象
sqlSession = factory.openSession();
}
//归还SqlSession对象
@After
public void closeSqlSession(){
sqlSession.close();
}
@Test
public void testGetAll() throws IOException {
//完成查询操作
List<Student> list = sqlSession.selectList("wangxun.getAll");
list.forEach(System.out::println);
}
}
/*
输出结果的部分:
Checking to see if class com.example.pojo.Student matches criteria [is assignable to Object]
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1806880779.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]
==> Preparing: select id, name, email, age from student
==> Parameters:
<== Columns: id, name, email, age
<== Row: 1, 小何, hehe@qq.com, 20
<== Row: 2, 李四, lisi@126.com, 21
<== Row: 3, 王五, wangwu@163.com, 22
<== Row: 4, 赵六, zhaoliun@qq.com, 24
<== Row: 6, 小涵, 0321@qq.com, 20
<== Total: 5
Student{id=1, name='小何', email='hehe@qq.com', age=20}
Student{id=2, name='李四', email='lisi@126.com', age=21}
Student{id=3, name='王五', email='wangwu@163.com', age=22}
Student{id=4, name='赵六', email='zhaoliun@qq.com', age=24}
Student{id=6, name='小涵', email='0321@qq.com', age=20}
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]
Returned connection 1806880779 to pool.
Process finished with exit code 0
*/
mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化的更多相关文章
- Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离
一.摘要 本篇博文将介绍自动化测试实现页面元素.页面对象及测试代码分离在自动化框架中的实现 二.解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性 ...
- 轻量级封装DbUtils&Mybatis之四MyBatis主键
MyBatis主键 不支持对象列表存储时对自增id字段的赋值(至少包括3.2.6和3.3.0版本),如果id不是采用底层DB自增主键赋值,不必考虑此问题 温馨提示:分布式DB环境下,DB主键一般会采用 ...
- 【Mybatis】MyBatis之缓存(七)
MyBatis缓存介绍 Mybatis 使用到了两种缓存:一级缓存(本地缓存.local cache)和二级缓存(second level cache). 一级缓存:基于PerpetualCache ...
- Mybatis+mysql批量插入性能分析测试
前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...
- Mybatis执行流程源码分析
第一部分:项目结构 user_info表:只有id和username两个字段 User实体类: public class User { private String username; private ...
- mybatis入门 配置文件解释 及测试
这里介绍一下mybatis 根据mybatis的官网说明,mybatis是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...
- myBatis 基础测试 表关联关系配置 集合 测试
myBatis 基础测试 表关联关系配置 集合 测试 测试myelipse项目源码 sql 下载 http://download.csdn.net/detail/liangrui1988/599388 ...
- MyBatis框架及原理分析
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 MyBatis的主要设计目的就 ...
- mybatis与spring的整合(代码实现)
mybatis与spring的整合(代码实现) 需要jar包: mybatis核心包:依赖包:log4j包:spring croe;beans;tx;aop;aspects;context;expre ...
随机推荐
- Layer Normalization和Batch Normalization
Layer Normalization 总览 针对同一通道数的图片的H*W进行层正则化,后面的γ和β是可以学习的参数,其中这两个的维度和最后一个的维度相同 例如特征图矩阵维度为[3, 577, 768 ...
- Python模块Ⅰ
Python模块Ⅰ part1 模块的定义/取别名 自定义模块 什么是模块:模块的本质就是.py文件,封装语句的最小单位 模块中出现的变量,for循环,if结构,函数定义...称为模块成员 模块的运行 ...
- 20212115 实验三 《python程序设计》实验报告
实验报告 20212115<python程序设计>实验三报告 课程:<Python程序设计>班级: 2121姓名: 朱时鸿学号:20212115实验教师:王志强老师实验日期:2 ...
- 背包,子集和以及 (max, +) 卷积在特殊情形下的求法
背包,子集和以及 (max, +) 卷积在特殊情形下的求法 子集和 1:总重量不太大 有 \(n\) 个物品,每个物品重量为 \(w_i\),且 \(\sum\limits_{i} w_i=C\).你 ...
- ARM学习1
ARM相关概念 1.ARM的发展史 1. 1978年,CPU公司 Cambridge processing Unit 2. 1979年 Acorn 3. 1985年, 32位,8MHz, 使用的精简指 ...
- React简单教程-6-单元测试
前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...
- CSS 网页字体最佳实践
一般在网页的字体设置中,可以将字体分类三类: 系统字体:使用系统自带的字体 兜底字体:当系统字体无法正常使用,而兜底的字体 Emoji 字体:显示网页中的表情字体 为了满足不同平台,以及 Emoji ...
- 认识弹性盒子flex
认识弹性盒子flex 来源:https://blog.xybin.top/2022/flex 1.定义弹性布局(父级上定义)display:flex; 如果说内核为webkit 的必须前面加上 -we ...
- sharepoint 配置失败,已引发类型为System.ArgumentException的异常。其他异常信息:domainName参数不支持指定的值。
解决方法:在域控制器中加入sharepoint计算机,设置为administrators组中
- Vue最新防抖方案
函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.举个栗子,持续触发scroll事件时,并 ...