mybatis的进阶指南

这一篇mybatis的进阶指南是接着上一篇mybatis的入门指南来的,先新建一个项目mybatis02,包名等都相应的改了,其他跟mybatis的入门指南一样

通过接口交互数据

SqlSession通过的通用方法并强制转换的方式,容易出错,IDE不能不能提示转换类型,存在着转换安全的问题,可以采用接口+xml,和单独的接口两种方式来加以避免。

接口+xml

在com.example.mybatis02.mapping包下新建一个接口文件:

package com.example.mybatis02.mapping;

import java.util.List;

import com.example.mybatis02.domain.User;

public interface UserMapper {
    public void insert(User user);
    public User selectUser(String userName);
    public List selectAll();
}

测试,其他的不用动,我们测试:

package com.example.mybatis02;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {
        //mybatis的配置文件
        String resource = "conf.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //创建能执行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession(true);
        UserMapper useMapper = session.getMapper(UserMapper.class);
        System.out.println(useMapper.selectUser("alex"));
    }
}

注意,UserMapper.xml文件的mapper节点的namespace要对于接口文件的包名+类名。

纯接口

新建一个接口:

package com.example.mybatis02.mapping;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import com.example.mybatis02.domain.User;

public interface UserMapper2 {

    @Insert({"insert into users(username,password,enabled) values(#{username}, #{password},#{enabled})"})
    public void insert(User user);

    @Select({ "SELECT * FROM users WHERE username = #{username}" }) 
    public User selectUser(String userName);

    @Select({ "SELECT * FROM users" }) 
    public List selectAll();
}

在方法上面加上select注释,需要在conf.xml加上:

class="com.example.mybatis02.mapping.UserMapper2" />

或者:

//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
sessionFactory.getConfiguration().addMapper(UserMapper2.class);

测试:

package com.example.mybatis02;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {
        //mybatis的配置文件
        String resource = "conf.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        sessionFactory.getConfiguration().addMapper(UserMapper2.class);
        //创建能执行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession(true);
        UserMapper2 mapper2 = session.getMapper(UserMapper2.class);
        System.out.println(mapper2.selectUser("alex"));
        System.out.println(mapper2.selectAll());
    }
}

上面两种方法都行,要注意的是,在接口+xml的方法中,如果把接口加入mybatis的配置中,则接口和配置文件必须得在同一个包里,xml的namespace必须对应接口文件的包名+类名,否则报错,如果把xml文件加入mybatis配置中,则接口和配置文件不一定要在同一个包里,但是xml的namespace必须对应接口文件的包名+类名。不能都加,否则也会报错。

返回类型resultMap

    <resultMap type="user" id="userList">
        <result column="username" property="username" />
        <result column="password" property="password" />
        <result column="enabled" property="enabled" />
    resultMap>
    <select id="selectAll" resultMap="userList">
        SELECT * FROM users
    select>

属性名映射到列名,功能很强大,我们也可以直接:

    <select id="selectAll" resultType="user">
        SELECT * FROM users
    select>

这样要属性名跟列名一样才行。

参数类型parameterType

参数类型parameterType既可以是Java的基本类型,也可以自定义类型,例如:user,

    "insert" parameterType="user">
        insert into users(username,
        password,enabled) values(#{username}, #{password},#{enabled})
    
    <select id="selectUser" parameterType="String" resultType="user">
        SELECT * FROM users WHERE username = #{username}
    select>

事务

通过

SqlSession session = sqlSessionFactory.openSession(false); // 打开会话,事务开始

获取session或者不传参数,开启了一个事务,之后的insert,update,delete操作都是事务中,最后要通过

session.commit();

来提交事务,否则不起作用。
今后有时间,写一些mybatis整合spring,springboot的博客,记录下自己的所学所思,也给其他的读者一些入门的参考。

你可能感兴趣的:(mybatis)