Mybatis源码分析之(一)搭建一个mybatis框架(写一个mybatis的Demo)

数据库工作:

首先准备工作,安装mysql,并且新建一张t_demo表

CREATE TABLE `t_demo` (`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,`id` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;INSERT INTO `t_demo` VALUES ('name1', 1);
INSERT INTO `t_demo` VALUES ('name2', 2);
INSERT INTO `t_demo` VALUES ('name3', 3);

JAVA工作:

下面就是java中的事情了。LZ用的maven来构建项目的

下面是pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ahpu.wcj</groupId><artifactId>mybatisDemo</artifactId><version>1.0-SNAPSHOT</version><properties><!-- mybatis版本号 --><mybatis.version>3.4.2</mybatis.version></properties><dependencies><!--mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version></dependency></dependencies></project>
new SqlSessionFactoryBuilder().build();//这个使用mybatis的入口,其中要的参数是xml配置的输入流1

所以我们来配置一下mybatis的配置文件

mybatis.cfg.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><!-- 引入外部配置文件 --><properties resource="mysql.properties"></properties><environments default="default"><environment id="default"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper class="mapper.TDemoMapper"></mapper></mappers>
</configuration>

其中LZ引用了mysql.properties的资源,所以新建mysql.properties文件,是mysql的连接信息
mysql.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root1234

接下来我们要新建entity和mapper
TDemo

package entity;public class TDemo {int id;String name;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;}@Overridepublic String toString() {return "TDemo{" +"id=" + id +", name='" + name + '\'' +'}';}
}

TDemoMapper

package mapper;import entity.TDemo;import java.util.List;public interface TDemoMapper {List<TDemo> getAll();
}

最后新建mapper的映射文件

TDemoMapper.xml

<?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="mapper.TDemoMapper"><resultMap id="baseMap" type="entity.TDemo"><result property="id" column="id" jdbcType="INTEGER"></result><result property="name" column="name" jdbcType="VARCHAR"></result></resultMap><select id="getAll" resultMap="baseMap">select * from t_demo</select>
</mapper>

到这个,mybatis配置文件就建好了。接下来我们就要来使用mybatis了
新建MybatisUtil,这个是用来解析xml,拿到sqlsession的类
MybatisUtil

package util;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MybatisUtil {public static SqlSession getSqlsession(){SqlSessionFactory build = new SqlSessionFactoryBuilder().build(MybatisUtil.class.getClassLoader().getResourceAsStream("mybatis.cfg.xml"));return build.openSession();}}

最后测试一下是否搭建成功
Test

package test;import entity.TDemo;
import mapper.TDemoMapper;
import org.apache.ibatis.session.SqlSession;
import util.MybatisUtil;import java.util.List;public class Test {public static void main(String[] args) {SqlSession sqlsession = MybatisUtil.getSqlsession();TDemoMapper mapper = sqlsession.getMapper(TDemoMapper.class);List<TDemo> all = mapper.getAll();for (TDemo item : all)System.out.println(item);}
}
运行结果如下
----------------------------------
TDemo{id=1, name='name1'}
TDemo{id=2, name='name2'}
TDemo{id=3, name='name3'}

可以看到,确实从数据库里取出了数据。

这个整个项目的结构图
struct

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端开发 java_Java后端开发三年,你不得不了解的JVM

JAVA程序员&#xff0c;三年是个坎&#xff0c;如果过了三年你还没有去研究JVM的话&#xff0c;那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好&#xff1f;JVM是Java Virtual Machine(Java虚拟机)的缩写&#xff0c;也就是指的JVM虚拟机&#xff0c;属于是一种虚…

Mybatis源码分析之(二)根据配置文件创建SqlSessionFactory(Configuration的创建过程)

SqlSessionFactoryBuilder.build创建SqlSessionFactory&#xff08;粗略走一步流程&#xff09; 看完上篇文章后&#xff0c;你对mybatis应该有个大概的了解了&#xff0c;那么我们知道new SqlSessionFactoryBuilder().build是框架的入口&#xff0c;我们到SqlSessionFactoryB…

c++调用python接口作用是_利用Boost::Python实现C++调用python接口

利用Boost::Python实现C调用python接口2019年11月06日阅读数&#xff1a;7这篇文章主要向大家介绍利用Boost::Python实现C调用python接口,主要内容包括基础应用、实用技巧、原理机制等方面&#xff0c;希望对大家有所帮助。Boost.Python能将C的结构体暴露给Python使用。可是在运…

Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)

mybatis是怎么拿sqlSession 在 上一篇的时候&#xff0c;我们的SqlSessionFactoryBuilder已经从xml文件中解析出了Configuration并且返回了sessionFactory。 然后我们要从session;中拿到sqlSession public class DefaultSqlSessionFactory implements SqlSessionFactory {pr…

java中的位移_Java中的位移运算

在Java中&#xff0c;位移运算属于基本运算&#xff0c;符号是<>&#xff0c;即向左位移和向右位移。在Java中只有整数才能位移&#xff0c;所以其他的不考虑&#xff0c;位移运算是将整数在内存中表示的二进制进行位移&#xff0c;所以在Java中分为正数和负数的位移。对…

Mybatis源码分析之(四)mapper访问数据库的底层原理(代理方法中具体访问数据库的细节)

从之前的文章&#xff0c;我们知道了其实mapper真正执行的方法就下面的最后两行。&#xff08;以下所有的分析都基于一次mybatis的一次select查询。 MapperProxy类中的invoke函数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {i…

mysql count distinct case when_统计符合条件的去重过的数量 - - count distinct if case

现有表结构&#xff1a;CREATE TABLE example_dataset (id int(11) unsigned NOT NULL AUTO_INCREMENT,tel bigint(11) DEFAULT NULL,gender varchar(11) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;插入数据INSERT INTO example_da…

Mybatis源码分析之(六)mybatis拦截器(Interceptor)的实现原理

文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理&#xff0c;让你使用Mybatis拦截器更简单Invocation&#xff0c;让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言…

Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现

文章目录一级缓存二级缓存总结对于一名程序员&#xff0c;缓存真的很重要&#xff0c;而且缓存真的是老生常谈的一个话题拉。因为它在我们的开发过程中真的是无处不在。今天LZ带大家来看一下。Mybatis是怎么实现一级缓存和二级缓存的。(自带的缓存机制)一级缓存 存在BaseExecu…

oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?

Token 一定要放在请求头中吗&#xff1f; 答案肯定是否定的&#xff0c;本文将从源码的角度来分享一下 spring security oauth2 的解析过程&#xff0c;及其扩展点的应用场景。Token 解析过程说明当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token …

Map.getOrDefault()方法

default V getOrDefault(Object key, V defaultValue) {V v;return (((v get(key)) ! null) || containsKey(key))? v: defaultValue;}这是源码&#xff0c;意思就是当Map集合中有这个key时&#xff0c;就使用这个key对应的value值&#xff0c;如果没有这个key就使用默认值de…

java开发原则_java开发中,大家处理异常的原则是什么,是如何处理的?

展开全部最熟悉的陌生人&#xff1a;异常异常的类e5a48de588b63231313335323631343130323136353331333361326365型Throwable— Exception—- RuntimeException— Error需要注意的是&#xff0c;RuntimeException及其子类不需要在方法签名中显示注明异常抛出。例如&#xff1a;v…

java8合并两个Map

合并两个Map map自己的方法 实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中&#xff0c;代码如下所示&#xff0c;展示了两个 map 对象的合并&#xff0c;如果是多个 map 合并也是用这种方式。 public static void main(String[] args) {…

java 线程 spring_java中spring里实现多线程

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程的可使用ThreadPoolTaskExecutor来实现基于线程池的TaskExecutor在实际开发中由于多是异步&#xff0c;所以使用EnableAsync来支持异步任务&#xff0c;且要在Bean的方法中使用Async来声明其是一个异步任务?????…

java8 Map新增方法的使用

文章目录 文章目录文章目录java8 Map新增方法的使用概述1、compute()1、使用2、源码实现2、computeIfAbsent()1、使用2、源码3、computeIfPresent()4、merge()1、使用2、源码5、接下来简单介绍一下1.8之后Map添加的default方法map新增的方法&#xff1a;getOrDefaultforEachput…

java自动识别验证码_Java使用OCR技术识别验证码实现自动化登陆方法

活动介绍缘起是 GitChat 作者群有一位作者提出是否应该定期组织一些写作活动&#xff0c;活跃一下社区氛围&#xff0c;刚好 GitChat 内容组的小伙伴们也有这个想法&#xff0c;既然想法碰到一起&#xff0c;那就说做就做。既然是第一期&#xff0c;那么我们就定一个比较广的主…

出现503错误 怎么办

展开全部 出现503错误原因及解决办法 原因&#xff1a;web服务器不能处理HTTP请求&#xff0c;可能是临时超载或者是服务器进行维护。 解决办法&#xff1a;用户需要等待服务器的临时处理。在这种状态下&#xff0c;一些服务器可以简单的拒绝socket连接&#xff0c;否则会发…

sql语句优化总结 mysql_MySQL-SQL优化总结

转载:https://blog.csdn.net/qq_39390545/article/details/107020686理解SQL优化原理 &#xff0c;首先要搞清楚SQL执行顺序&#xff1a;SELECT语句 - 语法顺序:SELECTDISTINCT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT SELECT语句 - 执行顺序&#xff1a;FROM# 选取…

java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

java枚举类中字段有没有必要加final 今天在写一个系统统一返回码的枚举类时候&#xff0c;突然想到一个问题&#xff0c;当不小心手抖给枚举类自动生成了set方法&#xff0c;而恰巧在用的地方不小心用了set方法&#xff0c;从而修改了code值&#xff0c;由于枚举类是天然单例&a…

calcite连接mysql_calcite简单入门

1 介绍Apache Calcite是一款开源的动态数据管理框架&#xff0c;它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力&#xff0c;但不包括数据存储、处理数据的算法和存储元数据的存储库。Calcite 之前的名称叫做optiq&#xff0c;optiq 起初在 Hive 项目中&#xf…