首页 > 其他 > 详细

mybatis总结

时间:2021-06-11 12:11:37      阅读:26      评论:0      收藏:0      [点我收藏+]

1.步骤

第一步

导入各种依赖

<!--        mysql驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.1.47</version>
       </dependency>
<!--       mybatis驱动-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.2</version>
       </dependency>
<!--       junit驱动-->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
       </dependency>

 

第二步

配置pom.xml的 maven

<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>

第三步

编写util包 死的

?
package com.Util;
?
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 Util {
   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 static SqlSession getSession(){
       //自动提交 增删查改不用写提交了
       return sqlSessionFactory.openSession(true);
  }
}

 

第四步

写核心配置文件

db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?userSSL=true&userUnicode=true&characterEncoding=utf8
username=root
password=123456
mybatis-config.xml文件
<?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>
  <!--引入外部配置文件-->
   <properties resource="db.properties">
       <!--在外部增加配置项 可以不要-->
       <property name="name" value="李一博"/>
   </properties>
?
   <settings>
       <!--开启日志-->
       <setting name="logImpl" value="STDOUT_LOGGING"/>
       <!--开启全局缓存-->
       <setting name="cacheEnabled" value="true"/>
   </settings>
   <!--别名-->
   <typeAliases>
       <typeAlias type="hkd.pojo.Blog" alias="blog"/>
   </typeAliases>
?
   <environments default="development">
       <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>
   </environments>
</configuration>

第五步

写接口的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.hkd.Dao.userMapper">
           <!--接口对应的方法名 返回类型-->
   <select id="getUser" resultType="Signon">
      select *
      from signon;
   </select>
  <!--带参数的-->
   <select id="getUserByLimit" parameterType="map" resultType="Signon">
      select *
      from signon
      limit #{startIndex},#{pageSize};
   </select>
</mapper>

第六步

实例化对象

SqlSession sqlSession = Util.getSession();
//实例化对象 mapper
userMapper mapper = sqlSession.getMapper(userMapper.class);
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",3);
//用实例化对象进行操作
List<Signon> signonList = mapper.getUserByLimit(map);
for (Signon signon : signonList) {
   System.out.println(signon);
}
//切记关闭
sqlSession.close();

 

2.知识点

核心配置文件

引入外部配置

  <!--引入外部配置文件-->
<properties resource="db.properties">
   <!--在外部增加配置项 可以不要-->
   <property name="name" value="李一博"/>
</properties>

setting

  • name : logImpl value: SLF4J LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

<settings>
<!--默认日志 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>

别名

  • 用一种就行

  • 用的时候自己注释掉另一个

<typeAliases>
<!--这个方法 的这个别名谁便取-->
<typeAlias type="hkd.pojo.Blog" alias="blog"/>

<!--还有一种 扫描包-->
<!--扫描包 别名就是包名的小写 在实体类添加注解可以谁便改名-->
<package name="com.hkd.pojo"/> <!--@Alias("hello")--->
</typeAliases>

mapper

  • 二者选其一

<mappers>
<mapper resource="hkd/Dao/BologMapper.xml"/>
<!--扫描包-->
<!-- 这个更常用 注意接口名与Mybatis的映射文件名一定要一模一样。-->
<mapper class="hkd.Dao.BolgMapper"/>
</mappers>

接口xml中

返回值和实体类属性名不一致

  • 1.起别名

    select username username,password pwd from signon;
  • 2通过 resultMap 进行映射

              <!--对应的名         要映射的对象-->
    <resultMap id="signon" type="com.pojo.Signon">
    <!--数据库对象 实体类对象属性-->
    <result column="username" property="username"/>
    <result column="password" property="pwd"/>
    </resultMap>
    <!--起的名-->
    <select id="getSignon" resultMap="signon">
    select * from signon;
    </select>

使用注解开发

  • 核心配置文件必须是扫描包

    <mappers>
    <mapper class="hkd.Dao.UserMapper"/>
    </mappers>
  • 写法


public interface UserMapper {
@Select("select * from Signon")
List<Signon> getuser();
//@Param("name") 可写可不写 写了就要按里面来 **最好写上**
@Select("Select * from Signon where username = #{name}")
Signon getSignonByUserName(@Param("name") String username);

//CRUD
@Insert("insert into signon(username,password) values (#{username},#{password})")
int addSignon(Signon signon);

@Update("update signon set password = #{password} where username = #{username} ")
int updateSignon(Signon signon);
}

 

Lombok插件

偷懒用的

  • 1 在pom.xml中导入

    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    </dependency>
    </dependencies>
  • 2下载插件

技术分享图片

  • 3在实体类里面写

    @Data   //基本的
    @NoArgsConstructor //无参
    @AllArgsConstructor //全参

     

一对多

    <select id="getItem" resultMap="itemInventory">
