Mybatis入门(实现简单的CRUD)

目录

一.先配置Mybatis主配置文件

二.实体类

三.Dao层(mapper)

四.CRUD

查询所有学生信息

根据ID查学生信息

添加学生

修改学生信息

删除学生

连表查询学生和班级

五.分页查询(PageHelper插件)

1.先加入PageHelper依赖

2.主配置文件中配置插件

3代码中直接使用


一.先配置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>

    <properties resource="db.properties"></properties>
    <settings>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />

        <!-- 控制全局缓存(二级缓存),默认 true-->
        <setting name="cacheEnabled" value="false"/>

        <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
        <setting name="aggressiveLazyLoading" value="true"/>
        <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
        <!--<setting name="proxyFactory" value="CGLIB" />-->
        <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
        <!--
                <setting name="localCacheScope" value="STATEMENT"/>
        -->
        <setting name="localCacheScope" value="STATEMENT"/>
    </settings>

    <typeAliases>
        <typeAlias alias="student" type="com.ws.vo.Student" />
    </typeAliases>

<!--    <typeHandlers>
        <typeHandler handler="com.ws.type.MyTypeHandler"></typeHandler>
    </typeHandlers>-->

    <!-- 对象工厂 -->
<!--    <objectFactory type="com.ws.objectfactory.MyObjectFactory">
        <property name="gupao" value="666"/>
    </objectFactory>-->

<!--    <plugins>
        <plugin interceptor="com.ws.interceptor.SQLInterceptor">
            <property name="gupao" value="betterme" />
        </plugin>
        <plugin interceptor="com.ws.interceptor.MyPageInterceptor">
        </plugin>
    </plugins>-->

<!--    <plugins>-->
<!--        <plugin interceptor="com.github.pagehelper.PageInterceptor">-->
<!--            &lt;!&ndash; 4.0.0以后版本可以不设置该参数 ,可以自动识别-->
<!--            <property name="dialect" value="mysql"/>  &ndash;&gt;-->
<!--            &lt;!&ndash; 该参数默认为false &ndash;&gt;-->
<!--            &lt;!&ndash; 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 &ndash;&gt;-->
<!--            &lt;!&ndash; 和startPage中的pageNum效果一样&ndash;&gt;-->
<!--            <property name="offsetAsPageNum" value="true"/>-->
<!--            &lt;!&ndash; 该参数默认为false &ndash;&gt;-->
<!--            &lt;!&ndash; 设置为true时,使用RowBounds分页会进行count查询 &ndash;&gt;-->
<!--            <property name="rowBoundsWithCount" value="true"/>-->
<!--            &lt;!&ndash; 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 &ndash;&gt;-->
<!--            &lt;!&ndash; (相当于没有执行分页查询,但是返回结果仍然是Page类型)&ndash;&gt;-->
<!--            <property name="pageSizeZero" value="true"/>-->
<!--            &lt;!&ndash; 3.3.0版本可用 - 分页参数合理化,默认false禁用 &ndash;&gt;-->
<!--            &lt;!&ndash; 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 &ndash;&gt;-->
<!--            &lt;!&ndash; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 &ndash;&gt;-->
<!--            <property name="reasonable" value="true"/>-->
<!--            &lt;!&ndash; 3.5.0版本可用 - 为了支持startPage(Object params)方法 &ndash;&gt;-->
<!--            &lt;!&ndash; 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 &ndash;&gt;-->
<!--            &lt;!&ndash; 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 &ndash;&gt;-->
<!--            &lt;!&ndash; 不理解该含义的前提下,不要随便复制该配置 &ndash;&gt;-->
<!--            <property name="params" value="pageNum=start;pageSize=limit;"/>-->
<!--            &lt;!&ndash; 支持通过Mapper接口参数来传递分页参数 &ndash;&gt;-->
<!--            <property name="supportMethodsArguments" value="true"/>-->
<!--            &lt;!&ndash; always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page &ndash;&gt;-->
<!--            <property name="returnPageInfo" value="check"/>-->
<!--        </plugin>-->
<!--    </plugins>-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
            <dataSource type="POOLED" >
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
<!--    <databaseIdProvider type="DB_VENDOR">-->
<!--        <property name="MySQL" value="mysql"/>-->
<!--    </databaseIdProvider>-->
    <mappers>
        <!--一个mapper标签指定 一个文件的位置。
           从类路径开始的路径信息。target/clasess(类路径 )
          -->
        <mapper resource="com/ws/mapper/StudentDao.xml"/>
    </mappers>

</configuration>

二.实体类

对应数据库中的一个表

Student

@Data
public class Student {
    private Integer id;

    private String name;

    private Integer age;

    private Integer clazzNo;

    public Student(Integer id, String name, Integer age, Integer clazzNo) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.clazzNo = clazzNo;
    }

}

三.Dao层(mapper)

