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 ...
随机推荐
- 104_Power Query 数据库条件查询
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载 1.应用场景 底层数据在数据库(sql server数据库,其他数据库同理,下文不再说明.)中,Excel中有查询的字段,需要 ...
- Navicat破解激活流程
Navicat Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL.MariaDB.MongoDB.SQL Server.Oracle.Postg ...
- IDEA初始化基础配置
0.前言 这篇博客是给认识的那帮新手搞的,刚进入IT行业的崽们 这个东西配置好了,也可以选择弄成在线文档,下一次安装IDEA时,有一个import导入配置,然后就可以自己配置好了( 虽然方便,但不建议 ...
- python 企业微信发送文件
import os import json import urllib3 class WinxinApi(object): def __init__(self,corpid,secret,chatid ...
- isprime
C++实现求素数个数 问题描述 求1~n的素数个数(例:n=10) 1 2 3 4 5 6 7 8 9 10 prime 2 3 5 7 not prime 1 4 6 8 9 10 素数又称质数.所 ...
- 使用JavaCV实现读取视频信息及自动截取封面图
概述 最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资料后发现网上这部分的内容非常少,于是就有了这篇文章. 视频 ...
- django框架8
内容概要 ajax简介 前后端传输数据编码格式 ajax发送json格式数据 ajax携带文件数据 回调机制处理策略 内容详情 ajax简介 页面不刷新的情况下可以与后端进行数据交互 异步提交 局部刷 ...
- java基础内存分配介绍
java内存分配介绍 栈 堆 方法区 本地方法栈 寄存器 方法区:字节码文件加载时进入的内存. 栈内存:方法运行时所进入的内存,变量也在这里. 堆内存:new出来的东西在这块内存中开辟空间并且 ...
- net core天马行空系列-可用于依赖注入的,数据库表和c#实体类互相转换的接口实现
1.前言 hi,大家好,我是三合.作为一名程序猿,日常开发中,我们在接到需求以后,一般都会先构思一个模型,然后根据模型写实体类,写完实体类后在数据库里建表,接着进行增删改查, 也有第二种情况,就是有些 ...
- 【Spring】AOP实现原理(二):Advisor获取
@EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...