Java Задняя концевая запись (Обновлено ...)

Java
Java Задняя концевая запись (Обновлено ...)

Побить пит-рекорд

Базовая пошаговая запись Java

1. В Java класс может наследоваться только от одного класса, а интерфейс может наследовать несколько интерфейсов.

Ссылаться на:Одиночное и множественное наследование в Java

Пошаговая запись MySQL

1. Вставьте время данных, чтобы сообщить о неизвестном столбце «Zhang San» в «Список полей»

-- 错误方式
insert into `user`(`user_id`,`user_name`,`user_pwd`) values(3,`王五`,`wangwu`);
-- 正确方式
insert into `user`(`user_id`,`user_name`,`user_pwd`) values(3,'王五','wangwu');

Причина: Для имени базы данных, имени таблицы, имени поля используетсяuser(задний двойной апостроф относится к тому, что находится над ключом -table), а для строк используйте кавычки «zhangsan» (рядом с ключом ввода).

MyBatis устанавливает рекорд на пит-стопе

1. Разница между настройкой URL-адреса mysql в файле .java и в файле .xml

  • Настроить в файле .java

    jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    
  • Настроить в файле .xml

    jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    

Причина: & .xml Файл не может быть непосредственно разрешен escape Escape Escape требуется, соответствующий и эвазристый символ IS & AMP

2, сообщается не известно в MapPerregistry. Ненормальный

При написании операторов sql в файле .xml файл .xml должен быть зарегистрирован в файле mybatis-config.xml (то есть добавлением следующего содержимого), иначе он сообщит Тип интерфейса com.jgsu.dao.UserMapper is not известно MapperRegistry.

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

3. Отчет Не удалось найти ресурс com/jgsu/dao/UserMapper.xml исключение

org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/jgsu/dao/UserMapper.xml

Причина: DEA не компилирует xml-файл каталога java src, поэтому xml-файл не может быть найден в файле конфигурации Mybatis! (Также может быть проблема с созданием проекта Maven. Многие проекты в онлайн-руководстве являются обычными веб-проектами Java, поэтому их можно поместить в src и прочитать)

Решение: добавьте узел в текущий pom.xml (можно поместить в родительский)

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

4, ошибка анализа была найдена в сопоставлении # {} исключением

org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in com/zuoyueer/dao/UserMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{}.  Check syntax #{property|(expression), var1=value1, var2=value2, ...} 
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
	....
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{}.  Check syntax #{property|(expression), var1=value1, var2=value2, ...} 

Его точка в том, что мой файл отображения#{}В нем не написано никакого значения, поэтому я искал, искал, добавлял значения во все свои конфигурации, и, наконец, удалил одно за другим, и, наконец, нашел исключение, которое на самом деле является банком комментариев !!!

Код исключения выглядит следующим образом:

<select id="getUserById" resultType="com.jgsu.pojo.User" parameterType="int">
        /*user_id`:数据库中表名,#{}中填该方法对应的参数名*/
       select `user_id`,`user_name`,`user_pwd` from `user` where `user_id`=#{user_id};
</select>

причина:Комментарий содержит #{}. Здесь используется комментарий /**/, что приведет к неправильному синтаксическому анализу файла xmll, а #{} в комментарии также будет проанализирован.

Решение:Удалите комментарий или используйте его для комментирования, чтобы содержимое комментария не анализировалось.

Ссылаться на:Исключение Mybatis Обнаружена ошибка синтаксического анализа в сопоставлении #{}. Яма с использованием аннотаций в файле сопоставления mybatis

5. При использовании mybatis для выполнения операции вставки/удаления/обновления выполнение прошло успешно, но данные в базе не обновились

причина:После использования sqlSession для обновления данных в mybatis необходимо отправить транзакцию, то есть sqlSession.commit(), данные могут быть обновлены в базе данных.

6. Универсальная карта

Когда в классе сущностей или таблице базы данных слишком много полей или параметров, и нам нужно только передать параметры некоторым значениям в SQL, мы можем рассмотреть возможность использования карты.

Ссылаться на:Решение для передачи нескольких параметров в mybatis

7. Нечеткий запрос Like

Не рекомендуется выполнять нечеткий запрос непосредственно в операторах SQL, а ставить %% в Java следующим образом

