当前位置: 首页 > news >正文

mybatis学习总结

 

根据bilibili https://www.bilibili.com/video/av17774929/ 视频学习总结

 

1. mybatis学习线路

 

2. 元素JDBC存在的问题

原生JDBC代码

package dal;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    
    
    static{
        //try{
            /*String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/checkprojectdb";
        String username = "root";
        String password = "980420";*/
            
            Properties p = new Properties();
            try{
                //通过相对路径加载文件
                String path = (Thread.currentThread().getContextClassLoader().getResource("").getFile()).substring(1);
                path=java.net.URLDecoder.decode(path, "utf-8");
                path=path.replace('/', '\\');
                path=path.replace("file:", "");
                path=path.replace("classes\\", "");
                path+="classes/dal/db.properties";
                p.load(new FileInputStream(new File(path)));
                //用getProperties方法通过关键字获取信息
                driver = p.getProperty("driver");
                url = p.getProperty("url");
                username = p.getProperty("username");
                password = p.getProperty("password");
            //}
                Class.forName(driver);
        }catch (Exception e) {
            // TODO: handle exception
            System.out.println(driver +" " + url + " " + username +" " + password );
            throw new ExceptionInInitializerError(e);
        }
    }
    
    public static Connection getConnection() throws SQLException, ClassNotFoundException{
        return DriverManager.getConnection(url, username, password);
    }
    
    public static void release(Connection conn, Statement st, ResultSet rs){
        if(rs != null){
            try{
                rs.close();
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
            rs = null;
        }
        
        if(st != null){
            try{
                st.close();
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
            st = null;
        }
        
        if(conn != null){
            try{
                conn.close();
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
            conn = null;
        }
    }
    
    public static void main(String[] args) {
        System.out.println(driver + "; " + username + "; " + password + "; " + url);
    }
}
JdbcUtils
  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
  3. 用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
  4. 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便

3. mybatis简介

3.1 什么是 MyBatis ?

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

  MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

  MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,

    将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  官方文档介绍

3.2 mybatis框架原理

 

 

4. 开发DAO的方法(文件配置)

SqlSession使用范围——
1.SqlSessionFactoryBuilder
  通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
  将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。
  在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

2. SqlSessionFactory
  通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。

3.SqlSession
  SqlSession是一个面向用户(程序员)的接口。
  SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)
  SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
  SqlSession最佳应用场合在方法体内,定义成局部变量使用。

4.1 原始dao开发方法(程序员需要写dao接口和dao实现类)

程序员需要写dao接口和dao实现类。 
需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

——UserDao.java UserDaoImpl.java

public interface UserDao {

    public User findById(int id) throws Exception;

}
public class UserDaoImpl implements UserDao{

    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User findById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById", 1);
        sqlSession.close();
        return user;
    }


}
public class UserDaoImplTest {

    private SqlSessionFactory sqlSessionFactory;

    // 此方法是在执行testFindUserById之前执行
    @Before
    public void setUp() throws Exception {
        // 创建sqlSessionFactory

        // mybatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }

    @Test
    public void testFindById() throws Exception {
        // 创建UserDao的对象
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);

        // 调用UserDao的方法
        User user = userDao.findById(1);
        System.out.println(user);
    }

}

4.2 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

程序员需要编写mapper.xml映射文件 
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:
1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

步骤:  
1、主要写 userMapper.java和 userMapper.xml,教程中是写成同名的并到mapper后缀,实际项目中同名即可(最好带Dao结尾); 2、在SqlMapConfig.xml中加载mapper.xml(开发中会用包扫描方式) 3、应用:获得sqlSessionFactory,获得sqlSession,获得UserMapper对象(此对象是自动生成的)

// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);//调用

 

注意问题

1、在SqlMapConfig.xml中加载mapper.xml

   <mappers>
        <mapper resource="sqlmap/User.xml"/>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
public class UserMapperTest {

    private SqlSessionFactory sqlSessionFactory;

    // 此方法是在执行testFindUserById之前执行
    @Before
    public void setUp() throws Exception {
        // 创建sqlSessionFactory

        // mybatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception {
        SqlSession  SqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = SqlSession.getMapper(UserMapper.class);

        User  user = userMapper.findUserById(1);
        SqlSession.close();
        System.out.println(user);

    }

}

4.3 对比

两者区别:
1、不用写DAO的实现类
2、看不到sqlSession.selectOne("test.findUserById", id);这样的语句。 后续主要练习 一对一,一对多,多对多的查询,pojo和mapper的写法;resultMap,和加载延迟,缓存; 二级缓存参数配置,和分布式缓存ehcache,redis,mamcached;逆向工程的配置生成代码

转载于:https://www.cnblogs.com/chacha-z/p/10804036.html

相关文章:

  • 全球首个大规模光电芯片到来
  • 1.4T的mysql表删除
  • MYSQL-SELECT查
  • css 浮动的时候如何,div进行居中
  • 大文件如何传输,大文件的传输方式有哪些?
  • 5 分钟掌握 JavaScript 实用窍门
  • Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源
  • Linux下Python3.6的安装及避坑指南
  • 四川建筑企业资质办理材料详细说明
  • 组件化页面:封装el-form
  • Redis过期策略
  • cors方法跨域
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • Java中Volatile关键字详解
  • ROS的使用
  • 【mysql】环境安装、服务启动、密码设置
  • Apache的80端口被占用以及访问时报错403
  • css选择器
  • Django 博客开发教程 8 - 博客文章详情页
  • Elasticsearch 参考指南(升级前重新索引)
  • js写一个简单的选项卡
  • Linux后台研发超实用命令总结
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mongodb--安装和初步使用教程
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • socket.io+express实现聊天室的思考(三)
  • ViewService——一种保证客户端与服务端同步的方法
  • vue-router的history模式发布配置
  • 后端_MYSQL
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 我是如何设计 Upload 上传组件的
  • 优化 Vue 项目编译文件大小
  • 怎样选择前端框架
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C++17) std算法之执行策略 execution
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (七)c52学习之旅-中断
  • (十八)SpringBoot之发送QQ邮件
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 物件導向與老子思想 (OO)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net 7 上传文件踩坑
  • .Net 知识杂记
  • .NET微信公众号开发-2.0创建自定义菜单
  • .sh 的运行
  • /proc/stat文件详解(翻译)
  • @RestController注解的使用
  • [<事务专题>]