SELECT im.itemid id,im.listprice price,iy.qty qty FROM item im,inventory iy WHERE im.itemid = iy.itemid;
</select>
<resultMap id="itemInventory" type="hkd.pojo.Item">
<result column="id" property="itemid"/>
<result column="price" property="listprice"/>
<!--对象是association javaType 多对一
集合是collection ofType 泛型 一对多
javaType 用来指定实体类中属性类型
ofType用来映射到List或者集合中的pojo类型 泛型中的类型
-->
<association property="inventory" javaType="hkd.pojo.Inventory" >
<result column="qty" property="qty"/>
</association>
</resultMap>

动态SQL

有点像jstl

SQL片断

  • 不建议使用

    <!--sql片段 把冗余的部分提取出来  通过id找到-->
<sql id="if-title-author">
<if test="title!=null">
and title = #{title}
</if>
<if test="author!=null">
and author = #{author}
</if>
</sql>

<!--用-->
<select id="queryBlogIf" parameterType="map" resultType="blog">
/*这个是动态查询 要是存在就加上不存在忽略 这就是动态的sql*/
select *
from test.blog
<where>
<include refid="if-title-author"></include>
</where>
</select>

if

<!--判断条件-->
<if test="title!=null">
and title = #{title}
</if>

where

  • 就是sql里面的where 不过他可以修复sql 比如去掉多余的and/or

<where>
<if test="title!=null">
and title = #{title}
</if>
<if test="author!=null">
and author = #{author}
</if>
</where>

choose

<where>
<choose>
<when test="title!=null">
title = #{title}
</when>
<when test="author!=null">
and author = #{author}
</when>
<otherwise>
and views &lt; #{views}
</otherwise>
</choose>
</where>

set

  • 用在update语句里面 他可以忽略 ,

update test.blog
<set>
<if test="title!=null">
title = #{title},
</if>
<if test="author!=null">
author = #{author},
</if>
</set>
where id = #{id};

foreach

  • 有点像for循环

select *
from test.blog
where 1=1 and (title =‘Mybatis进阶‘ or title = ‘Mybatis‘ )
  • 对应

<select id="queryBlogForeach" parameterType="map" resultType="blog">
select *
from test.blog
<where>
<foreach collection="titles" item="title" open="and (" close=")" separator="or">
title = #{title}
</foreach>
</where>
</select>
collection   集合    外面传进来的map里面的 
item 集合里面的每一项
open 开始的地方
close 结束的地方
separator 间隔
and (title = ‘Mybatis进阶‘ or title = ‘Mybatis‘ )
open="and (" separator= "or" close=")"

缓存

一级缓存

一级缓存
缓存就是不用重复走sql语句 提高效率
增删查 会清理缓存
手动清理缓存 sqlSession.clearCache();

二级缓存

  • 1 开启全局缓存 核心配置文件里面

     <!--开启全局缓存-->
    <setting name="cacheEnabled" value="true"/>
  • 2 在接口的xml里面写

      <cache/>
/* 二级缓存
先在核心配置文件中开启全局缓存
<setting name="cacheEnabled" value="true"/>
然后 在xml里面开启二级缓存
<cache/>

机制当前sqlsession关闭了之后会把东西留到二级缓存里面
当下一次查询的时候会先到二级缓存里面看看 直接读取
也就是说只有当前会话提交或关闭时会提交到二级缓存中
注:
要对实体类开启序列化 implements Serializable
要不然报错
*/

3.问题及解决

 

1 问题1

  • InputStream inputStream = Resources.getResourceAsStream(resource); 包导不进去

    却发现apache处爆红,按快捷键Add Maven Dependency, 发现org.apache.ibatis.io.Resources是属于org.mybatis包下的, 但我在pom.xml中已经添加了该依赖,我以为是版本错误,我将org.mybatis 3.4.5版本删了, 重新换成了3.4.6版本,但还是爆红,我去本地仓库可以发现org.mybatis包存在, 并不是org.mybatis包没导入的问题,应该是还有其他依赖包没有导入, 我重新在file --> Project Structrue Libraries --> + --> From maven , 在搜索框,输入org.mybatis搜索时, 发现 下拉列表有org.mybatis.maven:maven-migration-plugin:1.0.0, 将该插件添加到项目的lib中问题就解决了。 donload里面就好了

2 问题2

找不到resource //就写个他的名字就行 String resource = "mybatis-config.xml";

3 问题3

<mappers> <!--这个中间是/ 找到自己写的配置文件--> <mapper resource="com/hkd/Dao/UserMapper.xml"/> </mappers>

4 问题4

乱码导致运行失败 jdbc:mysql://localhost:3306/bookstore?userSSL=true&userUnicode=true&characterEncoding=utf8

 

mybatis总结

原文:https://www.cnblogs.com/bxl-lyb/p/14874273.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!