Mybatis ResultMap和分页操作示例详解
作者:phang
1. ResultMap
现有数据库的字段为:
- id
- name
- pwd
为了其字段的名字,在pojo中的User的字段名和其一样:
@Data @AllArgsConstructor @NoArgsConstructor public class User { int id; String name; String pwd; }
UserMapper.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dao.UserMapper"> <select id="getAllUser" resultType="com.pojo.User"> select * from user </select> </mapp
这样能保证不会出错。若是将User的“pwd”改为“password”,则对应的password结果就会为空。
解决该问题,
方法一:"as"
<select id="getAllUser" resultType="com.pojo.User"> select id, name, pwd as password from user </select>
User字段的为“password”,数据库字段为“pwd”,那就使用Sql的原生语句as,就可以将查询字段和User中字段相对应。
方法二:resultMap(结果映射)
可以使用 <ResultMap>标签将数据库中的字段和User中的字段相对应:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dao.UserMapper"> <resultMap id="UserMapper" type="com.pojo.User"> <!-- column是数据库表的列名 , property是对应实体类的属性名 --> <result column="id" property="id"/> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap> <select id="getAllUser" resultMap="UserMapper"> select * from user </select> </mapper>
其中,单独设置resultMap标签,来使数据库中的字段和User对应上。 resultMap中的id 对应着 <select>标签中的resultMap (原来为resultType)
2. 日志
日志工厂
思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?
如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。
对于以往的开发过程,我们会经常使用到debug模式来调节,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。
使用方法:
在 mybatis-config.xml 中添加。
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
注意:日志功能的开启是 name = "logImpl", value的值就是各种类型的日志。
注意:
- value="STDOUT_LOGGING"中不能出现空格,例如 value="STDOUT_LOGGING "就是错误的。
- STDOUT_LOGGING是标准输出日志
Log4j
- Log4j是Apache的一个开源项目
- 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件....
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
- 要使用 Log4j首先导入相关的包:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 创建 log4j.properties 配置文件:
#将等级为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
- 配置 log4j的实现:
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
- log4j简单使用:
- 导入的包是org.apache.log4j.Logger
一个配置完整的 settings 元素的示例如下:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
3. 分页
在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
Limit 分页
#语法 SELECT * FROM table LIMIT stratIndex,pageSize SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 #为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. #如果只给定一个参数,它表示返回最大的记录行数目: SELECT * FROM table LIMIT 5; //检索前 5 个记录行 #换句话说,LIMIT n 等价于 LIMIT 0,n。
步骤:
- UserMapper接口中添加:
//选择全部用户实现分页 List<User> selectUser(Map<String,Integer> map);
- UserMapp.xml中添加:
<select id="selectUser" parameterType="map" resultType="com.pojo.user"> select * from user limit #{startIndex},#{pageSize} </select>
- Test:
@Test public void testLimitUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String,Integer> map = new HashMap<String,Integer>(); map.put("indexPage",0); map.put("endPage",2); List<User> userList = userMapper.getLimitByUser(map); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
4. 注解开发
mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建。
sql 类型主要分成 :
- @Select ()
- @Update ()
- @Insert ()
- @Delete ()
注意:利用注解开发就不需要mapper.xml映射文件了 .
在mybatis-config.xml这样导入:
<mappers> <mapper class="com.dao.UserMapper" /> </mappers>
区别于之前的mapper.xml的导入:
<mappers> <mapper resource="com/dao/UserMapper.xml"/> </mappers>
为了实现事务的提交,在MyBatis中:
public class MyBatisUtils { static SqlSessionFactory sqlSessionFactory; static { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
中对sqlSessionFactory.openSession()的参数设置:
sqlSessionFactory.openSession(true);
就可以实现自动提交事务。
查询
编写接口方法注解
//根据id查询用户 @Select("select * from user where id = #{id}") User selectUserById(@Param("id") int id);
- 测试
@Test public void testSelectUserById() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user); session.close(); }
新增
//添加一个用户 @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user);
Test:
@Test public void testAddUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(6, "秦疆", "123456"); mapper.addUser(user); session.close(); }
修改
//修改一个用户 @Update("update user set name=#{name},pwd=#{pwd} where id = #{id}") int updateUser(User user);
删除
//根据id删除用 @Delete("delete from user where id = #{id}") int deleteUser(@Param("id")int id);
Test:
@Test public void testDeleteUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); mapper.deleteUser(6); session.close(); }
注意:
- 增删改一定记得对事务的处理
- 注释的话,一定要把类通过<mappers class="">注册到 mybatis-config.xml 中去;配置的话,一定要把UserMapper.xml(xxMapper.xml)通过<mappers resouce="">注册到 mybatis-config.xml 中去
@Param
@Param注解用于给方法参数起一个名字。以下是总结的使用原则:
- 在方法只接受一个参数的情况下,可以不使用@Param。
- 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
- 如果参数是 JavaBean , 则不能使用@Param。
- 不使用@Param注解时,参数只能有一个,并且是Javabean。
以上就是Mybatis ResultMap和分页操作示例详解的详细内容,更多关于Mybatis ResultMap分页的资料请关注脚本之家其它相关文章!