📒博客首页:崇尚学技术的科班人
🏇小肖来了
🍣今天给大家带来的文章是《Mybatis那点破事,日志、分页和注解开发》🍣
🍣Mybatis是我们常用的框架之一,它的重要性不言而喻。🍣
🍣希望各位小伙伴们能够耐心的读完这篇文章🍣
🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏
💗同时也非常感谢各位小伙伴们的支持💗
数据库中的字段:
实体类:
public class User {
private int id;
private String name;
private String password;
}
测试出现问题
<!--select id,name,pwd from mybatis.users where id=1 select id,name,pwd as password from mybatis.users where id=1 -->
解决办法:
<select id="getUserList" resultType="user">
select id,name,pwd as password from mybatis.users where id=1
</select>
结果集映射
id name pwd
id name password
UserMapper.xml
<!-- 结果集映射-->
<resultMap id="UserMap" type="User">
<!-- column 表示的是 数据库中的列 property表示的是属性-->
<result column="id" property="id"></result>
<result column="name" property="name"></result>
<result column="pwd" property="password"></result>
</resultMap>
<select id="getUser" parameterType="int" resultMap="UserMap">
select * from mybatis.users where id=#{id}
</select>
resultMap
元素是 MyBatis 中最重要最强大的元素。ResultMap
,这就是 ResultMap
的优秀之处——你完全可以不用显式地配置它们多对一的情况
如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手!
曾经:sout、debug
现在:日志工厂!
在Mybatis中具体使用Negev日志实现,在设置中设定!
STDOUT_LOGGING 标准日志输出
在mybatis核心配置文件中,配置我们的日志!
<settings>
<!-- 标准的日志实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
什么是Log4j?
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
<settings>
<!-- 标准的日志实现-->
<setting name="logImpl" value="LOG4J"/>
</settings>
简单使用步骤
static Logger logger = Logger.getLogger(UserMapperTest.class);
//test Log4j
@Test
public void testLog4j(){
logger.info("info:进入了info");
logger.error("error:进入了error");
logger.debug("debug:进入了debug");
}
思考:为什么需要分页?
语法:
select * from user limit startindex pagesize
select * from user limit 3 #[0,3]
实现分页
//实现分页
List<User> getUserListByLimit(Map<String,Integer> map);
<!-- 实现分页-->
<select id="getUserListByLimit" parameterType="map" resultMap="UserMap">
select * from mybatis.users limit #{startIndex},#{pageSize}
</select>
//实现分页测试
@Test
public void getUserListByLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList = mapper.getUserListByLimit(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
//使用RowBounds分页
List<User> getUserListByRowBounds();
<!-- RowBounds 实现分页-->
<select id="getUserListByRowBounds" resultMap="UserMap">
select * from mybatis.users
</select>
@Test
public void getUserListByRowBounds(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
RowBounds rowBounds = new RowBounds(0, 2);
List<User> userList = sqlSession.selectList("com.xiao.Dao.UserMapper.getUserListByRowBounds",null,rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
了解即可,万一以后公司的架构师说要使用,你需要知道它是什么东西
大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得更容易,规范性更好
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
而各个对象之前的协作关系则成为系统设计的关键,小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容,面向接口编程就是指按照这种思想来编程。关于接口的理解
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
接口应有两类:
第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
一个体有可能有多个抽象面,抽象体与抽象面是有区别的
三个面向区别
@Select("select * from users")
List<User> getUserList();
<mappers>
<!-- <mapper resource="com/xiao/Dao/UserMapper.xml" />-->
<mapper class="com.xiao.Dao.UserMapper"></mapper>
</mappers>
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
//通过它获得接口
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList();
for (User user : userList){
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
本质:反射机制实现
底层:动态代理!
Mybatis详细执行流程:
接口:
@Select("select * from users where id=#{id}")
User getUserById(@Param("id") int id);
@Insert("insert into users (id,name,pwd) values(#{id},#{name},#{pwd})")
int insertUser(User user);
@Update("update users set name=#{name},pwd=#{pwd} where id=#{id}")
int updateUser(User user);
@Delete("delete from users where id = #{id}")
int deleteUser(@Param("id") int id);
测试类:
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
//通过它获得接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
/* List<User> userList = userDao.getUserList(); for (User user : userList){ System.out.println(user); } User user = mapper.getUserById(1); System.out.println(user); int hello = mapper.insertUser(new User(4, "hello", "125324")); mapper.updateUser(new User(4,"to","123456")); */
//关闭SqlSession
sqlSession.close();
}
[注意:我们必须要将接口注册绑定到我们的核心配置文件中!]
关于@Param()注解
@Param()
中设定的属性名#{} 和 ${} 的区别
简介:
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对
应的注解,可以在编译源码的时候生成对应的方法
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
}
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass
Lombok config system
Code inspections
Refactoring actions (lombok and delombok)
常用的:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
@Getter and @Setter
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_56727438/article/details/121911971
内容来源于网络,如有侵权,请联系作者删除!