第一个EE框架MyBatis02

第一个EE框架MyBatis02

MyBatis的使用流程

1. 加载MyBatis核心配置文件

InputStream is = Resources.getResourceAsStream("mybatis.xml");

2. 构建SqlSessionFactory工厂对象

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

3. 通过工厂打开SqlSession

SqlSession session = factory.openSession();

4. 通过session执行查询操作

List<User> list = session.selectList("top.byfree.mapper.UserMapper.selAll");

使用了3个常用的查询方法中的一个,详情见mybatis01中的3个常用的查询方法

5. 关闭资源

session.close();

带参数的查询

Mapper中的配置

单个参数

<select id="selByName" resultType="user" parameterType="string">
        select * from user where name=#{0}
</select>

paramenterType属性:写的是参数的类型,本来是要写全限定路径的,但是mybatis提供了基础类型的别名
别名表
别名
SQL语句中的占位符
使用#{}使用参数:
index 从0开始
param+数字 param1 param2 从1开始
**注意:**如果只有一个参数{}内写什么都可以访问的到,但是不建议这么做因为代码阅读性不好

多个参数

<select id="sel" resultType="user" parameterType="user">
        select * from user where name=#{name} and password=#{password}
</select>

**paramenterType属性:**多参数一般是传入一个实体类或者是map集合
注意:即使传入的是一个map集合我们写实体类名仍然不会报错,前提是map键名和实体类的属性名对应。
SQL语句中的占位符
使用#{键名或者实体类属性名}

多参数查询使用流程

	// 前四步的链式简写
        SqlSession session = new SqlSessionFactoryBuilder()
                .build(Resources.getResourceAsStream("mybatis.xml"))
                .openSession();
	// 传入的user对象
        User u = new User();
        u.setName("jelly");
        u.setPassword("123");
	// 或者传入一个map集合
        Map<String, String> map = new HashMap<>();
        map.put("name", "jelly");
        map.put("password", "123");
        User user = session.selectOne("top.byfree.mapper.UserMapper.sel", user or map);
        System.out.println(user);
        session.close();

多参数的使用方式很简单,将多个参数封装成一个实体类或者map对象传入即可,具体见上代码。

增删改(DML)操作

事务(Transaction)

事务是数据库操作的最小单元
一个事务的SQL语句要么同时成功要么都不成功

MyBatis中配置了事务管理器,type属性设置位JDBC,表示MyBatis采用和原生JDBC相同的事务管理机制

在MyBatis执行开始的时候,将自动提交功能关闭了,所以,在执行DML操作的时候要手动提交事务

使用SqlSession对象下的commit方法可以提交事务
而rollback方法用于回滚事务

设置事务的自动提交

在创建SqlSession对象的时候会使用openSession方法,此方法会传入一个boolean类型的参数,用于决定session对象是否自动提交事务
false(默认):不会自动提交事务,需要我们手动提交,建议使用,因为自动提交会发生意料之外的错误
treu:mybatis会自动提交事务

封装MyBatisUitl工具类

因为在使用mybatis的时候步骤有很多冗余,故而可以将其封装成一个工具类,简化操作

    private static SqlSessionFactory factory = null;

    static {
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        factory = new SqlSessionFactoryBuilder().build(is);
    }

    public static SqlSession getSession () {
        SqlSession session = null;
        if (factory != null) {
            // openSession 默认参数false关闭自动提交事务
            // 写true是开启自动提交事务
            session = factory.openSession();
        }
        return session;
    }	

增加(插入)操作(insert)

配置文件

<insert id="insUser" parameterType="user">
        insert into user(name, password, invitationcode, Telephone) values (#{name}, #{password}, #{invitationcode}, #{Telephone})
</insert>

#{}的使用与上讲述的查询中的无异

使用

	SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setName("小新");
        user.setPassword("jkl");
        user.setInvitationcode("jojo");
        user.setTelephone("1231564");
        int num = session.insert("top.byfree.mapper.UserMapper.insUser", user);
        if (num > 0) {
            // 提交事务
            session.commit();
            System.out.println("成功");
        } else {
            session.rollback();
            System.out.println("失败");
        }

使用了封装的MyBatisUtil工具类,具体看上工具类封装代码
session.commit()方法用于提交事务
session.rollback()用于回滚事务
session.insert()方法返回的是一个int类型的数字,用于表示变更了数据库中的多少条数据,可以借此判别操作成功或失败

修改操作(update)

配置文件

<update id="upd" parameterType="user">
        update user set password = #{password} where name=#{name}
</update>

同上#{}使用方式一样

使用

	SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setName("jelly");
        user.setPassword("456");

        int num = session.update("top.byfree.mapper.UserMapper.upd", user);
        if (num > 0) {
            // 提交事务
            System.out.println("成功");
            session.commit();
        } else {
            System.out.println("失败");
            session.rollback();
        }
        session.close();

删除操作(delete)

配置文件

<delete id="del" parameterType="string">
        delete from user where name=#{0}
</delete>

使用

	SqlSession session = MyBatisUtil.getSession();
        int n = session.delete("top.byfree.mapper.UserMapper.del", "jelly");
        session.commit();
        session.close();

偷懒没写判别成功与否,具体和上述操作一致

小趣味

因为在jdbc底层是没区分insert和update和delete的只有一个update用于修改操作
而mybatis是对jdbc的封装所以可以推想这里的insert和update和delete底层都是用的jdbc的update方法
所以我们这三个方法名可以随便写,结果都没有变化,但是为了便于阅读,还是尽量见名知义,不要搞恶趣味了。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/mybatis02