mybatis优化.修改和查询处理

   优化:

         1. SqlSession默认自动提交事务,若需要自动提交事务

               可以使用SqlSessionFactory.openSession(true);

          2. 加入log4j日志功能:

                    ①加入依赖

<!-- log4j日志 -->
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
</dependency>

                 ②加入log4j的配置文件

              log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
       <param name="Encoding" value="UTF-8" />
       <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />  </layout>
   </appender>
   <logger name="java.sql">
       <level value="debug" />
   </logger>
   <logger name="org.apache.ibatis">
       <level value="info" />
   </logger> <root><level value="debug" />
   <appender-ref ref="STDOUT" />
   </root>
</log4j:configuration>

          日志的级别

                FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)

                  从左到右打印的内容越来越详细

封装jdbc的过程中遵循规则:字段名跟属性名一致

 删除和修改

         mybatis功能是面向接口功能

           所以应该是先有mapper接口中的方法,然后在通过这个方法在去找到当前映射文件中的sql

          写功能的时候,先写mapper接口中的方法,然后在根据我们当前的方法去我们相对应映射文件中然后去写sql语句。

   /**
    *修改用户信息
    * 返回值为int(增删改返回值固定的)
    * 也可以不用返回值 设置为void
    */
   void updateUser();

   /**
    * 删除用户信息
    */
   void deleteUser();

添加映射文件:

 </insert>
   <!--void updateUser();-->
   <update id="updateUser">
      update t_user set username='ls' where id=3
   </update>
   <!--void deleteUser();-->
   <delete id="deleteUser">
      delete from t_user where id=3
   </delete>

//测试类    
@Test
   public void testCRUD() throws IOException {
       InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
       SqlSession sqlSession = sqlSessionFactory.openSession(true);
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       mapper.updateUser(); //接口的方法没有返回值了
       mapper.deleteUser();

   查询

/**
    * 根据id查询用户信息
    */
   User getUserById();
   /**
    * 查询所有的用户信息
    * 查询一条数据,对应的就是我们的实体类对象,
    * 查询多条数据,对应的就是List集合
    */
   List<User> getAllUser();

<!--User getUserById();-->
   <!--It's likely that neither a Result Type nor a Result Map was specified.
       上述:为什么报错给出的解决方案;因为我们没有去设置它的一个结果类型,
             我们当前mybatis执行完sql语句后并不知道要转换什么样的一个实体类对象
        所以必须要设置:resultType或 resultMap 结果类型之后,
            它就可以将我们查询出来的结果转换成我们所设置的结果类型,
            如果在把我们最终结果然后作为返回值返回给我们当前接口的方法
      -->
   <!--
   查询功能的标签必须设置resultType或resultMap
   resultType:设置默认的映射关系
   resultMap:设置自定义的映射关系:如果字段名跟属性名不一致的情况下,才需要用到resultMap,(多对一,一对多关系)
  查询的时候我们每个查询结果可能都不一样,所以一定要想好当前查询的结果应该是什么,
  如果你查询的结果是一条,就可以用实体类对象
  如果查询的结果是多条,就可以用list集合
   -->
   <select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
      select * from t_user where id=1
   </select>
<!-- List<User> getAllUser();   -->
   <select id="getAllUser" resultType="com.atguigu.mybatis.pojo.User">
      select * from t_user
   </select>

 

@Test
   public void testCRUD() throws IOException {
       InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
       SqlSession sqlSession = sqlSessionFactory.openSession(true);
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       
       User userById = mapper.getUserById();
       System.out.println(userById);
       List<User> allUser = mapper.getAllUser();
       allUser.forEach(user -> System.out.println(user));
  }
 

 

posted @ 2022-10-12 16:41  zjw_rp  阅读(94)  评论(0)    收藏  举报