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方法(测试)

posted @   挑战者V  阅读(287)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示