mybatis学习笔记(mybatis入门案例)

  本篇文章为你整理了mybatis学习笔记(mybatis入门案例)的详细内容,包含有mybatis快速入门 mybatis入门案例 mybatis csdn mybatis入门书籍 mybatis学习笔记,希望能帮助你了解 mybatis学习笔记。

  1.1、什么是 MyBatis?

  MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

  1.2、持久化

  数据持久化

  持久化就是将程序的数据在持久状态和瞬时状态转化的过程

  内存:断电即失

  数据库(Jdbc), io文件持久化。

  生活:冷藏.罐头。

  为什么需要需要持久化?

  有一些对象,不能让他丢掉。

  内存太贵了

  1.3、持久层

  Dao层,Service层,Controller层...

  完成持久化工作的代码块

  层界限十分明显。

  1.4、为什么需要Mybatis

  帮助程序猿将数据存入到数据库中。

  传统的JDBC代码太复杂了。简化。框架。自动化。

  不用Mybatis也可以。 更容易上手。技术没有高低之分

  优点:简单

  sq和代码的分离,提高了可维护性。

  提供映射标签,支持对象与数据库的orm字段关系映射

  提供对象关系映射标签,支持对象关系组建维护

  提供xml标签,支持编写动态sql。

  
`id` int(0) NOT NULL AUTO_INCREMENT,

   `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT null,

   `pwd` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

   PRIMARY KEY (`id`) USING BTREE

  ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

  
INSERT INTO `user` VALUES (1, 老大, 123456);

  INSERT INTO `user` VALUES (2, 李二, 123456);

  INSERT INTO `user` VALUES (3, 张三, 123456);

  INSERT INTO `user` VALUES (4, 李四, 123456);

  

 

 

  新建一个maven项目

  导入依赖

  

 dependencies 

 

   dependency

   groupId mysql /groupId

   artifactId mysql-connector-java /artifactId

   version 8.0.29 /version

   /dependency

   !-- https://mvnrepository.com/artifact/org.mybatis/mybatis --

   dependency

   groupId org.mybatis /groupId

   artifactId mybatis /artifactId

   version 3.5.10 /version

   /dependency

   dependency

   groupId junit /groupId

   artifactId junit /artifactId

   version 3.8.1 /version

   /dependency

   /dependencies

  

 

  编写Mybatis的核心配置文件

  

 ?xml version="1.0" encoding="UTF-8" ? 

 

   !DOCTYPE configuration

   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

   "http://mybatis.org/dtd/mybatis-3-config.dtd"

   configuration

   environments default="development"

   environment id="development"

   transactionManager type="JDBC"/

   dataSource type="POOLED"

   property name="driver" value="com.mysql.cj.jdbc.Driver"/

   property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 amp;serverTimezone=UTC amp;useSSL=false"/

   property name="username" value="root"/

   property name="password" value="123456"/

   /dataSource /environment /environments

   /configuration

  

 

  2.2、第一个mybati程序

  编写Mybatis工具类

  

public class MybatisUtil { 

 

   private static SqlSessionFactory sqlSessionFactory;

   static {

   try{

   String resource = "mybatis-config.xml";

   InputStream inputStream = Resources.getResourceAsStream(resource);

   sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

   }catch (IOException e){

   e.printStackTrace();

   public SqlSession getSqlSession(){

   return sqlSessionFactory.openSession();

  

 

  编写代码

  

@Test 

 

  public void t(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   List User userList = mapper.getUserList();

   for (User user : userList) {

   System.out.println(user);

   sqlSession.close();

  

 

  2.3、比较容易出现的问题

  1、全局配置文件没有注册mapper,mapper配置路径要用 / 隔开

  

 ?xml version="1.0" encoding="UTF-8" ? 

 

   !DOCTYPE configuration

   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

   "http://mybatis.org/dtd/mybatis-3-config.dtd"

   configuration

   environments default="development"

   environment id="development"

   transactionManager type="JDBC"/

   dataSource type="POOLED"

   property name="driver" value="com.mysql.cj.jdbc.Driver"/

   property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 amp;serverTimezone=UTC amp;useSSL=true"/

   property name="username" value="root"/

   property name="password" value="123456"/

   /dataSource

   /environment

   /environments

   mappers

   mapper resource="com/zh/mapper/UserMapper.xml" /mapper

   /mappers

   /configuration

  

 

  2、mapper映射文件

  

 ?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.zh.mapper.UserMapper" 一个命名空间对应一个dao类

   select id="getUserList" resultType="com.zh.pojo.User" //id对应方法。返回结果对实体类对象

   select * from mybatis.user

   /select

   /mapper

  

 

  3、资源文件导出问题,由于maven项目的约定大于配置,默认只会导出resources目录的文件,但是在mybatis项目中,mapper推荐把映射配置文件放在和dao类同一级目录,会导致加载不到配置文件,所以要进行设置

  

 build 

 

   resources

   resource

   directory src/main/resources /directory

   includes

   include **/*.properties /include

   include **/*.xml /include

   /includes

   filtering true /filtering

   /resource

   resource

   directory src/main/java /directory

   includes

   include **/*.properties /include

   include **/*.xml /include

   /includes

   filtering true /filtering

   /resource

   /resources

   /build

  

 

  3、CRUD

  namespace:namespace中的包名要和Dao/mapper接口的包名一致!

  数据的增删改需要手动提交数据!!!

  **#{}是预编译处理,mybatis在处理#{}时,会将其替换成"?",再调用PreparedStatement的set方法来赋值。

  ${}是拼接字符串,将接收到的参数的内容不加任何修饰的拼接在SQL语句中,会引发SQL注入问题

  select

  id:就是对应的namespace中的方法名;

  resultType: Sq语句执行的返回值

  parameterType :参数类型(可以是对象)
 

  1.编写接口

  

User getUserById(int id);

 

  

 

  2.编写对应的mapper中的sq语,属性可以直接调用

  

 select id="getUserById" resultType="com.zh.pojo.User" 

 

   select * from user where id=#{id}

   /select

  

 

  3.测试

  

public void t2(){ 

 

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   User user = mapper.getUserById(1);

   System.out.println(user);

   sqlSession.commit();

   sqlSession.close();

  

 

  Insert

  

int addUser(User user);

 

   insert id="addUser" parameterType="com.zh.pojo.User"

   insert into user(id,name,pwd) value (#{id},#{name},#{pwd})

   /insert

  
SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   int num = mapper.addUser(new User(5, "张三", "123321"));

   System.out.println(num);

   sqlSession.commit();

   sqlSession.close();

  

 

  update

  

int updateUser(User user);

 

  
update id="updateUser" parameterType="com.zh.pojo.User"

   update user set name = #{name},pwd=#{pwd}where id=#{id};

   /update

  
SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   int num = mapper.updateUser(new User(5, "哈哈哈哈", "123321"));

   System.out.println(num);

   sqlSession.commit();

   sqlSession.close();

  

 

  Delete

  

 

 

  int delUser(int id);

   delete id="delUser" parameterType="int"

   delete from user where id=#{id}

   /delete

  @Test

  public void t5(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   int i = mapper.delUser(5);

   System.out.println(i);

   sqlSession.commit();

   sqlSession.close();

  

 

  4、配置解析

  configuration(配置)

  properties(属性)

  settings(设置)

  typeAliases(类型别名)

  typeHandlers(类型处理器)

  objectFactory(对象工厂)

  plugins(插件)

  environments(环境配置)

  environment(环境变量)

  transactionManager(事务管理器)

  dataSource(数据源)

  
configuration 配置文件中,对标签的顺序有规定:

  

The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

 

  

 

  4.1、properties(属性)

  这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:

  

 properties resource="org/mybatis/example/config.properties" 

 

   property name="username" value="dev_user"/

   property name="password" value="F2Fa3!33TYyg"/

   /properties

  

 

  设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:

  

 dataSource type="POOLED" 

 

   property name="driver" value="${driver}"/

   property name="url" value="${url}"/

   property name="username" value="${username}"/

   property name="password" value="${password}"/

   /dataSource

  

 

  这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由 config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。

  也可以在 SqlSessionFactoryBuilder.build() 方法中传入属性值。例如:

  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);

  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);

  如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:

  首先读取在 properties 元素体内指定的属性。

  然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。

  最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

  因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。

  4.2、settings(设置)

  
lazyLoadingEnabled

  延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。

  true / false

  false

  
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

  SLF4J / LOG4J / LOG4J2 / JDK_LOGGING / COMMONS_LOGGING / STDOUT_LOGGING / NO_LOGGING

  
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

  

 

 

  4.3、typeAliases(类型别名)

  类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如

  

 typeAliases 

 

   typeAlias alias="Author" type="domain.blog.Author"/

   typeAlias alias="Blog" type="domain.blog.Blog"/

   typeAlias alias="Comment" type="domain.blog.Comment"/

   typeAlias alias="Post" type="domain.blog.Post"/

   typeAlias alias="Section" type="domain.blog.Section"/

   typeAlias alias="Tag" type="domain.blog.Tag"/

   /typeAliases

  

 

  当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。

  也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

  

 typeAliases 

 

   package name="domain.blog"/

   /typeAliases

  

 

  每一个在包domain.blog中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如domain.blog.Author的别名为author;若有注解,则别名为其注解值。见下面的例子:

  

@Alias("author")

 

  public class Author {

  

 

  4.4、环境配置(environments)

  MyBatis可以配置成适应多种环境

  通过 default="development" 来选择环境

  

 environments default="development" //通过选择环境id选择环境

 

   environment id="development"

   transactionManager type="JDBC"/ //默认事务处理

   dataSource type="POOLED" //默认使用连接池

   property name="driver" value="${driver}"/

   property name="url" value="${url}"/

   property name="username" value="${username}"/

   property name="password" value="${password}"/

   /dataSource

   /environment

  
property name="username" value="${username}"/

   property name="password" value="${password}"/

   /dataSource

   /environment /environments

  

 

  注意一些关键点:

  默认使用的环境 ID(比如:default="development")。

  每个 environment 元素定义的环境 ID(比如:id="development")。

  事务管理器的配置(比如:type="JDBC")。

  数据源的配置(比如:type="POOLED")。

  默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。

  事务管理器(transactionManager)

  在 MyBatis 中有两种类型的事务管理器(也就是 type="JDBCMANAGED"):

  JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

  MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:

  提示如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

  这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们

  尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择-种环境。
 

  学会使用配置多套运行环境!
 

  Mybatis默认的事务管理器就是JDBC,连接池: POOLED

  4.5、mappers(映射器)

  既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括file:///形式的 URL),或类名和包名等。例如:

  

 !-- 使用相对于类路径的资源引用 -- 

 

   mappers

   mapper resource="org/mybatis/builder/AuthorMapper.xml"/

   mapper resource="org/mybatis/builder/BlogMapper.xml"/

   mapper resource="org/mybatis/builder/PostMapper.xml"/

   /mappers

  

 

  

 !-- 使用完全限定资源定位符(URL) -- 

 

   mappers

   mapper url="file:///var/mappers/AuthorMapper.xml"/

   mapper url="file:///var/mappers/BlogMapper.xml"/

   mapper url="file:///var/mappers/PostMapper.xml"/

   /mappers

  

 

  

 !-- 使用映射器接口实现类的完全限定类名 -- 

 

   mappers

   mapper /

   mapper /

   mapper /

   /mappers

  

 

  

 !-- 将包内的映射器接口实现全部注册为映射器 -- 

 

   mappers

   package name="org.mybatis.builder"/

   /mappers

  

 

  4.6、其他配置

  typeHandlers (类型处理器)

  objectFactory (对象工厂)

  plugins插件

  mybatis-generator-core

  mybatis-plus

  通用mappe

  
4.7、生命周期和作用域

  生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。

  SqlSessionFactoryBuilder:

  一旦创建了SqlSessionFactory, 就不再需要它了

  SqlSessionFactor

  说白了就是可以想象为:数据库连接池

  SqlSessionFactory 一-旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。

  因此SqISessionFactory的最佳作用域是应用作用域。

  最简单的就是使用单例模式或者静态单例模式。

  SqISession

  连接到连接池的一个请求!

  SqISession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用** 域。

  用完之后需要赶紧关闭,否则资源被占用

  5、处理字段与属性名不一样的问题

  实体类中的字段:id name password
 

  数据库中的字段:id name pwd

  执行查询语句

  

User{id=1, name=老大, password=null}

 

  User{id=2, name=李二, password=null}

  User{id=3, name=张三, password=null}

  

 

  会发现,字段名不一样,导致查询到的字段值为空

  原始解决办法:select id,name,pwd as password from user

  

User{id=1, name=老大, password=123456}

 

  User{id=2, name=李二, password=123456}

  User{id=3, name=张三, password=123456}

  

 

  显示使用resultMap

  

 mapper namespace="com.zh.mapper.UserMapper" 

 

   select id="getUserList" resultMap="resUser"

   select * from user

   /select

   resultMap id="resUser" type="User"

   result column="id" property="id"/

   result column="name" property="name"/

   result column="pwd" property="password"/

   /resultMap

   /mapper

  

 

  结果

  

User{id=1, name=老大, password=123456}

 

  User{id=2, name=李二, password=123456}

  User{id=3, name=张三, password=123456}

  

 

  官方文档:

  

 !-- SQL 映射 XML 中 -- 

 

   select id="selectUsers" resultType="User"

   select id, username, hashedPassword

   from some_table

   where id = #{id}

   /select

  

 

  在这些情况下,MyBatis 会在幕后自动创建一个ResultMap,再根据属性名来映射列到 JavaBean 的属性上。如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。比如:

  

 select id="selectUsers" resultType="User" 

 

   select

   user_id as "id",

   user_name as "userName",

   hashed_password as "hashedPassword"

   from some_table

   where id = #{id}

   /select

  

 

  在学习了上面的知识后,你会发现上面的例子没有一个需要显式配置ResultMap,这就是ResultMap的优秀之处——你完全可以不用显式地配置它们。 虽然上面的例子不用显式配置ResultMap。 但为了讲解,我们来看看如果在刚刚的示例中,显式使用外部的resultMap会怎样,这也是解决列名不匹配的另外一种方式。

  

 resultMap id="userResultMap" type="User" 

 

   id property="id" column="user_id" /

   result property="username" column="user_name"/

   result property="password" column="hashed_password"/

   /resultMap

  

 

  然后在引用它的语句中设置resultMap属性就行了(注意我们去掉了resultType属性)。比如:

  

 select id="selectUsers" resultMap="userResultMap" 

 

   select user_id, user_name, hashed_password

   from some_table

   where id = #{id}

   /select

  

 

  6.1、日志工厂

  1、标准日志工厂

  

 settings 

 

   setting name="logImpl" value="STDOUT_LOGGING"/

   /settings

  

 

  

Logging initialized using class org.apache.ibatis.logging.stdout.StdOutImpl adapter.

 

  PooledDataSource forcefully closed/removed all connections.

  PooledDataSource forcefully closed/removed all connections.

  PooledDataSource forcefully closed/removed all connections.

  PooledDataSource forcefully closed/removed all connections.

  Opening JDBC Connection

  Created connection 359742806.

  Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@15713d56]

  == Preparing: select * from user

  == Parameters:

   == Columns: id, name, pwd

   == Row: 1, 老大, 123456

   == Row: 2, 李二, 123456

   == Row: 3, 张三, 123456

   == Row: 5, 张三, 123321

   == Row: 6, 哈哈哈哈, 123321

   == Row: 7, 张三, 123321

   == Total: 6

  User{id=1, name=老大, password=123456}

  User{id=2, name=李二, password=123456}

  User{id=3, name=张三, password=123456}

  User{id=5, name=张三, password=123321}

  User{id=6, name=哈哈哈哈, password=123321}

  User{id=7, name=张三, password=123321}

  Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@15713d56]

  Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@15713d56]

  Returned connection 359742806 to pool.

  

 

  4.2 Log4j

  什么是Log4j?

  Log4j是Apache的一一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUl组件

  我们也可以控制每-条日志的输出格式;

  通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

  通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

  1、导入log4j包

  

 !-- https://mvnrepository.com/artifact/log4j/log4j -- 

 

   dependency

   groupId log4j /groupId

   artifactId log4j /artifactId

   version 1.2.17 /version

   /dependency

  

 

  2、配置文件

  

#将等级为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/logFile.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

  

 

  3、代码中运用

  

private static Logger logger=Logger.getLogger(MapperTest.class); 

 

  @Test

  public void test01(){

   logger.debug("debug");

   logger.info("info");

   logger.warn("warn");

   logger.error("error");

  [DEBUG][22-08-19][com.zh.mapper.MapperTest]debug

  [INFO][22-08-19][com.zh.mapper.MapperTest]info

  [WARN][22-08-19][com.zh.mapper.MapperTest]warn

  [ERROR][22-08-19][com.zh.mapper.MapperTest]error

  

 

  1、SQL语句 limit

  2、RowBounds

  

@Test 

 

  public void Test01(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   List User userList = sqlSession.selectList("com.zh.mapper.UserMapper.getUserList", null, new RowBounds(0, 2));

   for (User user : userList) {

   System.out.println(user);

   sqlSession.close();

  

 

  3、MyBatis 分页插件 PageHelper

  8、使用注解开发

  1、注解执行SQL

  接口方法上注解

  

public interface UserMapper { 

 

   @Select("select * from user")

   List User getUserList();

  

 

  全局配置文件中去配置mapper

  

 mappers 

 

   mapper /

   /mappers

  

 

  2、多参数SQL语句

  多参数SQL语句会出现问题

  

@Select("select * from user where id=#{id} and name=#{name}")

 

  List User getUserList(int id,String name);

  @Test

  public void t(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   Map map = new HashMap();

   List User userList = mapper.getUserList(1,"老大");

   for (User user : userList) {

   System.out.println(user);

   sqlSession.close();

  Cause: org.apache.ibatis.binding.BindingException: Parameter id not found. Available parameters are [arg1, arg0, param1, param2]

  

 

  解决办法:

  1、map传参
 

  严格来说,map适用几乎所有场景,但是我们用得不多。原因有两个:首先,map是一个键值对应的集合,使用者要通过阅读它的键,才能明了其作用;其次,使用map不能限定其传递的数据类型,因此业务性质不强,可读性差,使用者要读懂代码才能知道需要传递什么参数给它,所以不推荐用这种方式传递多个参数。

  

@Select("select * from user where id=#{id} and name=#{name}") 

 

  List User getUserList(Map String,Object map);

  @Test

  public void t(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   Map String,Object map = new HashMap();

   map.put("id","1");

   map.put("name","老大");

   List User userList = mapper.getUserList(map);

   for (User user : userList) {

   System.out.println(user);

   sqlSession.close();

  User{id=1, name=老大, password=null}

  

 

  2、使用注解传递多个参数
 

  MyBatis为开发者提供了一个注解@Param(org.apache.ibatis.annotations.Param),可以通过它去定义映射器的参数名称,使用它可以得到更好的可读性 这个时候需要修改映射文件的代码,此时并不需要给出parameterType属性,让MyBatis自动探索便可以了

  

@Select("select * from user where id=#{id} and name=#{name}") 

 

  List User getUserList(@Param("id") int id,@Param("name") String name);

  @Test

  public void t(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   Map String,Object map = new HashMap();

   List User userList = mapper.getUserList(1,"老大");

   for (User user : userList) {

   System.out.println(user);

   sqlSession.close();

  Preparing: select * from user where id=? and name=?

  == Parameters: 1(Integer), 老大(String)

   == Columns: id, name, pwd

   == Row: 1, 老大, 123456

  

 

  3、使用JavaBean传参
 

  在 mapperx.xml 配置中知道参数类型即。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: