MyBatis的相关api

1. MyBatis的相关api

1.1 Resources

  • org.apache.ibatis.io.Resources:加载资源的工具类。

核心方法

返回值 方法名 说明
InputStream getResourceAsStream(String fileName) 通过类加载器返回指定资源的字节流

1.2 构建器SqlSessionFactoryBuilder

建造者设计模式:

  • org.apache.ibatis.session.SqlSessionFactoryBuilder:获取 SqlSessionFactory 工厂对象的功能类

核心方法

返回值 方法名 说明
SqlSessionFactory build(InputStream is) 通过指定资源字节输入流获取SqlSession工厂对象
  • 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource); 
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。
Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。

1.3 工厂对象SqlSessionFactory

工厂设计模式:

  • org.apache.ibatis.session.SqlSessionFactory:获取 SqlSession 构建者对象的工厂接口。

核心api

返回值 方法名 说明
SqlSession openSession() 获取SqlSession构建者对象,并开启手动提交事务
SqlSession openSession(boolean autoCommit) 获取SqlSession构建者对象,如果参数为true,则开启自动提交事务

1.4 SqlSession会话对象

  • org.apache.ibatis.session.SqlSession:构建者对象接口。

  • 用于执行 SQL、管理事务、接口代理。

  • 核心api

MyBatis的相关api_第1张图片

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

2. 接口代理方式实现Dao

2.1 代理开发方式介绍

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。

Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper 接口开发需要遵循以下规范:

1) Mapper.xml文件中的namespace与mapper接口的全限定名相同

2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4) Mapper接口方法的返回值类型和mapper.xml中定义的每个sql的resultType的类型相同

总结:

接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?

1.程序员负责定义接口

2.在操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作

3. MyBatis 映射配置文件

3.1 映射配置文件介绍

  • 映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句

3.2 查询功能

<Select> 查询功能标签
  • 属性 id:唯一标识, 配合名称空间使用。

  • parameterType:指定参数映射的对象类型。

  • resultType:指定结果映射的对象类型。

  • SQL 获取参数: #{属性名} #表示方式sql注入的 $ 表示sql拼接 where id=1 1=1

  • 示例


<select id="findById" parameterType="java.lang.String" resultType="cn.zxy.pojo.User">        
select * from user where id=#{id}
select>

3.3 新增功能

<insert>:新增功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

  • 示例

操作步骤:

第一步、编写dao接口

public void save(User user);

第二步、编写映射文件

<insert id="save" parameterType="com.by.pojo.User">
    insert into user values(#{id},#{username},#{sex},#{address},#{birthday})
insert>

第三步、测试代码

@Test
public void saveTest() throws IOException {
    //读取配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);
    User user=new User();
   // user.setId(1);
    user.setUsername("张三");
    user.setSex("男");
    user.setAddress("河南开封");
    user.setBirthday("2010-09-12");
    mapper.save(user);
    //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();}

3.4 修改功能

<update>:修改功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

  • 示例

1、编写dao接口

public void update(User user);

2、编写映射文件

<update id="update" parameterType="cn.zxy.pojo.User">
    update user set username=#{username},sex=#{sex} where id=#{id}
update>

3、测试运行

@Test
public void update() throws IOException {
    //读取配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);User user=new User();
    user.setId(1);
    user.setUsername("张三");
    user.setSex("女");
    mapper.update(user);
      //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();}

3.5 删除功能

<delete>:查询功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

1、编写dao接口

public void delete(int id);
  • 示例
<delete id="delete" parameterType="java.lang.Integer">
    delete from user where id=#{id}
delete>

3、测试运行

@Test
public void delTest() throws IOException {
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);
    mapper.delete(1);
     //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();
}
  • 总结: 大家可以发现crud操作,除了标签名称以及sql语句不一样之外,其他属性参数基本一致。

3.6 抽取工具类

public class MybatisUtils {
    //定义静态的session工厂对象
    static SqlSessionFactory sqlSessionFactory;
    static {
        //读取配置文件
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            sqlSessionFactory = builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }}
    //提交
    public static SqlSession getSqlSession(boolean autocommit){
        return sqlSessionFactory.openSession(autocommit);
    }
    //关闭
    public static void closeSqlSession(SqlSession sqlSession){
        sqlSession.close();
    }
}

测试操作:

@Test
public void findTest() throws IOException {
    //调用utils里面的getsqlSession 包含提交操作
    SqlSession session = MybatisUtils.getSqlSession(true);
    UserDao mapper = session.getMapper(UserDao.class);
    List<User> all = mapper.findAll();
    for (User user : all) {
        System.out.println(user);
    }
    //释放资源
    MybatisUtils.closeSqlSession(session);
}

3.7 注解实现案例

@insert 添加操作

1、编写mapper接口

@Insert("insert into T_user values(#{id},#{username},#{sex},#{address},#{birthday})")
public void save(User user);

2、编写测试类

@Test
public void insertTest(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);
    IUsermapper mapper = sqlSession.getMapper(IUsermapper.class);
    User user=new User();
    user.setUsername("胡二小");
    user.setSex("女");
    user.setAddress("郑州");
    user.setBirthday("2001-09-12");
    mapper.save(user);
    //释放资源
    MybatisUtils.closeSqlSession(sqlSession);}

@update修改操作

@Update("update T_user set username=#{username},sex=#{sex} where id=#{id}")
public void update(User user);

@Delete删除操作

@Delete("delete from T_user where id=#{id}")
public void delete(int id);

3.8 问题扩展:新增用户 id 的返回值

新增用户后, 同时还要返回当前新增用户的 id 值, 因为 id 是由数据库的自动增长来实现的,所以就相

当于我们要在新增后将自动增长 auto_increment 的值返回。

 <insert id="saveUser" parameterType="user">
 
        
        
        <selectKey order="AFTER" keyProperty="id" keyColumn="id" resultType="int">
            select last_insert_id()
        selectKey>
​
insert into T_user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday})
    insert>

编写步骤:

1、在dao中添加一个方法

public void saveUser(User user);

2、编写映射

3、编写测试

@Test
public void saveTest() throws IOException {
    SqlSession sqlSession = MybatisUtils.getSqlSession(true);
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    User user=new User();
   // user.setId(1);
    user.setUsername("小李子");
    user.setSex("男");
    user.setAddress("郑州");
    user.setBirthday(Date.valueOf("2011-09-12"));
    //mapper.save(user);
    mapper.saveUser(user);
    //打印id的值
    System.out.println("userId="+user.getId());
   MybatisUtils.closeSqlSession(sqlSession);
}

总体解释:将插入数据的主键返回到 user 对象中。

  • 具体解释:

  • SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键

  • keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性

  • keyColumn 指定的是表中的主键字段名

  • resultType:指定 SELECTLAST_INSERT_ID() 的结果类型

你可能感兴趣的:(Mybatis持久层框架技术,mybatis,java,spring,mvc)