Mybatis框架-核心配置文件中标签设置,sqlSession工厂模式,mapper代理方式

mybatis 框架


概述

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程
面试题: mybatis是基于ORM思想的半自动持久层框架- ORM对象关系映射:让实体类与表产生映射关系,操作实体类等同于操作表

开发步骤

  1. 创建maven仓库工程,添加依赖
  2. 编写实体类
  3. 编写映射配置文件(同包同名)
  4. 编写核心配置文件
  5. 编写测试类
    • 加载配置文件
    • 创建sqlSessionFactory
    • 创建sqlSession
    • sqlSession调用方法
    • 释放资源,

      核心配置文件中的标签设置

      所有标签,且按照配置标签既定的顺序排列
      properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?

1. properties标签 : 加载外部properties配置文件 resource

两个属性:

  • resource属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下resource="jdbcConfig.properties"
  • url属性: 统一资源定位符 http://localhost:8080/mystroe/CategoryServlet

    2. typeAliases标签: 自定义别名

    两种定义:
  • 单个别名定义
  • 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或者小写都可以)

    3. environments标签: 数据库环境的配置,支持多环境配置



    
        
            
            
            
            
                
                
                
                
            
        
    

指定默认的环境名称
指定当前环境的名称
指定事务管理类型是jdbc
指定当前数据源类型是连接池
数据源配置的基本参数

事物管理器(transactionManager)类型,两种

  • JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事物作用域
  • managed: 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
    数据源(dataSource)类型, 三种
  • unpooled: 这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED: 实现利用“池”的概念将 JDBC 连接对象组织起来。
  • JNDI: 实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

    4. mapper标签: 映射器,作用:加载映射

  • 方式一: 使用相对于类路径的资源引用
  • 方式二: 使用完全限定资源定位符(URL)
  • 方式三: 使用映射器接口实现类的完全限定类名
  • 方式四: 将包内的映射器接口实现全部注册为映射器,只能在mapper代理开发中使用,相当于扫包,指定包下的所有实现类. 常用的方式

MyBatis相应API介绍sqlSession

1.sqlSession工厂构建器(构建者模式)SqlSessionFactory build(InputSream inputStream)

通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象

//String resource = "org/mybatis/builder/mybatis-congfig.xml";
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//构建者设计模式
SqlSessionFactory factory = builder.build(inputStream);

2.sqlSession工厂对象(工厂模式)

工厂的作用就是造 sqlSession 会话对象. 工厂模式就是为了解耦和

SqlSessionFactory 有多个个方法创建SqlSession 实例。常用的有如下两个:
|方法|解释|
|:------:|:------------|
|openSession|会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中|
|openSession(boolean autoCommit)|参数为是否自动提交,true(自动提交)|

3.sqlSession会话对象(重要)

SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

SqlSession sqlSession = sqlSessionFactory.openSession(true);

  • 执行sql语句方法:
//查询
 T selectOne(String statement, Object parameter) 
 List selectList(String statement, Object parameter) 
//增 删 改
int insert(String statement, Object parameter) 
int update(String statement, Object parameter) 
int delete(String statement, Object parameter)
  • 操作事务的方法:
void commit()  
void rollback() 

mapper代理方式

1.Mybatis的Dao层实现有两种方式:

1-传统开发方式: 手动对Dao层进行实现,在Dao层编写接口,接口实现类,实现方法
2-代理开发方式: 编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

2.mapper代理开发要求(规范):

mapper接口开发需要遵循规范 示例
1-接口和映射文件要同包同名 java.cn.ppvir.dao.UserMapper.java和resources/cn/ppvir/dao/UserMapper.xml
2-持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定类名 public interface Usermapper{}---
3-sql语句的配置标签 User findById(Int id)---
4-parameterType要和接口中的传入参数类型相同 User findById(int id)---
5-resultType要和接口中的返回值结果类型相同 User findById(int id)---

3.代码演示(使用mapper代理开发)

模糊查询中${} 和 #{}的区别

#{}表示一个占位符
#{}可以实现prepareStatment向占位符中设置值,自动进行JDBC和java类型转换,防止sql注入
#{}可以接收简单类型值或pojo属性值,如果parameterType传输基本数据类型,值随便写

${}表示拼接sql串
${}是将传入的参数原样拼接在sql中,不进行jdbc类型转换
${}可以接收简单类型值或pojo属性值,如果parameterType传输基本数据类型,${}括号中只能是value

  1. pom
  2. 核心配置文件 sqlMapConfig.xml




    

    
        
        
        
        
    

    
        
            
            
                
                
                
                
            
        
    

    
        
        
        
        
    
  1. 实体类 get set toString
public class User {
    private int id;
    private String username;
    private String password;
  1. 映射配置文件 UserMapper.xml resources/it/ppvir/dao/Usermapper.xml





    

    


    
          
        
            SELECT LAST_INSERT_ID()
        
        insert into users VALUES (#{id},#{username},#{password})
    


    
        DELETE FROM users where id=#{id}
    


    
        UPDATE  users SET username=#{username} where id=#{id}
    


    
  1. 接口 接口和映射同包同名 方法名和id值相同 返回值和resultType相同 形参和ParameterType相同
public interface UserMapper {
    //插入数据 addUser
    void addUser(User user);
    //查询所有用户 findAll
    List findAll() throws IOException;
    //查询用户通过id findUserById
    User findUserById(int id);
    //通过Id删除用户 delUserById
    void delUserById(int id);
    //通过id修改用户信息 modUserById
    void modUserById(User user);
    //模糊查询
    List findUserByLikeUsername(String username);
}
  1. 测试类
public class UserMapperTest {
    /**
     * 接口实现类测试 传统方法
     * @throws IOException
     */
    @Test
    public void test01() throws IOException {
        UserMapper userMapper = new UserMapperImpl();
        List users = userMapper.findAll();
        System.out.println(users);
    }
    /**
     *   mapper代理方式 实现findAll方法
     */
    @Test
    public void test02() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = factory.openSession();

        //使用mapper代理方式
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//通过接口获取mapper代理对象
        List users = mapper.findAll();//使用代理对象调用接口的方法
        System.out.println(users);
    }
    @Test
    /**
     *  mapper代理方式 实现 User findUserById(int id)
     */
    public void test03() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //mapper代理
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findUserById(19);
        System.out.println(user);
    }
    @Test
    /**
     *  mapper代理方式   添加用户void addUser(User user); 并且获取到添加后user 的id
     */
    public void test04() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //封装实体类
        User user = new User();
        user.setUsername("euuruqwo");
        user.setPassword("123123");
        System.out.println("添加前"+user);

        //mapper代理
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.addUser(user);
        sqlSession.commit();
        System.out.println("添加后"+user);
    }
    @Test
    /**
     *  mapper代理方式 删除用户
     */
    public void test05() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //mapper代理
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.delUserById(25);
    }
    @Test
    /**
     *  mapper代理方式 修改用户
     */
    public void test06() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //封装实体类
        User user = new User();
        user.setId(2);
        user.setUsername("2222222");
        //mapper代理
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.modUserById(user);
    }
    //模糊查询测试
    @Test
    public void queryLike() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();

        //mapper代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List users = mapper.findUserByLikeUsername("%张%");
        for (User user : users) {
            System.out.println(user);
        }
    }
}

转载于:https://www.cnblogs.com/ppvir/p/11432612.html

你可能感兴趣的:(Mybatis框架-核心配置文件中标签设置,sqlSession工厂模式,mapper代理方式)