MyBatis学习
- 官方文档:mybatis – MyBatis 3 | 简介
- Github:mybatis/mybatis-3: MyBatis SQL mapper framework for Java (github.com)
- 参考视频:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili
- 项目完整代码参考:lexiaoyuan/MyBatisStudy: My MyBatis study notes (github.com)、MyBatisStudy: 我的MyBatis学习笔记 (gitee.com)
日志
在核心配置文件中开启日志支持
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/3e641eb5f5c8cd90.webp)
SLF4J | LOG4J | LOG4J2【掌握】 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING【掌握】 | NO_LOGGING
日志工厂
<settings><setting name&#61;"logImpl" value&#61;"STDOUT_LOGGING"/>
settings>
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/b386c433a16f5497.webp?x-oss-process&#61;image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1X2JlbmphbWlu,size_16,color_FFFFFF,t_70)
LOG4J
通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;通过定义每一条日志信息的级别&#xff0c;我们能够更加细致地控制日志的生成过程。可以通过一个配置文件来灵活地进行配置&#xff0c;而不需要修改应用的代码。
<dependency><groupId>log4jgroupId><artifactId>log4jartifactId><version>1.2.17version>
dependency>
### set log levels ###
log4j.rootLogger &#61; DEBUG , C , D , E### console ###
log4j.appender.C &#61; org.apache.log4j.ConsoleAppender
log4j.appender.C.Target &#61; System.out
log4j.appender.C.layout &#61; org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern &#61; [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n### log file ###
log4j.appender.D &#61; org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File &#61; ./logs/mybatis_study.log
log4j.appender.D.Append &#61; true
log4j.appender.D.Threshold &#61; INFO
log4j.appender.D.layout &#61; org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern &#61; [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n### exception ###
log4j.appender.E &#61; org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File &#61; ../logs/mybatis_study_error.log
log4j.appender.E.Append &#61; true
log4j.appender.E.Threshold &#61; ERROR
log4j.appender.E.layout &#61; org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern &#61; [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n###mybatis show sql###
log4j.logger.com.ibatis&#61;debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource&#61;debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner&#61;debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate&#61;debuglog4j.logger.java.sql.Connection&#61;debug
log4j.logger.java.sql.Statement&#61;debug
log4j.logger.java.sql.PreparedStatement&#61;debug
<settings><setting name&#61;"logImpl" value&#61;"LOG4J"/>
settings>
import org.apache.log4j.Logger;
static Logger logger &#61; Logger.getLogger(UserDaoTest.class);&#64;Test
public void getUserLogTest(){logger.info("[info]测试方法getUserLogTest成功");logger.debug("[debug]测试方法getUserLogTest成功");logger.error("[error]测试方法getUserLogTest成功");
}
常用的方法&#xff1a;logger.info()
、logger.debug()
、logger.error()
分页
使用limit分页
select * from user limit startIndex,pageSize;
如&#xff1a;
select * from user limit 1,3;
使用MyBatis实现分页
三步曲&#xff1a;写接口–>写Mapper.xml–>写测试
- 写接口
List<User> getUserByLimit(Map<String, Integer> map);
- 写Mapper.xml
<select id&#61;"getUserByLimit" resultMap&#61;"UserMap" parameterType&#61;"map">select * from mybatis.user limit #{startIndex},#{pageSize};
select>
- 写测试
&#64;Test
public void getUserByLimitTest(){SqlSession sqlSession &#61; MyBatisUtil.getSqlSession();UserMapper mapper &#61; sqlSession.getMapper(UserMapper.class);HashMap<String, Integer> map &#61; new HashMap<String, Integer>();map.put("startIndex", 1);map.put("pageSize", 3);List<User> userByLimit &#61; mapper.getUserByLimit(map);for (User user : userByLimit) {System.out.println(user);}sqlSession.close();
}
运行结果&#xff1a;
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/e62700fe09f8933e.webp?x-oss-process&#61;image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1X2JlbmphbWlu,size_16,color_FFFFFF,t_70)
使用注解开发
public static SqlSession getSqlSession() {return sqlSessionFactory.openSession(true);
}
- 写接口&#xff0c;在接口上实现注解
&#64;Select("select * from user")
List <User> getUserAll();
&#64;Select("select * from user where id&#61;#{uid}")
User getUserById(&#64;Param("uid") int id );
&#64;Insert("insert into user(id, name, pwd) values(#{id},#{name},#{password})")
int insertUser(User user);&#64;Delete("delete from user where id&#61;#{id}")
int deleteUser(&#64;Param("id") int id);
- 在核心配置文件中绑定接口
不需要使用Mapper.xml&#xff0c;所以需要重新绑定接口&#xff0c;使用class属性
<mappers><mapper class&#61;"com.mybatis.dao.UserMapper"/>
mappers>
- 测试
&#64;Test
public void getUserAllTest(){SqlSession sqlSession &#61; MyBatisUtil.getSqlSession();UserMapper mapper &#61; sqlSession.getMapper(UserMapper.class);List<User> userAll &#61; mapper.getUserAll();for (User user : userAll) {System.out.println(user);}sqlSession.close();}&#64;Test
public void getUserByIdTest(){SqlSession sqlSession &#61; MyBatisUtil.getSqlSession();UserMapper mapper &#61; sqlSession.getMapper(UserMapper.class);User userById &#61; mapper.getUserById(3);System.out.println(userById);sqlSession.close();
}&#64;Test
public void insertUserTest(){SqlSession sqlSession &#61; MyBatisUtil.getSqlSession();UserMapper mapper &#61; sqlSession.getMapper(UserMapper.class);mapper.insertUser(new User(6, "HelloInsert", "insertHello"));sqlSession.close();
}&#64;Test
public void deleteUserTest(){SqlSession sqlSession &#61; MyBatisUtil.getSqlSession();UserMapper mapper &#61; sqlSession.getMapper(UserMapper.class);mapper.deleteUser(4);sqlSession.close();
}
- 运行结果&#xff1a;
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/8343fdbffb0056b5.webp?x-oss-process&#61;image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1X2JlbmphbWlu,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/bcafc120671304eb.webp?x-oss-process&#61;image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1X2JlbmphbWlu,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/eec57030b649a106.webp)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1e618/c5a/d5d40da532c3a782.png)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/5b97d3b808d031e2.webp)
注意&#xff1a;使用注解来映射简单语句会使代码显得更加简洁&#xff0c;然而对于稍微复杂一点的语句&#xff0c;Java 注解就力不从心了&#xff0c;并且会显得更加混乱。
关于&#64;Param()注解
- 基本类型的参数和String类型&#xff0c;需要加上
- 引用类型不需要加
- SQL语句中取的参数为&#64;Param()注解中指定的参数名
LomBok
- 访问&#xff1a;https://projectlombok.org/
偷懒神器。。。
使用&#xff1a;
-
在IDEA中安装LomBok插件
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/2fdc212433a29829.png?x-oss-process&#61;image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1X2JlbmphbWlu,size_16,color_FFFFFF,t_70)
-
导入Maven依赖
<dependencies><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.10version>dependency>
dependencies>
- 实体类上加注解
&#64;Getter
&#64;Setter
&#64;AllArgsConstructor
&#64;NoArgsConstructor
public class User {private int id;private String name;private String password;
}
- 常用注解
&#64;Setter &#xff1a;注解在类或字段&#xff0c;注解在类时为所有字段生成setter方法&#xff0c;注解在字段上时只为该字段生成setter方法。
&#64;Getter &#xff1a;使用方法同上&#xff0c;区别在于生成的是getter方法。
&#64;ToString &#xff1a;注解在类&#xff0c;添加toString方法。
&#64;EqualsAndHashCode&#xff1a; 注解在类&#xff0c;生成hashCode和equals方法。
&#64;NoArgsConstructor&#xff1a; 注解在类&#xff0c;生成无参的构造方法。
&#64;RequiredArgsConstructor&#xff1a; 注解在类&#xff0c;为类中需要特殊处理的字段生成构造方法&#xff0c;比如final和被&#64;NonNull注解的字段。
&#64;AllArgsConstructor&#xff1a; 注解在类&#xff0c;生成包含类中所有字段的构造方法。
&#64;Data&#xff1a; 注解在类&#xff0c;生成setter/getter、equals、canEqual、hashCode、toString方法&#xff0c;如为final属性&#xff0c;则不会为该属性生成setter方法。
&#64;Slf4j&#xff1a; 注解在类&#xff0c;生成log变量&#xff0c;严格意义来说是常量。