<!--方法一:根据name中某个字符查-->
    <select id="getUserListByLike" resultType="com.jgsu.pojo.User" parameterType="string">
        select `user_id`,`user_name`,`user_pwd` from user where `user_name` like #{value};
    </select>
<!--方法二:在sql中拼接%-->
 <select id="getUserListByLike" resultType="com.jgsu.pojo.User" parameterType="string">
        select `user_id`,`user_name`,`user_pwd` from user where `user_name` like "%"#{value}"%";
    </select>

в яве

    // 接口UserMapper中如下定义
    /**
     * 模糊查询
     * */
    List<User> getUserListByLike(String value);


    @Test
    public void getUserListByLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // %表示任意个或多个字符。可匹配任意类型和长度的字符 -- 在代码中拼接
        String temp = "%";
        List<User> userList = userMapper.getUserListByLike(temp+"张"+temp);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

8. Введите определенный sql в другом файле xxx2.xml в определенный оператор sql в файле xxx.xml.

Цель:Поймите, что несколько учеников связаны с одним учителем, чтобы реализовать запрос «многие к одному».

Идеи:

1.在TeacherMapper.xml文件中编写sql实现根据teacher_id查询对应的teacher。对应的select标签中的id为getTeacherById
2.在StudentMapper.xml文件中编写sql实现全表查询,但是因为student类中存放的是teacher类而不是teacherId,所以要用到resultMap实现数据库中的列于对应的类中的属性一一对应,而对于复杂的属性比如对象teacher则需要用association进行处理,将student类中的teacher属性跟数据库中的t_id进行绑定,获取t_id的值则通过select标签对TeacherMapper.xml中的getTeacherById方法进行绑定。(意思就是从TeacherMapper.xml中的getTeacherById获取到teacher对象然后再将这个对象传给StudentMapper.xml中属性为teacher实现绑定从而实现一对多查询)

1Класс учителя и класс ученика в соответствующем пакете pojo:

// ----------------------pojo包中的student类
@AllArgsConstructor // lombok插件简化生成set,get,Constructor等方法
@NoArgsConstructor
@Data
public class Student {
  // id
    private int studentId;
  // name
    private String studentName;
  // 对应的teacher
    private Teacher teacher;
}

// ----------------------pojo包中的teacher类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
  // id
    private int teacherId;
  // name
    private String teacherName;
}

2Созданные таблица ученика и таблица учителя выглядят следующим образом:

# 创建student表其中t_id对应的是teacher中的teacher_id
create table if not exists `student`(
    `student_id` int not null primary key ,
    `student_name` varchar(30) not null,
    `t_id` int not null
)engine =innodb default charset =utf8;
use mybatis;
# student表中插入数据
insert into `student`(`student_id`,`student_name`,`t_id`) values (1,'小明',1),(2,'小红',1),(3,'小绿',1);
# 创建teacher表
create table if not exists `teacher`(
    `teacher_id` int not null primary key ,
    `teacher_name` varchar(30) not null
)engine =innodb default charset =utf8;
# teacher表中插入数据
insert into `teacher`(`teacher_id`,`teacher_name`)values (1,'张老师');
# sql语句实现两张表关联查询
select `student_id`,`student_name`,`teacher_name` from `student`,`teacher` where `t_id` = `teacher_id`;

**3 **Созданный интерфейс TeacherMapper, TeacherMapper.xml, интерфейс StudentMapper, StudentMapper.xml выглядит следующим образом:

  • Интерфейс TeacherMapper и интерфейс StudentMapper
public interface StudentMapper {
    /**
     * 多对一连表查询
     * */
    List<Student> getStudentList();
}
public interface TeacherMapper {
    /**
     * 根据Id获取老师信息
     * */
    Teacher getTeacherById(@Param("t_id") int id);
}
  • УчительMapper.xml, СтудентMapper.xml
<!--StudentMapper对应的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">
<!--namespace=绑定一个对应的dao/mapper接口的路径-->
<mapper namespace="com.jgsu.dao.StudentMapper">

    <!--多对一查询:查询多个学生对应同样一个老师的所有学生-->
    <select id="getStudentList" resultMap="StudentTeacher">
       select `student_id`,`student_name`,`t_id` from `student`;
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="studentId" column="student_id"/>
        <result property="studentName" column="student_name"/>
        <!--对于复杂的属性需要单独处理: association处理对象,collection:处理集合-->
        <association property="teacher" column="t_id" javaType="com.jgsu.pojo.Teacher" select="getTeacherById"/><!---注意:这里应该写:com.jgsu.dao.TeacherMapper.getTeacherById-->
    </resultMap>

