mybatis小结

这篇博客详细总结了MyBatis的使用,包括模糊查询、配置优化、实体类别名、映射器绑定方式、结果集映射、日志工厂的设置、分页实现、注解操作、复杂查询(多对一、一对多)、动态SQL的多种语句以及一级缓存和二级缓存的原理和应用。通过对Log4j的配置和Lombok的介绍,展示了MyBatis的日志管理和代码简洁化的实践。
摘要由CSDN通过智能技术生成

1、模糊查询

1.1、UserMapper

//模糊查询
List<User> getUserLike(String value);

1.2、UserMapper.xml

<select id="getUserLike" resultType="com.jin.pojo.User">
    select * from user.user where name like "%"#{value}"%"
</select>

2、配置之属性优化

2.1、dp.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=admin

2.2、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="dp.properties"/>

    <typeAliases>
        <typeAlias type="com.jin.pojo.User" alias="User"/>
    </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>
    <mappers>
        <mapper resource="com/jin/dao/UserMapper.xml"/>
    </mappers>
</configuration>

3、实体类别名

<!--可以给实体类起别名-->
1. <typeAlias type="com.kuang.pojo.User" alias="User"/> 别名是User  实体类较少时使用
2. <typeAlias type="com.kuang.pojo"/>  别名是类名小写   实体类较多时使用

4、映射器(mapper)

4.1、使用resource绑定

<mappers>
    <mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>

4.2、使用class文件绑定

<mappers>
    <mapper class="com.kuang.dao.UserMapper"/>
</mappers>

注意点:

接口和它的Mapper配置文件必须同名

接口和它的Mapper配置文件必须在同一个包下

4.3、使用扫描包进行注入绑定

<mappers>
    <package name="com.kuang.dao"/>
</mappers>

注意点:

接口和它的Mapper配置文件必须同名

接口和它的Mapper配置文件必须在同一个包下

5、结果集映射

    <!--解决属性名和数据库字段名不一样
      1.起别名法:select id,name,pwd as password from user.user where id = #{id}
      2.resultMap
    -->

    <select id="getUserById" resultMap="UserMap">
       select * from user.user where id = #{id}
    </select>
    <!--结果集映射-->
    <resultMap id="UserMap" type="User">
        <!--属性名和数据库字段名一样可以不用写-->
<!--        <result column="id" property="id"/>-->
<!--        <result column="name" property="name"/>-->
        <result column="pwd" property="password"/>
    </resultMap>

6、日志工厂

6.1、标准日志工厂

<settings>-->
    <!--标准的日志工厂实现-->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

6.2、Log4j日志

6.2.1、log4j.jar

<dependencies>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

6.2.2、log4j.properties

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/file.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{yyyy-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

6.2.3、日志配置

<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

6.2.4、简单使用

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class UserMapperTest {

    static Logger logger=Logger.getLogger(UserMapperTest.class);

    @Test
    public void getUserById(){
        SqlSession sqlSession= MybatisUtils.getSqlSession();

        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(1);
        System.out.println(user);

        sqlSession.close();
    }

    @Test
    public void testLog4j(){
        logger.info("info:进入了testLog4j");
        logger.debug("debug:进入了testLog4j");
        logger.error("error:进入了testLog4j");
    }
}

7、分页

7.1、Limit分页

<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
    select * from user.user limit #{startIndex}, #{pageSize}
</select>
@Test
public void getUserByLimit(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();

    UserMapper mapper=sqlSession.getMapper(UserMapper.class);
    HashMap<String ,Integer> map=new HashMap<String, Integer>();
    map.put("startIndex",1);
    map.put("pageSize",2);
    List<User> userList=mapper.getUserByLimit(map);
    for (User user : userList) {
        System.out.println(user);
    }

    sqlSession.close();
}

7.2、RowRounds分页

8、使用注解进行增删改查

8.1、UserMapper

package com.jin.dao;

import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

public interface UserMapper {

    @Select("select * from user")
    List<User> getUserList();
    //存在多个基本类型或String类型的参数,所有的参数必须加@Param注解
//    User getUserById(@Param("id") int id,@Param("name")String name);
    @Select("select * from user where id=#{id}")
    User getUserById(@Param("id") int id);

    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    @Delete("delete from user where id=#{id}")
    int deleteUser(int id);

    @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
    int updateUser(User user);
}

8.2、测试

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;


public class UserMapperTest {


    @Test
    public void getUserList(){

        SqlSession sqlSession=MybatisUtils.getSqlSession();

        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();


    }

    @Test
    public void getUserById(){

        SqlSession sqlSession=MybatisUtils.getSqlSession();

        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(1);
        System.out.println(user);

        sqlSession.close();

    }

    @Test
    public void addUser(){

        SqlSession sqlSession=MybatisUtils.getSqlSession();

        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        mapper.addUser(new User(6,"哈哈","333"));

        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();

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

        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void updateUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();

        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(5,"哈哈","666"));

        sqlSession.commit();
        sqlSession.close();
    }

}

