mybatis框架

目录

一.mybatis框架

1.什么是框架

2. mybatis框架的介绍

3.为什么使用mybatis框架

 二.如何使用mybatis框架

1.引入mybatis和mysql的jar包(在pom.xml页面)

2.创建mybatis的配置文件

3.创建指定的数据库和表

4.创建实体类

5.创建mybatis和数据库的映射文件

6. 测试mybatis

三.优化mybatis.xml 

1.lombok插件

(1)  idea安装lombok插件

  (2) pom.xml工程中引入lombok依赖

2.起别名

 3.添加sql日志

(1) 在pom.xml页面添加日志的jar

(2) 添加日志的文件配置--log4j.properties(必须添加)

 4.解决数据库列名和实体类的属性名不一致问题

四.通过dao和映射文件的关联来完成操作---企业开发模式

 1.创建一个dao接口并定义自己需要的方法

2.创建映射文件

 3.测试(连接dao接口进行增删改查)

4.常见bug

5.传递多个参数

​编辑6.添加时如何返回递增的主键值

 五.动态sql

1.什么是动态sql

2.为什么要使用动态sql

​编辑 3.mybatis中的动态标签有哪些

 4.条件判断

(1) if标签--单条件判断

(2) choose标签 多条件分支判断

(3) where 标签

(4) set 标签(修改)

5. sql片段

6.mybatis映射文件处理特殊字符

7. mybatis完成模糊查询

六. 查询 

1.联表查询

(1) 多对一

2.分页查询 

(1)在pom.xml文件中引入pageHelper的jar包

(2) 在mybatis.xml文件中设置pageHelper 拦截器

(3) 使用pageHelper

七.  mybatis代码生成器----generator 

1.在pom.xml引入mybaits-generator的依赖jar包

2.创建generator.xml配置文件并修改配置

3.运行配置文件进行自动生成


一.mybatis框架

1.什么是框架

什么是框架:框架就是别人搭建好的某些功能,你只需要引用该框架并加入自己的业务代码。

好处: 提高我们的开发效率。

2. mybatis框架的介绍

MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.

3.为什么使用mybatis框架

可以简化jdbc的操作以及占位符赋值以及查询结果集的封装。

 二.如何使用mybatis框架

1.引入mybatis和mysql的jar包(在pom.xml页面)

<!--    导入mybatis框架的包-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

<!--导入连接数据库的包-->
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

2.创建mybatis的配置文件

在resources目录下创建mybatis.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!--数据源的配置:name的值固定  value的值要根据客户自己修改-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url"    value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

     <!--注册映射文件-->
    <mappers>
        <!--resource:引用资源文中的映射文件 url:网络上的映射文件-->
         <mapper resource="mapper/UserMapper.xml" />
    </mappers>
</configuration>

