Введение в Mybatis
Mybatis был предварительно предшествовал Ибатису, которая представляет собой структуру постоянного уровня/реляционного картирования (ORM) на основе Java.
Mybatis - это инкапсуляция JDBC, позволяющая разработчикам сосредоточиться только на самих SQL, не тратят слишком много усилий на обработку процедурного кода JDBC, такого как регистрация драйверов, настройка параметров, создание подключения/оператора, наборов результатов парса и т. Д.
Mybatis - это первое классовое рамки при поддержке пользовательского SQL, хранимых процедур и расширенных отображений. Mybatis устраняет почти весь код JDBC и ручную настройку параметров и поиск результатов. Mybatis может использовать простые XML или аннотации для конфигурации и примитивов карты, интерфейсов карты и Java Pojos (простые старые объекты Java) для записей базы данных.
Адрес проекта Mybatis/онлайн -документация.
Сначала встретитесь с Mybatis
Использование mybatis требует добавления следующих зависимостей в pom.xml:
<code> <dependency> <groupid> org.mybatis </groupid> <artifactid> mybatis </artifactid> <sersive> 3.3.0 </version> </depervice> <dehydency> <groupid> mysql </GroupId> <artifactid> mysql-connector-java </artifactid> <serive> 5.1.36 </code>
Выбирать
Настройте mybatis/mybatis-configuration.xml
Как глобальный файл конфигурации Mybatis, он настроен с информацией Mybatis в среде (например, источник данных/файл Mapper и т. Д.).
<code> <code> <!-{cke_protected} {C}%3C!%2D%2D%3FXML%20version%3D%221,0%22%20 ENCODING%3D%22UTF-8%22%20%3F%2D%2D%3E-> <Конфигурация> <Окружающая среда id = "Development"> <!-{cke_protected} {c}%3C!%2D%2D%20%E9%85%8D%E7%BD%AEJDBC%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%2D%3E 3E 3E type = "jdbc"> <!-{cke_protected} {C}%3C!%2D%2D%20%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90%2D%2D%3E-> <DADASURCE TIPS = "PRAPITED". value = "com.mysql.jdbc.driver"> <свойство name = "url" value = "jdbc: mysql: // host: port/db? Характерпольгинг = utf-8"> <name = "username"> <имя свойства = "Пароль" value = "password"> </property> </property> </property> </dataSource> </transactionManager> </environment> </ervines> <!-{c KE_Protected} {C}%3C!%2D%2D%20%E5%8A%A0%E8%BD%BDMAPPER%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6%20%2D%2D 3E-> <MAPPERS> <MAPPER resource = "mybatis/mapper/userdao.xml"> </mapper> </mappers> </configuration> </code>Написание userdao (карта карты)
Самая основная часть Mybatis настроена с помощью операторов SQL, которые управляют базой данных:
<code> <code> <code> <!-{cke_protected} {C}%3C!%2D%2D%3FXML%20version%3D%221,0%22%20encoDing%3D%22UTF-8%22%20%3F%2D%2D%3E-> <MapPer-namespace = "namesspace"> <Select ID "Select ByD" Select ById "selectUd" in viedURBIED "Select ById" = "Select" Select ByID "=" SELACTIOD "SELACTURBIED" neCedUD ". ParameterType = "java.lang.integer" recouttype = "com.fq.domain.user"> select * из пользователя, где id = #{id}; </select> <select id = "selectUserbyName" parametertype = "java.lang.string" recordype = "com.fq.domain.UseRe. '%$ {value}%'; </select> </mapper> </code> </code> Описание атрибута
Пространство имен имен, используемое для изоляции операторов SQL
ParameterType определяет тип входного отображения SQL, а Mybatis получает параметры из входного объекта через OGNL, чтобы пройти в операторы SQL.
ResultType определяет тип отображения выходного сигнала SQL. Mybatis отображает ряд записей результатов SQL -запроса на тип, указанный Restulitype.
Имя файла сопоставления Mapper включает в себя userdao.xml/usermapper.xml/user.xml и другие формы. Они обычно хранятся в каталоге Mapper того же уровня, что и mybatis-configuration.xml. Поскольку его основная функция заключается в определении взаимосвязи между операторами SQL и отображением, она обычно коллективно называется файлами отображения Mapper.
Определите класс PO
Основной функцией класса PO является отображение SQL (вход/вывод), которое обычно соответствует таблицам базы данных:
<code> <code> <code> <code> <code>/*** @author jifang*@since 15/12/31 14:27.*/Public Class User {Private Integer Id; Private String Parpor {return id;} public void setId (integer id) {this.id = id;} public String getName () {return name;} public void setName (string name) {this.name = name;} public String getPassword () {return passwer;} public void setPassword (String password) {this.pass Word = password; "User {" + "id =" + id + ", name = '" + name +'/'' + ", password = '" + password +'/'' + '}';}} </code> </code> </code> </code>UserDao (Java Object)
Получите SQLSession, выполните операторы SQL и получите результат отображения:
<code> <code> <code> <code> <code> <code> <code>/*** @Author jifang*@since 16/2/24 18:15. SQLSessionFactoryBuilder (). Build (resources.getResourCeasStream (Resource));}@testpublic void selectUserbyId () {try (sqlSession session = factory.opensession ()) {user user = session.selectone ("namespace.selectuserbyid", 1); system.ourt.println ("inomepace.selectuserbyid", 1); system.ourtln ("usepace.selectuserbyid", 1); selectUserByName () {try (sqlSession session = factory.opensession ()) {list <user> users = session.selectlist ("namespace.selectuserbyname", "student"); для (пользователь пользователя: пользователи) {system.out.println (user);}}}} </user> </code> </code> </code> </code> </code>Вставлять
карт
<code><code><code><code><code><code><code><code><code><code><insert id="insertUser" parametertype="com.fq.domain.User">INSERT INTO user(name, password) VALUES(#{name}, #{password});</insert></code></code></code></code>UserDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertuser () {try (sqlsession session = factory.opensession ()) {user user = new User (); user.setname ("new_name1"); user.setpassword ("new_password"); session.insert ("namespace.insertuser", user); session.commit ();}} </code> </code> </code> </code> </code> </code> Вернуться с помощью первичного ключа автоматического интеграции
Измените файл MAPPER и добавьте его, и вы можете вернуть первичный ключ автоматического вступления в MySQL (т.е. идентификатор, сгенерированный при только что вставленные данные):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <INSERT ID = "INSERTUSER" PARAMETERTYPE = "COM.FQ.Domain.USER"> <selectKey KeyProperty = "ID" ordust = "upe" upectype = "java.lang. Fast_insert_id (); </selectKey> INSERT в пользователь (имя, пароль) значения ( #{name}, #{пароль}); </insert> </code> </code> </code> </code> </code>UserDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertuser () {try (sqlsession session = factory.opensession ()) {system.ourintln (session); user user = new user (null, newme », newme», », new.,», new., », new», », new. "new_password"); session.insert ("namespace.insertuser", user); // Вам нужно получить первичный ключ Autoincrement.Эта функция также может быть выполнена с помощью свойств использования генерированных клейков/KeyProperty, пожалуйста, обратитесь к документации Mybatis для получения подробной информации.
Обновлять
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <Обновление идентификатор = "updateUserById" parameterType = "com.fq.domain.user"> Обновление пользователя name = #name}, passwor #{id}; </update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>UserDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void updateUserbyId () {try (sqlSession Session = factory.opensessession (true) {session.update., nevally. "feiqing", "icy5yqxzb1uwswsswcvlsnlca =="));}} </code> </code> </code> </code> </code> </code> </code> </code> </code>Удалить
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <delete id = "deleteUserbyid" #{id}; </delete> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>UserDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void deleteUserbyid () {try (sqlsession = factory.opensessessed (true)) {session.delete ("namespace.deleteuserbyid", 51615);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>краткое содержание
#{}/$ {}
#{}: Представляет заполнитель, реализует настройку значения для заполнителя подготовленного Statement ( #{} представляет заполнитель?) И автоматически преобразует тип Java в тип JDBC (так что #{} может эффективно предотвратить инъекцию SQL). #{} может получить простой тип или значения атрибутов PO. Если ParameterType передает одно простое значение типа, #{} может быть значением или другими именами в кудрявых скобках #{}. $ {} может использоваться для сплайсинга строк SQL. Содержание параметратип может быть сплайсирован в SQL без преобразования типа JDBC. $ {} может использоваться для получения простого типа или значений атрибутов PO. Если параметрический тип передает одно простое значение типа, $ {} может использоваться только для значения в кудрявых скобках $ {}.
Хотя $ {} не может предотвратить инъекцию SQL, иногда $ {} очень удобен (например, порядок путем сортировки, имена столбцов должны передаваться в SQL через параметры, а затем используется порядок $ {Column}, и #{} не может использоваться для реализации этой функции (см. Основное обсуждение JDBC на подготовленном подготовке).
SQLSession
Предоставьте методы управления базой данных (например: selectone/selectlist). Тем не менее, SQLSession-это невыполнение потока, поэтому лучше определить ее как локальную переменную для использования.
Преимущества Mybatis (по сравнению с JDBC)
SQL написан в коде Java, что затрудняет поддержание. Mybatis пишет SQL в Mapper, а XML отделен от кода Java. Сложно передавать параметры с операторами SQL (например: SQL, где условия разные, типы данных SQL отличаются от Java). Mybatis автоматически отображает объекты Java с операторами SQL через параметрический тип. Набор результатов. Mybatis автоматически отображает результаты выполнения SQL в объекты Java через ResultType.
Приложение: Лучше всего добавить реализацию системы журнала (Logback/log4j) в pom.xml, чтобы информация о журнале была напечатана при отладке программы, что облегчает проверку ошибок. Возьмите резерв в качестве примера:
Pom.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <depected> <groupid> chos.logb ack </groupid> logback-classic </artifactid> <sersion> 1.1.2 </version> </depertive> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
rageback.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <propertive> "logroot" value> <code> <code> <code> <configuration> <property name = "logroot"/data/logs "> <day> value = " %d {hh: mm: ss.sss} [ %inteach] %-5level %logger {0} - %msg %n"> <vall name = "stdout"> <coder> <tlement> $ {pattern} </pattern> </encoder> </appender> name="FILE"><rollingpolicy><filenamepattern>${logRoot}/common-server.%d{yyyy-MM-dd}.log</filenamepattern><maxhistory>7</maxhistory></rollingpolicy><encoder><pattern>${pattern}</pattern></encoder></appender><root level = "debug"> <appender-ref ref = "stdout"> <appender-ref ref = "file"> </appender-ref> </appender-ref> </root> </property> </property> </configuration> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Для других подробностей о журналах Mybatis, пожалуйста, обратитесь к разделу журнала документов Mybatis.
Dao Development
Есть два способа разработки DAO с использованием Mybatis, оригинальная разработка DAO и картирование Mapper Dao Development.
Оригинальная разработка DAO Оригинальная разработка DAO требует, чтобы разработчики писали интерфейсы DAO и реализации DAO, такие как запрос информации пользователя на основе идентификатора:
Mapper (так же, как и раньше)
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <celect id = "selectUserbyid" parameterType = "java.l. resultType = "com.fq.domain.user"> select * of user where id = #{id}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </cod> </cod> Интерфейс userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code>/*** @author jifang*@sisince 16/21:20. {User selectUserbyId (INTEGER ID) Throws Exception;} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </cod> </code> </code> </code> </code> </cod> Реализация userDao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>public class UserDAOImpl implements UserDAO {private SqlSessionFactory Factory; public userDaoImpl (sqlSessionFactory Factory) {this.Factory = factory;}@overdePublic пользователя SelectUserById (INTEGER ID) THRES EXCERCOS {SQLSESSION SESSION = factory.Opensession (); пользователь пользователь = session.selectone ("namepace.selectuserbyid", id); sessionclose () session ("namepace.selectuserbyid", id); session (););););); user;}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Клиент
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> OriginalClient () выбрасывает Exception {userDao dao = new userDaoImpl (new sqlSessionFactoryBuilder (). Build (classLoader.getSySteMresourCeasStream ("mybatis/mybatis-configuration.xml")); пользователь = пользователь = dao.selectuserbyid (1); System.out.println (user);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Проблемы в оригинальной разработке DAO:
1) Существует много процедурных кодов в органе метода реализации DAO.
2) Вызов метода SQLSession (SELECT/INSERT/UPDATE) требует указания идентификатора оператора, который жестко кодируется, который не способствует обслуживанию кода.
Картографирование картирования Mapper
Метод разработки отображения Mapper требует только написания интерфейса DAO, а Mybatis динамически создает реализацию интерфейса на основе определения интерфейса и операторов SQL в файле Mapper.
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <!-? namespace = "com.fq.mybatis.userdao"> <select id = "selectUserbyId" parameterType = "java.lang.integer" resultype = "com.fq.domain.user"> select * из пользователя, где идентификатор = #{id}; </select> </mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Примечание. В настоящее время пространство имен должно быть таким же, как и полностью квалифицированное имя интерфейса userdao.
Интерфейс userdao такой же, как и раньше, но клиент userDaoImpl больше не используется.
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>/*** @author jifang* @since 16/2/22 2:57 PM.*/Public Class MyBatisclient {Private SQLSession Session; Private SQLSessionFactory Factory; @beforePublic void setup () {factory = new sqlSessionFactoryBuilder (). Build (classLoader.getSystemresourceasStream ("myBatis/mybatis-configuration.xml"); factory.opensession ();}@testpublic void mappperclient () throws exception {userdao dao = session.getmapper (userdao.class); user user = dao.selectuserbyid (1); System.out.println (user);}@Afterpublic void Teardowndown ();); {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Методы разработки отображения карт Mapper должны следовать следующим спецификациям:
Пространство имен в файле Mapper такое же, как и полностью квалифицированное имя интерфейса DAO; Идентификатор оператора в файле Mapper такой же, как и имя метода интерфейса DAO; ParameterType/ResultType оператора в файле MAPPER совпадает с параметрами/результатом метода DAO.
Картирование Mapper
Основная функция файлов отображения Mapper (например, userDao.xml) - определить операторы SQL (каждый SQL является оператором), который является ядром Mybatis.
Mybatis официально рекомендует использовать метод картирования Mapper для разработки DAO, поэтому мы не будем слишком много рассказывать о разработке оригинального DAO в будущем.
Входное отображение
Несколько формальных параметров
Был использован предыдущий пример прохождения простых типов, поэтому я не буду повторять его здесь. Когда необходимо пройти несколько формальных параметров, параметр параметра более не необходим:
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> industum stele> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> #{1}, password = #{2} WHERE id = #{0};</update></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>UserDao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>void updateUserById(Integer id, String name, String password) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>
Входящий по
Mybatis использует выражение ognl для анализа значений атрибута объекта:
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUserBynamePassword" parameterType = "com.fq.domain.user" resultype = "com.fq.domain.user"> select *из пользовательского имени = #{name} и password = #{password}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>UserDao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>User SelectUserBynamePassword (пользователь пользователя) Exception; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod> </cod>
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectuserbymap" parametertype = "java.util.map" resultype = "com.fq.domain.user"> select *из пользовательского имени = #{name} и пароль = #{password};</select></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>#{} Соответствующий ключ карты в кудрявых скобках.
UserDao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>User selectUserBymap (map <string, object = ""> map) бросает Exception;</string,></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>
Выходное отображение
Вывод простой тип
карт
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUsercount" parameterType = "java.lang.string" resultyType = "java.lang.integer"> выберите Count (*) из имени пользователя, как '%$ {value}%'; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code > </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>UserDao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>Integer selectUserCount(String name) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>
Возвращение простого типа должен убедиться, что результат запроса имеет только одну строку записей, а значение первого поля наконец преобразуется в выходной тип.
Вывод объект PO/список
Два типа вывода были продемонстрированы ранее (SelectUserbyId/SelectUserByName использовал исходный метод разработки DAO в то время, но форма определения Mapper была одинаковой), поэтому я сделаю только простое резюме здесь:
Результат, определяемый в Mapper при выводе одного объекта PO, такой же, как и ResoudType, определенный в Mapper; Результат запроса SQL должен быть гарантированно, чтобы быть единственным куском данных, и он называется внутренне с использованием метода SelectOne; В результате вывода PO указывается, что результат запроса может быть множественным, и он называется внутренне с использованием метода SelectList, а возвращаемое значение интерфейса может быть размещено по списку/набору.
Выходная карта
Вместо этого может использоваться выходной объект PO для использования вывода карты с именем поля в качестве ключа и значения поля в качестве значения.
карт
<code> <select id = "selectUserLikEname" outdetype = "java.util.map"> select *из имени пользователя, как '%$ {value}%'; </select> </code>UserDao
<code> <code> list <map <string, object = "" >> selectUserLikEname (string name) throws Exception; </map <string,> </code> </code>
ResultMap
ResultType может сопоставить результат запроса с PO, но предпосылка заключается в том, что имя свойства PO и имя поля SQL должны быть одинаковыми. Если это непоследовательно, соответствующее отображение может быть сделано через карту результата:
карт
<code> <code> <code> <resultmap id = "usermap" type = "com.fq.domain.user"> <id column = "user_id" property = "id"> <result column = "user_name" property = "name"> <result column = "user_password" property = "password"> </result> </id> </resultmap> <seult Id = "selectUseR wopture"> </result> </id> </resultmap> <seult Id = "selectUras ParameterType = "java.lang.string" resultMap = "usermap"> selectId user_id, name user_name, пароль user_passwordfrom kelection name = #{name}; </select> </code> </code> </code>Интерфейс userdao такой же, как и раньше.