一、增

在环境搭建好的基础上

1、在dao接口中创建一个抽象方法

  1. public interface UserDao {
  2. int saveUser(User user);
  3. }

2、在映射配置文件中

  1. <!--namespace 写dao接口的全名 代包名-->
  2. <mapper namespace="com.yixuexi.dao.UserDao">
  3. <!--id 写dao接口中的方法名字 不带()-->
  4. <!--parameterType 写对应那个实体类 从那个实体类中取数据 输入参数类型-->
  5. <insert id="saveUser" parameterType="com.yixuexi.entity.User">
  6. <!--取数据用 #{属性名或者getId() 都可以}-->
  7. insert into user(id,name,password) values(#{id},#{name},#{password})
  8. </insert>
  9. </mapper>

3、在执行的时候一定不要忘记sqlSession.commit()

因为自动提交事务是关闭的

二、保存操作的细节,获取保存数据的id

  1. Select last_insert_id(); 会查询到最后一次保存的id

未命名图片.png

1、在dao接口中创建一个方法

  1. //保存一个User 并且返回该User的id
  2. Integer saveUserReturnId(User user);

2、在映射文件中这样写

  1. <!--id写到接口中方法名 parameterType输入参数类型-->
  2. <!--useGeneratedKeys:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中-->
  3. <insert id="saveUserReturnId" keyProperty="id" useGeneratedKeys="true" parameterType="com.yixuexi.entity.User">
  4. insert into user(name,password) values(#{name},#{password})
  5. </insert>

3、然后再注册该mapper,

(已经注册过的不需要在注册)

4、在测试类写的注意事项

  • 返回的值并不是id属性
  • 要想得到id属性从user对象中getId即可
  • 一定不要忘记 session.commit();
  • id必须为主键并且自增长 auto_increment

未命名图片.png

三、改

在环境搭建好的基础上

1、在UserDao接口上新建一个方法

  1. public interface UserDao {
  2. //用户更改的方法
  3. void updateUser(User user);
  4. }

2、在映射配置文件中写sql

  1. <update id="updateUser" parameterType="com.yixuexi.entity.User">
  2. update user set name = #{name},password = #{password} where id = #{id}
  3. </update>

3、在主配置文件中注册上

  1. <mappers>
  2. <mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
  3. </mappers>

4、在测试文件中写测试方法

注意最后一定要SqlSession.commit(); // 提交

四、删除

在环境搭建好的基础上

1、给UserDao接口上新建一个方法

  1. public interface UserDao {
  2. void deleteUser(Integer id);
  3. }

2、在映射配置文件中写sql

  1. 类型不是User而是Integer
  2. <update id="deleteUser" parameterType="java.lang.Integer">
  3. 取值直接用#{}
  4. delete from user where id = #{id}
  5. </update>

3、在主配置文件中注册

  1. <mappers>
  2. <mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
  3. </mappers>

4、在测试文件中写测试方法

注意最后一定要SqlSession.commit();

五、根据Id查询用户

1、在dao接口中

  1. public interface UserDao {
  2. //查询一个的方法,根据id查询
  3. User findOne(Integer id);
  4. }

2、在映射配置文件中

  1. <mapper namespace="com.yixuexi.dao.UserDao">
  2. <!--
  3. resultType写最后封装到哪里,
  4. parameterType 写值是什么类型
  5. -->
  6. <select id="findOne" resultType="com.yixuexi.entity.User" parameterType="java.lang.Integer">
  7. select * from user where id = #{id}
  8. </select>
  9. </mapper>

3、在主配置文件中注册

  1. <mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>

测试

六、Like查询

1、在接口中定义一个抽象方法

  1. //模糊查询like [通过名字查询]
  2. List<User> findLike(String name);

2、在映射文件中写sql

  1. <select id="findLike" resultType="com.yixuexi.entity.User" parameterType="String">
  2. select * from user where name like #{name}
  3. Select * from user where name like '%${value}%';
  4. 也可以这样,不过这个value是固定的,% 是占位符【不常用】
  5. 测试类中调用 方法的时候就不需要再提供 % 占位符了
  6. </select>

3、在主配置文件中配置

(如果配置了就不需要再配置了)

4、Test类

  1. 注意事项:再测试传值的时候 一定要带上占位符,因为在映射配置文件中不能写 % _
  2. List<User> like = mapper.findLike("%曹%");

七、详解Like 查询中 #{} 和 ‘${value}’的差距

  • #{}在传参的时候需要字符串添加 占位符 % _
    • 使用的是预编译的数据库操作对象,更加安全 不会有 SQL注入
    • PrepatedStatement
    • 常用,但是不能用作排序查询
  • ${value} 可以直接在映射文件中写占位符 ${%vlaue%}
    • 使用的是 普通的数据库操作对象 可能会产生 SQL 注入问题
    • Statement
    • 一般可以使用在 排序查询的时候,传进去 ${value} desc / asc
    • 不管传进来的是什么 都是 ${value}

select * from user order by id ${value}

八、查询总用户 (一行一列型)

1、在dao接口中添加方法

  1. //测试查询总记录条数
  2. Integer countAll();

2、在映射配置文件中配置

  1. 只需要配置一个 结果界类型 resultType即可
  2. <select id="countAll" resultType="Integer">
  3. select count(*) from user
  4. </select>

3、在主配置文件中注册

如果该映射文件被注册了则不用进行注册

4、测试方法