本小节通过XML配置方式,实现基本的增删改查。

增、删、改、查

增删改查分别对应的标签是:insert、delete、update、select。
id:唯一标识符,与接口中的方法一一对应;
parameterType:传入sql语句的参数类型,当参数是基本类型并且只有一个时该属性可以不写;
resultType:sql语句返回值的类型(完整的类名或者别名);

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.liwq.mapper.UserMapper">
  6. <insert id="addUser" parameterType="com.liwq.entity.User">
  7. insert into user
  8. values (#{id}, #{userName}, #{passWord})
  9. </insert>
  10. <delete id="deleteUserById" parameterType="int">
  11. delete
  12. from user
  13. where id = #{id}
  14. </delete>
  15. <update id="updateUserById" parameterType="com.liwq.entity.User">
  16. update user
  17. set user_name=#{userName},
  18. pass_word=#{passWord}
  19. where id = #{id}
  20. </update>
  21. <select id="getUserById" resultType="com.liwq.entity.User" parameterType="int">
  22. select *
  23. from user
  24. where id = #{id}
  25. </select>
  26. <select id="listUsers" resultType="com.liwq.entity.User">
  27. select *
  28. from user
  29. </select>
  30. </mapper>

增删改的标签属性和查的差不多,但需要注意的是增删改都需要提交事务才能改变数据库中的数据。

MyBatis获取参数值

MyBatis获取参数值的两种方式:${}和#{}

  • ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
  • ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

单个字面量类型的参数

  • 若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值,注意${}需要手动加单引号。

    1. <select id="getUserByUsername" resultType="User">
    2. select * from user where username = #{username}
    3. </select>
    1. <select id="getUserByUsername" resultType="User">
    2. select * from user where username = '${username}'
    3. </select>

    map集合类型的参数

  • 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。

    1. <select id="getUserById2" resultType="com.liwq.entity.User" parameterType="map">
    2. select *
    3. from user
    4. where user_name = #{username}
    5. and pass_word = #{password}
    6. </select>
    1. public void getUserById2() throws IOException {
    2. //读取MyBatis的核心配置文件
    3. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    4. //获取SqlSessionFactoryBuilder对象
    5. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    6. //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
    7. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    8. //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
    9. //SqlSession sqlSession = sqlSessionFactory.openSession();
    10. //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
    11. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    12. //通过代理模式创建UserMapper接口的代理实现类对象
    13. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    14. //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
    15. Map<String, Object> map = new HashMap<String, Object>();
    16. map.put("username", "tom3153e703-582b-40b1-96b1-142889d476d0");
    17. map.put("password", "pass398f68fd-b4cc-47d9-83e3-947750bddae6");
    18. User result = userMapper.getUserById2(map);
    19. //提交事务
    20. //sqlSession.commit();
    21. System.out.println("result:" + result.toString());
    22. }

    实体类类型的参数

  • 若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。

    1. <insert id="addUser" parameterType="com.liwq.entity.User">
    2. insert into user
    3. values (#{id}, #{userName}, #{passWord})
    4. </insert>
    1. public void addUser() throws IOException {
    2. //读取MyBatis的核心配置文件
    3. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    4. //获取SqlSessionFactoryBuilder对象
    5. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    6. //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
    7. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    8. //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
    9. //SqlSession sqlSession = sqlSessionFactory.openSession();
    10. //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
    11. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    12. //通过代理模式创建UserMapper接口的代理实现类对象
    13. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    14. //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
    15. User user = new User();
    16. user.setUserName("tom" + UUID.randomUUID());
    17. user.setPassWord("pass" + UUID.randomUUID());
    18. int result = userMapper.addUser(user);
    19. //提交事务
    20. //sqlSession.commit();
    21. System.out.println("result:" + result);
    22. }