Mybatis基础(上)

306 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

功能优化

下边实现insertUser功能的语句还可以进行优化

优化前:

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.insertUser();

优化后:

int result = sqlSession.insert("com.sentiment.mapper.UserMapper.insertUser");

log4j日志

依赖

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

log4j.xml

<?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(调试)

从左往右日志信息越来越详细

增删改查

先写个工具类

package com.sentiment.utils;
​
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
​
import java.io.IOException;
import java.io.InputStream;
​
public class SqlSeesionUtils {
    public static SqlSession getSqlSession(){
        SqlSession sqlSession;
        try {
            InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
            sqlSession = build.openSession(true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return sqlSession;
    }
}

修改配置文件UserMapper.xml,加上update语法

<update id="updateUser">
    update t_user set username='tana' where id=2;
</update>

接口类也实现一下对应的方法

public interface UserMapper {
​
    int insertUser();
​
    int updateUser();
}

之后定义个修改的方法testUpdate(),直接通过定义的工具类中获取SqlSeesion即可

public void testUpdate(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int result = mapper.updateUser();
    System.out.println(result);
    sqlSession.close();
}

和上边同理

UserMapper.xml

<delete id="deleteUser">
    delete from t_user where id=3;
</delete>

添加接口

int deleteUser();

最终实现

public void testDelete(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int result = mapper.deleteUser();
    System.out.println(result);
    sqlSession.close();
}

接口

User getUserId();
​
List<User> getUserList();

UserMaaper.xml

<select id="getUserId" resultType="com.sentiment.pojo.User">
    select * from t_user where id=1
</select>
​
<select id="getUserList" resultType="com.sentiment.pojo.User">
    select * from t_user;
</select>

实现

@Test
public void testGetUserId(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserId();
    System.out.println(user);
    sqlSession.close();
}
​
@Test
public void testGetUserList(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = mapper.getUserList();
    userList.forEach(System.out::println);
}

注意:

1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系 resultType:自动映射,用于属性名和表中字段名一致的情况 resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

2、当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常 TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值