ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis

2022-07-12 00:06:04  阅读:157  来源: 互联网

标签:name student int sex Student sid Mybatis


Mybatis

基本使用

  1. 创建工具类来构造SqlSessionFactory
public class MybatisUtil {

    //在类加载时就进行创建
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取一个新的会话
     * @param autoCommit 是否开启自动提交(跟JDBC是一样的,如果不自动提交,则会变成事务操作)
     * @return SqlSession对象
     */
    public static SqlSession getSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }
}

  1. main方法更简单
package com.test;

import com.test.Util.MybatisUtil;
import com.test.mapper.TestMapper;
import org.apache.ibatis.session.SqlSession;

import java.awt.print.Book;
import java.util.List;

public class Main {
    public static void main(String[] args) {
MybatisUtil.getSession(true).getMapper(TestMapper.class).selectStudent().forEach(System.out::println);
    }
}


  1. entity.Student
package com.test.entity;


import lombok.Data;

@Data
public class Student {
    int sid;
    String name;
    String sex;
    int grade;
}


  1. mapper.TestMapper.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.test.mapper.TestMapper">
    <select id="selectStudent" resultType="com.test.entity.Student">
        select * from book_manage.student
    </select>
</mapper>
  1. mapper.TestMapper
package com.test.mapper;

import com.test.entity.Student;

import java.awt.print.Book;
import java.util.List;

public interface TestMapper {
    List<Student> selectStudent();
}

  1. 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>
    <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/book_manage"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
<mappers>
    <mapper resource="com/test/mapper/TestMapper.xml"/>
</mappers>


</configuration>

起别名

  1. Student.java

    @Alias("MiKu")
    public class Student {
        int sid;
        String name;
        String sex;
        int grade;
    }
    

    mybatis-config.xml

    <typeAliases>
        <package name="com.test.entity"/>
    </typeAliases>
    

    TestMapper.xml

<mapper namespace="com.test.mapper.TestMapper">
    <select id="selectStudent" resultType="MiKu">
        select * from book_manage.student
    </select>
</mapper>
  1. mybatis-config.xml
<!-- 需要在environments的上方 -->
<typeAliases>
    <typeAlias type="com.test.entity.Student" alias="Student"/>
</typeAliases>

TestMapper.xml

<mapper namespace="com.test.mapper.TestMapper">
    <select id="selectStudent" resultType="Student">
        select * from book_manage.student
    </select>
</mapper>
  1. mybatis-config.xml
<typeAliases>
        <package name="com.test.entity"/>
    </typeAliases>

TestMapper.xml

<select id="selectStudent" resultType="student">
        select * from book_manage.student
    </select>

<insert id="addStudent" >
    insert into student(name,age) values (#{name},#{age})
</insert>
int addStudent(Student student);
System.out.println(mapper.addStudent(new Student().setName("白牛").setAge(88)));

<delete id="deleteStudent">
    delete from student where id = #{id}
</delete>
int deleteStudent(int id);
System.out.println(mapper.deleteStudent(16));

<update id="updateStudent">
    update student
    set name=#{name},age=#{age}
    where id = #{id}
</update>
int updateStudent(Student student);
System.out.println(mapper.updateStudent(new Student(2,"cat",999)));

<select id="selectStudentById" resultType="Student">
    select * from student where id = #{id}
</select>
Student selectStudentById(int id);
System.out.println(mapper.selectStudentById(3));

用Map映射

<resultMap id="Test" type="Student">
    <result column="id" property="age"/>
    <result column="name" property="name"/>
    <result column="age" property="id"/>
</resultMap>
<select id="selectStudent" resultType="Map">
        select * from student
    </select>
List<Student> selectStudent();
mapper.selectStudent().forEach(System.out::println);

构造器问题

一个类中存在多个构造方法,会报错

<resultMap id="Test" type="Student">
    <constructor>
        <arg column="id" javaType="int"/>
        <arg column="name" javaType="String"/>
    </constructor>
</resultMap>

<select id="selectStudent" resultMap="Test">
    select * from student
</select>
@Data
@Accessors(chain = true)
public class Student {

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

    int id;
    String name;
    int age;


}

驼峰命名

数据库是下划线命名,java是驼峰命名,可以进行转换

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

下划线命名 -> 驼峰命名

事务操作

SqlSession session = MybatisUtil.getSession(false); // 开启事务
session.rollback(); // 回滚
session.commit(); // 提交

缓存机制

概念

把一部分内容放入缓存,下次获取数据,直接从缓存读取,直接从内存获取,而不是向数据库索要,效率更高

一级缓存

Mybatis默认启动一级缓存

作用范围有限,作用于一个会话,我们希望缓存扩展到所有会话,通过二级缓存,默认关闭

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

某个方法关闭缓存

<select id="getStudentBySid" resultType="Student" useCache="false">
    select * from student where sid = #{sid}
</select>

操作完成后清空缓存

<select id="getStudentBySid" resultType="Student" flushCache="true">
    select * from student where sid = #{sid}
</select>

读取顺序:二级缓存 => 一级缓存 => 数据库

注解开发

@Insert("insert into student(name, sex) values(#{name}, #{sex})")
int addStudent(Student student);

<mappers>
    <mapper class="com.test.mapper.MyMapper"/>
    <!--  也可以直接注册整个包下的 <package name="com.test.mapper"/>  -->
</mappers>

指定构造方法

@ConstructorArgs({
        @Arg(column = "sid", javaType = int.class),
        @Arg(column = "name", javaType = String.class)
})
@Select("select * from student where sid = #{sid} and sex = #{sex}")
Student getStudentBySidAndSex(@Param("sid") int sid, @Param("sex") String sex);

指定参数类型

@Select("select * from student where sid = #{sid} and sex = #{sex}")
Student getStudentBySidAndSex(@Param("sid") int sid, @Param("sex") String sex);

注解控制缓存

@CacheNamespace(readWrite = false)
public interface MyMapper {

    @Select("select * from student")
    @Options(useCache = false)
    List<Student> getAllStudent();

Mybatis是半自动框架,SQL语句需要自己写,有一定麻烦,JPA框架这种全自动框架,几乎没有SQL语句!

标签:name,student,int,sex,Student,sid,Mybatis
来源: https://www.cnblogs.com/instore/p/16468467.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有