9、lombok

9.1、配置文件

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
    </dependency>
</dependencies>

9.2、使用注解

package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}

10、复杂查询

10.1、多对一

10.1.1、实体类

package com.kuang.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;

    //多对一
    private Teacher teacher;

}
package com.kuang.pojo;

import lombok.Data;

@Data
public class Teacher {
    
    private int id;
    private String name;

}

10.1.2、StudentMapper.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.kuang.dao.StudentMapper">

    <!--方法一:按照查询嵌套处理-->
    <select id="getStudent" resultMap="StudentTeacher">
        select * from student
    </select>

    <resultMap id="StudentTeacher" type="Student">
        <!--复杂的属性 我们需要单独处理  对象:association   集合:collection-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="Teacher">
        select * from Teacher where id=#{tid}
    </select>

    <!--===============================================================================-->


    <!--按照结果嵌套处理-->

    <select id="getStudent2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid=t.id
    </select>

    <resultMap id="StudentTeacher2" type="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>


</mapper>

10.1.3、Test

package com.kuang.dao;

import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {

    @Test
    public void getStudent(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();

        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList=studentMapper.getStudent();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }

    @Test
    public void getStudent2(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();

        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList=studentMapper.getStudent2();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }

}

10.2、一对多

10.2.1、实体类

package com.kuang.pojo;

import lombok.Data;

import java.util.List;

@Data
public class Teacher {
    private int id;
    private String name;

    //一对多
    private List<Student> students;
}
package com.kuang.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}

10.2.2、TeacherMapper.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.kuang.dao.TeacherMapper">

    <!--按结果嵌套查询-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid,s.name sname,t.name tname,t.id tid
        from student s,teacher t
        where s.tid=t.id and t.id=#{tid}
    </select>

    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--复杂的属性 我们需要单独处理  对象:association   集合:collection&ndash;
            javaType="":指定属性的类型
            集合中的泛型信息,使用ofType获取
        -->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>


    <!--按照查询嵌套处理-->
    <select id="getTeacher2" resultMap="TeacherStudent2">
        select * from teacher where id=#{tid}
    </select>

    <!--javaType 用来指定实体类中属性的类型
        ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
    -->
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" javaType="ArrayList" ofType="student" select="getStudentByTeacherId" column="id"/>
    </resultMap>

    <select id="getStudentByTeacherId" resultType="Student">
        select * from user.student where tid=#{tid}
    </select>

</mapper>

10.2.3、Test

package com.kuang.dao;

import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {
    
    @Test
    public void getTeacher(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        TeacherMapper teacherMapper=sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher =teacherMapper.getTeacher(1);
        System.out.println(teacher);

        sqlSession.close();
    }

    @Test
    public void getTeacher2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        TeacherMapper teacherMapper=sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher =teacherMapper.getTeacher2(1);
        System.out.println(teacher);

        sqlSession.close();
    }
}

11、动态SQL

动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句

11.1、where语句和IF语句

<select id="selectBlogIf" parameterType="map" resultType="blog">
    select * from user.blog
    <where>
        <if test="title !=null">
            title = #{title}
        </if>
        <if test="author !=null">
            and author = #{author}
        </if>
    </where>
</select>
//IF查询
@Test
public void selectBlogIf(){
    SqlSession sqlSession= MybatisUtils.getSqlSession();
    BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);

    Map map=new HashMap();
    //map.put("title","Mybatis如此简单");
    map.put("author","张三");

    List<Blog> blogList=blogMapper.selectBlogIf(map);
    for (Blog blog : blogList) {
        System.out.println(blog);
    }

    sqlSession.close();
}

11.2、choose语句

<select id="selectBlogChoose" parameterType="map" resultType="blog">
    select * from user.blog
    <where>
        <choose>
            <when test="title !=null">
                title = #{title}
            </when>
            <when test="author != null">
                and author = #{author}
            </when>
            <otherwise>
                and views = #{views}
            </otherwise>
        </choose>
    </where>
