概要

  • mybatis是一个持久层框架
  • 输入映射:preparedStatement中的输入参数自动进行输入映射
  • 输出映射:查询结果集灵活映射成java对象

和Hibernate不同,MyBatis需要你自己写SQL。

处理步骤

  1. 加载配置文件
  2. 创建会话工厂(根据配置文件创建)
  3. 创建会话
  4. 操作数据库

映射文件 (Entry.xml)

User.xml (假设实体为User用户)中封装了关于User的CRUD的SQL语句(也就是各种statement),先写一个查询作例。

<mapper namespace="test">
     <select id="findUserById" parameterType="int" resultType="com.example.pojo.User">
          SELECT * FROM USER WHERE id=<strong>#{id}</strong>
     </select>
</mapper>

#{}是个占位符,#{value}就是把接收到的参数传入查询,运行代码时,mybatis操作数据库的底层语句是

SELECT * FROM USER WHERE id=? //?就是占位符

${}是拼接符,${value}就是把接收到的参数拼接到SQL语句中,如果你的statement这么写

select * from user where username like '%${value}'

传入参数“小明”,就可以查到苏小明,张小明,王小明的信息。 这个statement映射的底层语句是

SELECT * FROM USER WHERE username LIKE '%小明'//不建议使用,小心SQL注入

配置文件 (SqlMapConfig.xml)

配置每个映射文件(mapper文件)并加载。

<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
   <environment id="development">
   <!-- 使用jdbc事务管理,事务控制由mybatis-->
      <transactionManager type="JDBC" />
   <!-- 数据库连接池,由mybatis管理-->
      <dataSource type="POOLED">
         <property name="driver" value="com.mysql.jdbc.Driver" />
         <property name="url" value="jdbc:mysql://localhost:3306/mybatis1" />
         <property name="username" value="root" />
         <property name="password" value="" />
      </dataSource>
   </environment>
</environments>
<!--配置所有mapper-->
<mappers>
     <mapper resource="sqlmap/User.xml" />
</mappers>

查询

public class MybatisFirst {
     @Test
     public void findUserByIdTest() throws IOException{
        //找到mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //xml转化为文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入配置文件流
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过会话操作数据库
        User user = sqlSession.selectOne("test.findUserById",1); //如果查询结果是list的话,selectList()
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }
}

引入junit.jar进行单元测试:运行,成功查询到事先准备的数据源信息

在工程里新建一个config目录(和src目录同级),一般把xml配置文件放到config目录下。如果使用Intellij IDEA,新建完config文件夹需要右键–Make Directory As–Resources Root把它标记为资源目录,然后就能在代码里直接引用。

插入

先配置mapper,新增一个statement

<insert id="insertUser" parameterType="com.xtlog.mybatis.pojo.User">
   INSERT INTO USER(username, birthday, sex, address) VALUE (#{username}, #{birthday}, #{sex}, #{address})
</insert>

修改测试程序

@Test
public void insertUser() throws IOException{
    //找到mybatis配置文件
    String resource = "SqlMapConfig.xml";
    //xml转化为文件流
    InputStream inputStream = Resources.getResourceAsStream(resource);
    //创建会话工厂,传入配置文件流
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到会话
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //插入用户对象
    User newUser = new User();
    newUser.setUsername("石乐志");
    newUser.setBirthday("2017-1-1");
    newUser.setSex(1);
    newUser.setAddress("浙江杭州");
    sqlSession.insert("test.insertUser",newUser);
    //提交事务
    sqlSession.commit();
    //释放资源
    sqlSession.close();
}

新增用户后返回主键id的方法:

(1)如果设置主键自增

修改mapper:

<insert id="insertUser" parameterType="com.xtlog.mybatis.pojo.User">
   <selectKey keyProperty="id" order="AFTER" resultType="int">
   SELECT LAST_INSERT_ID()
   </selectKey>
 
   INSERT INTO USER(username, birthday, sex, address) VALUE (#{username}, #{birthday}, #{sex}, #{address})
</insert>

order设置:AFTER(后执行),就是先执行insert语句,然后查询刚插入的自增ID,再次运行测试程序,数据插入以后,主键会自动注入pojo的id属性,commit之后,可以通过newUser.getId()获取。

(2)如果主键非自增(uuid)

修改mapper

<insert id="insertUser" parameterType="com.xtlog.mybatis.pojo.User">
   <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
     SELECT uuid()
   </selectKey>
 
   INSERT INTO USER(id, username, birthday, sex, address) VALUE (#{id}, #{username}, #{birthday}, #{sex}, #{address})
</insert>

order设置:BEFORE(先执行),先通过uuid()函数获取一个uuid,然后再执行insert语句,注意insert语句中要写入刚获取的uuid

再次运行测试程序,数据插入以后,主键会自动注入pojo的id属性,commit之后,可以通过newUser.getId()获取。

更新

<update id="updateUser" parameterType="com.xtlog.mybatis.pojo.User">
    UPDATE USER SET username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} WHERE id=#{id}
</update>

测试程序新建一个User实例,然后设置id(必须,设置为需要修改的用户的id),设置其他属性,然后sqlSession.update("test.updateUser", user);

删除

<delete id="deleteUser" parameterType="int" >
    DELETE FROM USER WHERE id=#{id}
</delete>

测试

sqlSession.delete("test.deleteUser", 5);//删除id=5的用户

P.S. 其实这篇文章是给自己看的。