</mapper>

<!--TeacherMapper对应的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">
<!--namespace=绑定一个对应的dao/mapper接口的路径-->
<mapper namespace="com.jgsu.dao.TeacherMapper">

    <!--多对一查询:查询多个学生对应同样一个老师的所有学生-->
    <select id="getTeacherById" resultType="Teacher">
        select `teacher_id`,`teacher_name` from `teacher` where `teacher_id` = #{t_id};
    </select>

</mapper>

4Тестовый пример выглядит следующим образом:

public class StudentMapperTest {
    @Test
    public void getStudentList(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudentList();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }
}

проблема:По умолчанию система найдет этот метод в StudentMapper, но проблема в том, что введенный нами метод находится в классе Teacher, а написанный оператор sql также находится в файле TeacherMapper.xml.

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.jgsu.dao.StudentMapper.getTeacherById
### The error may exist in com/jgsu/dao/StudentMapper.xml
### The error may involve com.jgsu.dao.StudentMapper.getStudentList
### The error occurred while handling results
### SQL: select `student_id`,`student_name`,`t_id` from `student`;
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.jgsu.dao.StudentMapper.getTeacherById

Решение:Введите ссылку на другой файл в файл StudentMapper.xml, чтобы написать полное имя метода, а не имя метода, иначе он не будет распознан.

<!--对于复杂的属性需要单独处理: association处理对象,collection:处理集合-->
        <association property="teacher" column="t_id" javaType="com.jgsu.pojo.Teacher" select="com.jgsu.dao.TeacherMapper.getTeacherById"/>

<!--错误用例-->
<association property="teacher" column="t_id" javaType="com.jgsu.pojo.Teacher" select="getTeacherById"/>

Весна ставит пит-рекорд

1. Что такое МОК?

Мое понимание:

Некоторые вещи, которые программисты делают сами, теперь могут делать клиенты. Например, программист предоставляет заказчику три интерфейса для подключения к sqlserver, mysql и oracle.Предполагая, что пользователю необходимо подключиться к базе данных mysql сейчас, программист напрямую указывает базу данных как mysql на бизнес-уровне, а затем пользователь использует его напрямую. Но через некоторое время компания-пользователь трансформировалась, и теперь база данных, которую необходимо подключить, — это Oracle, поэтому в это время программиста следует попросить изменить тип базы данных на бизнес-уровне. нужно часто переключать базы данных? ? ? Если его передать программисту, то программист не будет утомлен, что требует частой модификации исходного кода. На этом этапе мы можем считать, что операция переключения базы данных может быть решена пользователем без изменения исходного кода.Программисту нужно только предоставить интерфейс соответствующей базы данных.Пользователь может реализовать соответствующий интерфейс базы данных, вызвав функцию соответствующий интерфейс базы данных Переключение базы данных.

2. Основное различие между статическим прокси, динамическим прокси JDK и динамическим прокси cglib

  • Статический прокси-сервер уже реализован во время компиляции, а прокси-класс является фактическим файлом класса после компиляции.

  • Динамический прокси генерируется динамически во время выполнения, то есть после компиляции фактический файл класса отсутствует, но байт-код класса динамически генерируется во время выполнения и загружается в JVM. Например, если интерфейс не может быть создан, возможно ли создать экземпляр интерфейса непосредственно во время выполнения без написания класса реализации? Ответ возможен, мы можем использовать динамический прокси для предоставления экземпляра интерфейса во время выполнения.

  • Объекты, использующие динамические прокси JDK, должны реализовывать один или несколько интерфейсов.

  • Объекты, использующие прокси-сервер cglib, не нуждаются в реализации интерфейсов для достижения неинтрузивных классов прокси.

  • Динамический прокси-объект jdk не должен реализовывать интерфейс, но целевой объект должен реализовывать интерфейс, иначе динамический прокси-сервер использовать нельзя.

    Ссылаться на: 1) Ляо Сюэфэн.com/wiki/125259…

    1. сегмент fault.com/ah/119000001…