三、使用 MyBatis 完成 CRUD
JDBC 代码中占位符采用的是 ?,在 MyBatis 中是 #{ }
3.1 insert(Create)
-
Mapper 中使用 #{ } 占位,不将 sql 写死
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"> <insert id="insertStu"> insert into t_student(sno, sname, ssex) VALUES (null, #{sname}, #{ssex}); </insert> </mapper>
-
使用 Map 集合,动态传参。Mapper 的 #{ } 中需要写 map 集合中的 key(底层调用了 map.get(key))
public class StuMapperTest { @Test public void testInsert() { Map<String, Object> map = new HashMap<>(); map.put("sname", "mike"); map.put("ssex", "man"); SqlSession sqlSession = SqlSessionUtil.openSession(); sqlSession.insert("insertStu", map); sqlSession.commit(); sqlSession.close(); } }
-
也可以使用 bean 类完成传参,将 Mapper 的 #{ } 中修改为属性名即可(底层调用了 bean 类的 get 方法,严格来说:#{ } 中传的参数是 get 方法名去掉 get,剩下的全小写)
3.2 delete(Delete)
-
StuMapper.xml
<delete id="deleteStu"> delete from t_student where sno = #{sno}; </delete>
-
测试删除方法
@Test public void testDelete() { SqlSession sqlSession = SqlSessionUtil.openSession(); sqlSession.delete("deleteStu", 11); sqlSession.commit(); sqlSession.close(); }
3.3 update(Update)
-
StuMapper.xml
<update id="updateStu"> update t_student set sno = #{sno}, sname = #{sname}, ssex = #{ssex} where sno = #{sno}; </update>
-
测试修改方法
@Test public void testUpdate() { SqlSession sqlSession = SqlSessionUtil.openSession(); Student student = new Student(10L, "Alice","woman" ); sqlSession.update("updateStu", student); sqlSession.commit(); sqlSession.close(); }
3.4 select(Retrieve)
-
StuMapper.xml
- 注意:必须写 resultType 属性,不然 mybatis 无法确定返回值类型,就会报错
<!-- 查询一条 --> <select id="selectStu" resultType="com.shameyang.mybatis.bean.Student"> select * from t_student where sno = #{sno}; </select> <!-- 查询多条,不需要加 where --> <select id="selectAll" resultType="com.shameyang.mybatis.bean.Student"> select * from t_student; </select>
-
测试查询一条记录
@Test public void testSelect() { SqlSession sqlSession = SqlSessionUtil.openSession(); sqlSession.selectOne("selectStu", 1); sqlSession.close(); }
-
测试查询多条记录
@Test public void testSelectAll() { SqlSession sqlSession = SqlSessionUtil.openSession(); List<Student> students = sqlSession.selectList("selectAll"); students.forEach(System.out::println); // lambda 表达式 sqlSession.close(); }
3.5 SQL Mapper 的 namespace
SQL Mapper 配置文件中,<mapper> 标签的 namespace 属性翻译为命名空间,主要是为了防止 sqlId 冲突
-
xml 文件中
<mapper namespace="命名空间"> <insert id="insertStu"> insert into t_student(sno, sname, ssex) VALUES (null, #{sname}, #{ssex}); </insert> ... </mapper>
-
Java 程序中
sqlSession.insert("命名空间.insertStu");