3.创建指定的数据库和表

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`userid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, 'admin', '管理员');
INSERT INTO `tb_user` VALUES (2, 'lm', '黎明');
INSERT INTO `tb_user` VALUES (3, 'ldh', '刘德华');
INSERT INTO `tb_user` VALUES (4, 'zxy', '张学友');
INSERT INTO `tb_user` VALUES (5, 'gfc', '郭富城');

4.创建实体类

public class User {
    private int userid;
    private String username;
    private String realname;
    //get和set方法及构造函数、toString请自行创建
}

5.创建mybatis和数据库的映射文件

在resources目录下新建mapper目录,在mapper目录下新建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">
<!--namespace:命名空间
       可以随便起名,但是后期我们要求命名空间的值必须和所对应的dao相同
-->
<mapper namespace="mjl.user">
    <!--查询 根据id查询用户信息
          select标签用于查询的标签
             id:标签的唯一标识
             resultType: 定义返回的类型 把sql查询的结果封装到哪个实体类钟
         #{id}===表示占位符等价于?  这是mybatis框架的语法
    -->
    <select id="findById" resultType="commjlentity.User">
        select * from tb_user where userid=#{id}
    </select>

     <select id="findAll" resultType="u">
        select * from tb_user
    </select>

    <insert id="insert" parameterType="u">
        insert into tb_user values (null,#{username},#{password})
    </insert>

    <update id="update" parameterType="u">
        update tb_user set username=#{username},password=#{password} where id=#{id}
    </update>

    <delete id="delete" parameterType="u">
        delete from tb_user where id=#{id}
    </delete>
</mapper>

 ps:配置好映射文件后记得把映射文件注册到配置文件上(在mybatis.xml页面,上方代码已配置)

 <!--注册映射文件-->
    <mappers>
        <!--resource:引用资源文中的映射文件 url:网络上的映射文件-->
         <mapper resource="mapper/UserMapper.xml" />
    </mappers>

6. 测试mybatis

package com.wt.test;


import com.wt.entity.User;
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 org.junit.Test;

import java.io.Reader;
import java.util.List;

public class Text01 {
    //查询单个
    @Test
    public void test01() throws Exception{
         //1.读取mybatis配置文件的内容----未来不需要写tomcat 解析配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
         //2. 获取SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
         //3. 获取SqlSession对象----封装了对数据库操作的各种方法
        SqlSession session = factory.openSession();
        User user = new User();
        user.setId(2);
        Object o = session.selectOne("wt.user.findById", user);
        System.out.println(o);
        session.close();
    }
    //查询所有
    @Test
    public void test02() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        List<User> user = session.selectList("wt.user.findAll");
        System.out.println(user);
        session.close();
    }
    //增加
    @Test
    public void test03() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User();
        user.setUsername("白云");
        user.setPassword("黑土");
        int row = session.insert("wt.user.insert", user);
        System.out.println(row);
        session.commit();
        session.close();
    }
    //修改
    @Test
    public void test04() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User(9,"黑土地","黄土地");
        int row = session.update("wt.user.update", user);
        System.out.println(row);
        session.commit();
        session.close();
    }
    //删除
    @Test
    public void test05() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User();
        user.setId(9);
        int row = session.delete("wt.user.delete", user);
        System.out.println(row);
        session.commit();
        session.close();
    }
}

三.优化mybatis.xml 

1.lombok插件

它可以帮你生成实体类的get和set方法 而且可以帮你生成构造方法。重写toString方法

(1)  idea安装lombok插件

  (2) pom.xml工程中引入lombok依赖

  <!--lombok的依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

@Data //set和get方法以及toString方法
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //所有参数的构造方法
public class User {
    private int userid;
    private String username;
    private String realname;
}

2.起别名

(1)mybatis.xml配置文件

    <typeAliases>
        <!--单独为某个实体类起别名 -->
         <typeAlias type="com.wt.entity.User" alias="u"/>
        <!--为指定包下的实体类起别名该别名就是实体类名-->
         <package name="com.wt.entity"/>
    </typeAliases>

 3.添加sql日志

(1) 在pom.xml页面添加日志的jar

	<!--log4f-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

(2) 添加日志的文件配置--log4j.properties(必须添加)

在resources目录下创建log4j.properties页面

//简写版
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

//详细版
#将等级为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=D:/mjl/log/mjl.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

 4.解决数据库列名和实体类的属性名不一致问题

问题:当我们实体类中定义的属性名和数据库列名有所不同时, 查询该列时全部返回一个null,或者某个列没有值

可以有两种解决办法:

(1)为查询的列起别名,而别名和属性名一致。

 <!--根据id查询学生信息-->
    <select id="findOne" resultType="com.wt.entity.User">
        select user_id id,user_name name,user_age age from tb_user where user_id=#{id}
    </select>

(2)  使用resultMap完成列和属性之间的映射关系

 <resultMap id="StuMapper" type="com.ykq.entity.Student">
         <!--主键的映射关系 column:列名 property:属性名-->
         <id column="stu_id" property="id"/>
         <!--普通列的映射关系-->
         <result column="stu_name" property="name"/>
         <result column="stu_age" property="age"/>
    </resultMap>

 <!--resultType和ResultMap二者只能用一个-->
    <select id="findOne" resultMap="StuMapper">
        select * from tb_stu where stu_id=#{id}
    </select>

ps:如果列名和属性名有些一致的,可以在resultMap中不写映射关系  

四.通过dao和映射文件的关联来完成操作---企业开发模式

思考: 我们之前使用SqlSession封装的一些方法可以完成crud操作,但是SqlSession封装的方法,传递的参数statement, 传递占位符的参数只能传递一个。而且它的方法名称都是固定。而真实在开发环境下我们不使用SqlSession封装的方法,而是习惯自己定义方法,自己调用自己的方法。

 1.创建一个dao接口并定义自己需要的方法

package com.wt.dao;

import com.wt.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface StudentDao {

    /**
     * 查询所有
     * @return
     */
    public List<Student> findAll(@Param("name")String name,@Param("age")int age);

    /**
     * 增加
     * @return
     */
    public int insert(Student student);
    /**
     * 修改
     * @return
     */
    public int update(Student student);
       /**
     * 删除
     * @return
     */
    public int delete(int id);
}

2.创建映射文件

<?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">
<!--namespace:命名空间
       必须和dao相同
-->
<mapper namespace="com.ykq.dao.UserDao">
    <select id="findAll" resultType="com.ykq.entity.User">
        select * from tb_user
    </select>
</mapper>

ps:注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样

 3.测试(连接dao接口进行增删改查)

package com.wt.test;

import com.wt.dao.UserDao;
import com.wt.entity.User;
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 org.junit.Test;

import java.io.Reader;
import java.util.List;

public class Text01 {
    //查询所有
    @Test
    public void test01() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        UserDao userDao = session.getMapper(UserDao.class);
        List<User> list = userDao.findAll();
        System.out.println(list);

        session.close();
    }
    //增加
    @Test
    public void test02() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        UserDao u = session.getMapper(UserDao.class);
        User user = new User();
        user.setName("李华");
        user.setEmail("31646545@qq.com");
        System.out.println("前"+user);
        int row = u.insert(user);
        System.out.println("后"+user);
        System.out.println(row);
        session.commit();
        session.close();
    }
    //删除
    @Test
    public void test03() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User(3,"张飞","45451325@qq.com");
        int ro = session.update("wt.user.update", user);
        System.out.println(ro);
        session.commit();
        session.close();
    }
    //修改
    @Test
    public void test04() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session =factory.openSession();
        User user = new User();
        user.setId(5);
        int row = session.delete("wt.user.delete", user);
        System.out.println(row);
        session.commit();
        session.close();
    }
    //查询单个
    @Test
    public void test05() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        UserDao userDao = session.getMapper(UserDao.class);
        User row = userDao.findById(3);
        System.out.println(row);
        session.close();
    }
}

4.常见bug

(1)  namespace和接口名不对应。 xml文件没有注册到mybatis配置文件中

(2)映射文件中的标签id和接口中方法名不对应

 

5.传递多个参数

我们在dao接口中某些方法可能需要传递多个参数,譬如: 登录(username,password),我们需要在参数处使用@Param()为参数起名。

6.添加时如何返回递增的主键值

 在映射文件的添加中加入:

          useGeneratedKeys:设置使用生成的主键(true 或 false)
          keyProperty: 赋值给哪个属性

 <!--添加用户
          useGeneratedKeys:设置使用生成的主键
          keyProperty: 赋值给哪个属性
    -->
    <insert id="addUser" parameterType="com.ykq.entity.User"
            useGeneratedKeys="true" keyProperty="id">
          insert into tb_user values(null,#{username},#{realname})
    </insert>

 五.动态sql

1.什么是动态sql

根据参数的值,判断sql条件

name!=null address
select * from 表名 where name=#{name} and address=#{address}
name==null
select * from 表名.

2.为什么要使用动态sql

 当中实际应用中,用户通过搜索框输入几个参数,使用传入的参数进行特定查询,如果不输入参数,则查询所有

 3.mybatis中的动态标签有哪些

 4.条件判断

(1) if标签--单条件判断

//写在接口类中
 //如果name不为null则按照name查询 如果为null则查询所有
    public List<Account> findByCondition(@Param("name")String name,@Param("money") Double money);

(2) choose标签 多条件分支判断

<select id="findByCondition02" resultType="com.ykq.entity.Account">
        select * from account where 1=1
        <choose>
             <when test="name!=null and name!=''">
                 and  name=#{name}
             </when>
            <when test="money!=null">
                and  money=#{money}
            </when>
            <otherwise>
                and isdeleted=0
            </otherwise>
        </choose>
    </select>

(3) where 标签

我们观察到上面的sql都加了 where 1=1 ,如果不使用where 1=1 那么你的动态sql可能会出错。 我们能不能不加where 1=1呢! 可以 那么我们就可以使用where标签,作用:可以自动为你添加where关键字,并且可以帮你去除第一个and |or

 <select id="findByCondition" resultType="com.ykq.entity.Account">
        select * from account
        <where>
            <if test="name!=null and name!=''">
                 and  name=#{name}
            </if>
            <if test="money!=null">
                 and  money=#{money}
            </if>
        </where>
    </select>

(4) set 标签(修改)

set:可以帮我们生成关键字,并且可以去除最后一个逗号

<update id="update">
        update tb_user
        <set>
            <if test="name!=null and name!=''">
                username=#{name},
            </if>
            <if test="password!=null and password!=''">
                password=#{password}
            </if>
        </set>
        where id =#{id}
</update>

(5) foreach标签 

循环标签,多用于批量添加、删除、查询

<!-- select * from account where id in(3,5)
        如果你使用的为数组array  如果你使用的为集合 那么就用list
        collection:类型
        item:数组中每个元素赋值的变量名
        open: 以谁开始
        close:以谁结束
        separator:分割符
    -->

a.查询: 

<!--    xml文件中-->
<select id="findByIds" resultMap="UserMap">
        select * from tb_user where id in

        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>


</select>

b.添加

<insert id="inserts">
        insert into tb_user(username,password) values
        <foreach collection="list" item="acc" separator=",">
            (#{acc.name},#{acc.password})
        </foreach>
    </insert>

c.删除

<delete id="deletes">
        delete from tb_user
        <foreach collection="array" item="id" open="where id in (" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

5. sql片段

在执行查询语句时不建议大家使用select *, 建议大家把查询的列写出。

<!--    定义sql片段,指定要查询的列名-->
<sql id="baseColumn">
        id,username,password
</sql>



 <select id="tjcx" resultMap="UserMap">
       select 
        <include refid="baseColumn" />
        from tb_user where id in

        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>

</select>

 6.mybatis映射文件处理特殊字符

当我们在进行范围查询时,会运用一些特殊符号,那些符号需要经过转义字符才能使用,解决此类问题有两种方法:

         第一种:转义标签 &nbsp; &lt;  
         第二种: <![CDATA[sql]]>
  
ps:在第二种情况下无法使用自定义的sql片段

<!--    条件查询-->

    方法一
    <select id="tjcx" resultMap="UserMap">
    select
    <include refid="baseColumn" />
    from tb_user where id>#{min} and id &lt; #{max}
    </select>

    方法二
    <select id="tjcx" resultMap="UserMap">
        <![CDATA[select * from tb_user where id>#{min} and id< #{max}]]>
    </select>

7. mybatis完成模糊查询

如 select * from 表名 where 列名 like '%a%'

 a. 使用字符串函数 完成拼接 concat

<!--    模糊查询-->
    <select id="mhcx" resultMap="UserMap">
        select * from tb_user where username like concat('%',#{name},'%')
    </select>

b. 使用${}

<select id="findByLike" resultMap="UserMap">
        select * from account where name like '%${name}%'
    </select>

通过观察: 发现使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement

六. 查询 

1.联表查询

(1) 多对一

多对一 : 从多的一方来查询少的一方。

学生表

班级表 

 通过该语句查询:select * from tb_stu t join tb_class s on t.stu_id=s.cid where stu_id=1;

实体类:

a.班级表实体类

package com.wt.entity;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Claszz {
    private int cid;
    private String cname;
}

b.学生表实体类 

package com.wt.entity;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private int classId;

    //学生所属的班级
    private Claszz claszz;

}

 c.xml代码

方法一:

association: 表示一的一方
property: 它表示属性名
 javaType: 该属性名对应的数据类型

 <resultMap id="BaseMap" type="com.wt.entity.Student">
        <id column="stu_id" property="id" />
        <result column="stu_name" property="name" />
        <result column="stu_age" property="age" />
        <result column="sex" property="sex" />
        <result column="class_id" property="classId" />

        <association property="claszz" javaType="com.wt.entity.Claszz">
            <id column="cid" property="cid" />
            <result column="cname" property="cname" />
        </association>

    </resultMap>

    <sql id="BaseSql" >
        stu_id,stu_name,stu_age,sex,class_id
    </sql>


    <select id="findById" resultMap="BaseMap">
        select *
        from tb_stu t join tb_class c on t.class_id=c.cid where t.stu_id=#{id};
    </select>

方法二:


    <select id="findById" resultType="java.util.Map">
        select <include refid="aa"/> from tb_stu t join tb_class c on t.class_id=c.id where t.stu_id=#{id}
    </select>

2.分页查询 

select * from tb_stu limit 0,5

select * from 表名 [where 条件] limit (page-1) * pageSize, pageSize;

page: 当前页码
pageSize: 每页显示的条数。

(1)在pom.xml文件中引入pageHelper的jar包

<!--引入pageHelper-->
<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.0</version>
        </dependency>
<select id="selcAll" resultMap="BaseResultMap">
  select * from tb_stu
</select>

(2) 在mybatis.xml文件中设置pageHelper 拦截器

在执行sql之前,要经过拦截器,该拦截器就会在sql后面拼接上limit (page-1) * pageSize, pageSize,然后再执行查询操作

(3) 使用pageHelper

public void test02() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);

        PageHelper.startPage(1,5);
        List<Student> list = studentMapper.selcAll();
        PageInfo<Student> stringPageInfo = new PageInfo<Student>(list);
        System.out.println(stringPageInfo);
        System.out.println("总条数:"+stringPageInfo.getTotal());
        System.out.println("总页数:"+stringPageInfo.getPages());
        System.out.println("当前页数据:"+stringPageInfo.getList());
        session.close();
    }

七.  mybatis代码生成器----generator 

作用: 根据表自动生成实体类,和dao和xml映射文件。及简单的删改查代码。

http://mybatis.org/generator/

该网址内有详细教程

1.在pom.xml引入mybaits-generator的依赖jar包

<!--       引入 mybatis-generator-core-->
<dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.0</version>
        </dependency>

2.创建generator.xml配置文件并修改配置

targePackage:包名
targetProject:包的存储路径
schema:数据库名
tableName:表名
domainObjectName:对应的实体类
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<!--    将location改为本地mysql.jar包所在路径-->
<generatorConfiguration>
    <classPathEntry location="D:\qy151\repMaven\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar" />


    <context id="DB2Tables" targetRuntime="MyBatis3">
<!--        若不添加commentSenerator则会自动生成注释-->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
<!--数据库的配置信息-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

<!--        实体类-->
<!--        targePackage:包名-->
<!--        targetProject:包的存储路径-->
        <javaModelGenerator targetPackage="com.wt.entity" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

<!--        创建mapper包-->
        <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
<!--        创建dao包-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.wt.dao"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

<!--        schema:数据库名-->
<!--        tableName:表名-->
<!--        domainObjectName:对应的实体类-->
        <table schema="mybatis" tableName="tb_stu" domainObjectName="Student"
               enableSelectByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableCountByExample="false">

        </table>


    </context>
</generatorConfiguration>

3.运行配置文件进行自动生成

File configFile = new File("generator.xml ");该行代码中的路径要与自行创建的配置文件名字相同
@Test
    public void test01() throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("generator.xml ");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

八.mybatis的缓存问题 

1.什么是缓存

缓存是存在于==内存中==的临时数据。

mysql数据库中的数据存在----表--->磁盘上。 查询---程序IO读取磁盘的数据---添加--io向磁盘添加数据。 

2.使用缓存的好处

使用缓存减少和数据库的交互次数,提高执行效率。

3.什么样的数据适合放入缓存

经常查询并且不经常改变的;数据的正确与否对最终结果影响不大的;  

4. 什么样的数据不适合放入缓存

经常改变的数据;数据的正确与否对最终结果影响很大的;---数据安全性要求不高。例如:商品的库存,银行的汇率,股市的牌价;

5. mybatis它也支持缓存

mybatis支持两种缓存

(1)一级缓存----基于SqlSession级别的缓存。默认一级缓存是开启的,不能关闭。

(2)二级缓存--基于SqlSessionFactory级别的缓存,它可以做到多个SqlSession共享数据。默认它是关闭。需要手动开启。

(1) 一级缓存

一级缓存默认存储在session中,session不关闭则再次查询则只会在缓存内查询,不会再前往数据库查询

@Test
    public void test03() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        Student student = studentMapper.selectByPrimaryKey(2);
        System.out.println(student);

        Student student2 = studentMapper.selectByPrimaryKey(2);
        System.out.println(student2);

    }

 session关闭时会清空缓存,需要再次前往数据库查询

 (2) 二级缓存

a.开启二级缓存 

<settings>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

b.在映射文件中使用二级缓存

<cache/>

c.实体类一定要实现序列化接口

不给实体类添加序列化接口则会报此错误:

添加后则会正常运行: 

 @Test
    public void test03() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        Student student = studentMapper.selectByPrimaryKey(2);
        System.out.println(student);
        session.close();

        SqlSession session1 = factory.openSession();
        StudentMapper mapper = session1.getMapper(StudentMapper.class);
        Student student1 = mapper.selectByPrimaryKey(2);
        System.out.println(student1);

    }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值