</select>
//Choose查询
@Test
public void selectBlogChoose(){
    SqlSession sqlSession= MybatisUtils.getSqlSession();
    BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);

    Map map=new HashMap();
    map.put("title","Mybatis如此简单");
    map.put("author","张三");
    map.put("views",9999);

    List<Blog> blogList=blogMapper.selectBlogChoose(map);
    for (Blog blog : blogList) {
        System.out.println(blog);
    }

    sqlSession.close();
}

11.3、set语句

<update id="updateBlogSet" parameterType="map">
    update user.blog
    <set>
        <if test="title !=null">
            title = #{title},
        </if>
        <if test="author !=null">
            author = #{author}
        </if>
    </set>
    where id = #{id}
</update>
//更新博客Set
@Test
public void updateBlogSet(){
    SqlSession sqlSession= MybatisUtils.getSqlSession();
    BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);

    Map map=new HashMap();
    map.put("title","Spring如此简单2");
    //map.put("author","王五");
    map.put("id","c341ae8b3a3441ec936cb8c60fac7afb");

    //map.put("views",9999);

    blogMapper.updateBlogSet(map);

    sqlSession.close();
}

11.4、foreach语句

<select id="getBlogForeach" parameterType="map" resultType="blog">
    select * from User.blog
    <where>
        <foreach collection="ids" item="id" open="and (" close=")" separator="or">
            id = #{id}
        </foreach>
    </where>
</select>
//查询博客Foreach
@Test
public void getBlogForeach(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);

    Map map=new HashMap();
    ArrayList<String> ids=new ArrayList<String>();
    ids.add("279284c4172f4adf8540d55e89d8b388");
    ids.add("29f05fad7bbc4c67b8547846080634a1");
    ids.add("312ee6623f8d4c339e841d055348a501");
    map.put("ids",ids);
    List<Blog> blogList = blogMapper.getBlogForeach(map);
    for (Blog blog : blogList) {
        System.out.println(blog);
    }

    sqlSession.close();
}

12、缓存

12.1、一级缓存

/*缓存失效:
* 1.查询不同的东西
* 2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存
* 3.查询不同的Mapper.xml
* 4.手动清理缓存sqlSession.clearCache();
* 小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到来连接到关闭连接这个区间段
* */
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user=userMapper.getUserById(1);
        System.out.println(user);

//        sqlSession.clearCache();//手动清理缓存

        System.out.println("=================================");
        User user2=userMapper.getUserById(1);
        System.out.println(user2);
        System.out.println(user==user2);

        sqlSession.close();
    }

12.2、二级缓存

在这里插入图片描述

<!--显示的开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
    <!--在当前Mapper.xml中使用二级缓存-->
    <cache/><!--需要把实体类User序列化(implements Serializable)或下面的配置-->
<!--    <cache
            eviction="FIFO"
            flushInterval="60000"
            size="512"
            readOnly="true"/>-->
/*缓存顺序
* 1.先看二级缓存中有没有
* 2.再看一级缓存中有没有
* 3.查询数据库
* */
@Test
public void test(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SqlSession sqlSession2 = MybatisUtils.getSqlSession();

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


    User user=userMapper.getUserById(1);
    System.out.println(user);
    sqlSession.close();

    System.out.println("user1==================================user2");

    UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
    User user2=userMapper2.getUserById(1);
    System.out.println(user2);
    User user3=userMapper2.getUserById(2);
    System.out.println(user3);
    System.out.println("user3==================================user4");
    User user4=userMapper2.getUserById(2);
    System.out.println(user4);

    System.out.println(user==user2);


    sqlSession2.close();
}

看二级缓存中有没有

  • 2.再看一级缓存中有没有
  • 3.查询数据库
  • */

```java
@Test
public void test(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SqlSession sqlSession2 = MybatisUtils.getSqlSession();

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


    User user=userMapper.getUserById(1);
    System.out.println(user);
    sqlSession.close();

    System.out.println("user1==================================user2");

    UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
    User user2=userMapper2.getUserById(1);
    System.out.println(user2);
    User user3=userMapper2.getUserById(2);
    System.out.println(user3);
    System.out.println("user3==================================user4");
    User user4=userMapper2.getUserById(2);
    System.out.println(user4);

    System.out.println(user==user2);


    sqlSession2.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值