public interface StudentDao {
    /**
     * 查询所有学生信息
     * @return
     */
    List<Student> queryAllStudents();

    /**
     * 根据ID查学生信息
     * @return
     */
    Student querySyudentById(Integer id);

    /**
     * 添加学生
     * @return
     */
    int addStudent(Student student);

    /**
     * 修改学生信息
     * @return
     */
    int updateStudentById(Student student);

    /**
     * 删除学生
     * @return
     */
    int deletStudentById(Integer id);

    /**
     *连表查询
     * 查询学生和班级
     * @return
     */
    StudentAndClazz queryStudentAndeClazzById(Integer id);

}

对应一个mapper.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.ws.mapper.StudentDao">
    <select id="queryAllStudents" resultType="student">
        select id, name, age, clazz_no from student
    </select>

    <select id="querySyudentById" parameterType="int" resultType="student">
        select id, name, age, clazz_no from student where id=#{id}
    </select>

    <insert id="addStudent">
        insert into student (id,name,age,clazz_no)values (#{id},#{name},#{age},#{clazzNo})
    </insert>

    <update id="updateStudentById" parameterType="student">
        update  student set name=#{name}, age=#{age}, clazz_no=#{clazzNo} where id=#{id}
    </update>

    <delete id="deletStudentById" parameterType="int">
        delete from student where id = #{id}
    </delete>

    <!-- 根据clazz_no查询clazz信息, -->
    <resultMap id="studentAndClazz" type="com.ws.vo.StudentAndClazz">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="clazz_no" property="clazzNo" jdbcType="INTEGER"/>
        <result column="clazz_name" property="clazzName"/>
    </resultMap>

    <select id="queryStudentAndeClazzById" parameterType="int" resultMap="studentAndClazz">
        select s.id, s.name, s.age, s.clazz_no, c.clazz_name from student s join clazz c on s.clazz_no=c.id where s.id = #{id}
    </select>
    


</mapper>

四.CRUD

先加载Mybatis主配置文件 -> 根据SqlSessionFactory工厂创建SqlSession -> 传入我们的Dao接口去获取相应的mapper映射器。

        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //单例的工厂
        SqlSessionFactory factory = builder.build(in);
        SqlSession sqlSession = factory.openSession();
        //获取mapper
        StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);

查询所有学生信息

    //查询所有学生
        List<Student> studentList = studentMapper.queryAllStudents();
        System.out.println(Arrays.toString(studentList.toArray())
                .replaceAll("\\[|\\]","")
                .replaceAll("\\)\\,","\\)\n"));

根据ID查学生信息

        Student student = studentMapper.querySyudentById(1);
        System.out.println(student);

添加学生

        //添加学生
        Student student = new Student(3,"ws",18,100);
        int nums = 0;
        nums = studentMapper.addStudent(student);
        System.out.println(nums);
        sqlSession.commit();

 

修改学生信息

        //修改学生信息
        Student student = new Student(3,"王硕",18,100);
        nums = studentMapper.updateStudentById(student);
        System.out.println(nums);
        sqlSession.commit();

 

删除学生

        //删除学生信息
        nums = studentMapper.deletStudentById(3);
        System.out.println(nums);
        sqlSession.commit();

 

连表查询学生和班级

        //连表查询学生和班级的信息
        StudentAndClazz studentAndClazz = studentMapper.queryStudentAndeClazzById(1);
        System.out.println(studentAndClazz);

 

 

五.分页查询(PageHelper插件)

1.先加入PageHelper依赖

<!-- pagehelper依赖   -->
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.1.10</version>
</dependency>

2.主配置文件中配置插件

<!--配置插件-->
<plugins>
     <!--配置pagehelper插件-->
    <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

3代码中直接使用

@Test
    public void Test4() throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //单例的工厂 解析配置文件获的SqlSessionFactory工厂类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = factory.openSession();
        //获取mapper
        StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);
        //查询所有学生

        /**
         * limit n, m  n代表从第n+1个数据开始查,m代表查几个
         * pageNum:2 pageSize:2 -> limit (pageNumm-1)*pageSize ,pageSize
         *
         */
        PageHelper.startPage(2,2); //pageNum:第几页 pageSize:每页几条数据

        List<Student> studentList = studentMapper.queryAllStudents();
        System.out.println(Arrays.toString(studentList.toArray())
                .replaceAll("\\[|\\]","")
                .replaceAll("\\)\\,","\\)\n"));
    }

分页就是再查询sql语句上加入limit(mysql)

limit n, m:  n代表从第n+1个数据开始查,m代表查几个 *

pageNum:第几页 pageSize:每页几个数据 -> limit (pageNumm-1)*pageSize ,pageSize

所以我们使用PageHelper.startPage(2,2); 也就是在我们的原来的语句上加上了limet 2,2

所以如果是PageHelper.startPage(3,10) ->limet 20,10

如果想了解 Mybatis插件原理点击

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w7486

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值