MyBatis原理简介和小试牛刀
在我看来mybatis的原理与hibernate在某些方面是一致的,先回顾一下Hibernate原理(原理主要上是要掌握并理解下列六个对象:
Hibernate中重要的六个对象:
Configuration:读取配置文件(主要指hibernate-config.xml)和启动hibernate
SessionFactory:负责初始化Hibernate
Session接口:负责持久化对象的CRUD的操作
Transaction:负责事务(opensession或getCurrentSession)
补充说明:
opensession和getCurrentSession的主要区别是:openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定的session对象
Query接口和Criteria接口:负责执行各种数据库查询
MyBatis和Hibernate的共同点都是通过SqlSessionFactory创建Session,以此达到Session操作数据库的目的。
MyBatis小试牛刀步骤:
一、导包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 导包: asm- 3.3 . 1 .jar cglib- 2.2 . 2 .jar commons-logging- 1.1 . 1 .jar javassist- 3.17 . 1 -GA.jar log4j- 1.2 . 17 .jar log4j-api- 2.0 -rc1.jar log4j-core- 2.0 -rc1.jar mybatis- 3.2 . 7 .jar mysql-connector-java- 5.1 . 7 -bin.jar slf4j-api- 1.7 . 5 .jar slf4j-log4j12- 1.7 . 5 .jar 其中 mybatis- 3.2 . 7 .jar mysql-connector-java- 5.1 . 7 -bin.jar 这两个是必须的缺一不可 |
二、写主配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <? 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 > < environments default="development"> < environment id="development"> < transactionManager type="JDBC"/>< br > <!--数据源 但是在整合中不再需要这样写了,具体可参照ssm整合和ajax这篇文章--> < dataSource type="POOLED"> < property name="driver" value="com.mysql.jdbc.Driver"/> < property name="url" value="jdbc:mysql://localhost:3306/crm"/> < property name="username" value="root"/> < property name="password" value="1234"/> </ dataSource > </ environment > </ environments > < mappers > <!-- 主要读取sql映射文件 --> < mapper resource="com/blog/entity/Mapper.xml"/> </ mappers > </ configuration > |
三、建立实体类
package com.blog.entity; public class User { private Integer Id; private String userName; private String password; public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
四、写Dao
package com.blog.dao; import java.io.FileNotFoundException; import java.io.FileReader; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class BaseDao { //BaseDao的目的在于实现类通过继承该类而达到操作数据库的目的 public static SqlSessionFactory getSSF(){ String resource="D:\\eclipse_maven\\workspace\\MyBatis\\src\\mybatis.conf.xml"; FileReader fr; try { fr = new FileReader(resource); SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(fr); return ssf; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } //查的方面可以通过BaseDao调用它,增删改对数据库中的数据库有改动则不能使用它,
//即便使用了,也达不到相应的效果 public static SqlSession getSqlSession(){ return getSSF().openSession(); } //增删改需要它,凡是对数据库有改动的都需要提交事务,提交事务要将opensession设置为true,true为提交事务,
、 //opensession通常默认是false public static SqlSession getSqlSession(boolean autoCommit){ return getSSF().openSession(autoCommit); } }
五、写映射文件
1 2 3 4 5 6 7 8 9 10 | <? 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"> //namespace:命名空间< br >//parameterType:参数类型< br >//resultMap:返回值类型< br > < select id="selectById" parameterType="Integer" resultType="com.blog.entity.User"> select * from `user1` where Id=#{Id} </ select > < br >< br ></ mapper > |
六、写接口
1 2 3 4 5 6 7 8 9 10 11 | package com.blog.dao; import com.blog.entity.User; public interface UserDao { //查询 User selectById(Integer Id); } |
七、写接口的实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.blog.dao.impl; import com.blog.dao.BaseDao; import com.blog.dao.UserDao; import com.blog.entity.User; public class UserDaoImpl extends BaseDao implements UserDao { @Override public User selectById(Integer Id) { /**<br> 通过getSqlSession()调用增insert()、delete()、update()、selectOne()、<br> selectList()等方法,它们都有共同的两个参数,一个对应Mappper.xml文件中的nam<br> espace和id,一定要对应,否则会报错。<br> */ return BaseDao.getSqlSession().selectOne( "Mapper.selectById" ,Id); } public static void main(String[] args) { User user= new UserDaoImpl().selectById( 1 ); System.out.println(user); } } |
八、运行实现类中的main方法(测试)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述