Featured image of post MyBatis 框架学习笔记

MyBatis 框架学习笔记

MyBatis 是 Java Web 开发主流技术栈 SSM 中的一员,是一个基于 JDBC 的数据访问框架。和 Hibernate/JPA 不同,MyBatis 需要你自己写 SQL 语句。所以,严格来说 MyBatis 只能算是一个半自动 ORM 框架,虽然看似使用起来“变麻烦”,但是手写 SQL 可以提供很高的灵活性和性能调优空间。

编写配置文件

entity.xml 映射文件

假设有一个 User 实体模型,新建文件 user.xml,其中 <mapper> 封装 User 增删改查的 SQL 语句,先写一个 <select> 作例:

<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 操作数据库的实际 SQL 语句是

SELECT * FROM user WHERE id=?

${} 是拼接符,${value} 就是把接收到的参数拼接到 SQL 语句中。% 用于支持模糊查询,如果你的查询语句这样写:

SELECT * FROM user WHERE username LIKE '%${value}'

传入参数“小明”,就可以查到苏小明,张小明,王小明的信息。 MyBatis 操作数据库的实际 SQL 语句是:

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

SqlMapConfig.xml 配置文件

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!-- 和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>

增删改查

引入 junit 进行单元测试。

查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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();
  }
}

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

插入

先编辑 user.xml,新增语句:

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

修改测试程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Test
public void insertUser() throws IOException{
  String resource = "SqlMapConfig.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() 获取。

更新

编辑 user.xml,加入 update 语句:

<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);

删除

编辑 user.xml,加入 delete 语句:

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

测试:

sqlSession.delete("test.deleteUser", 5);
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Site built with Hugo, hosted by Firebase.
Theme Stack designed by Jimmy.