«Серия Mybatis» Начало работы с Mybatis

задняя часть
«Серия Mybatis» Начало работы с Mybatis

Эта серия статей GithubРасширенное руководство по серверной частиОн был включен, этот проект совершенствуется, добро пожаловать в звезду.

Познакомьтесь с MyBatis

Справочный веб-сайт mybatis: http://www.mybatis.org/mybatis-3/zh/index.html

Исходный адрес Github: https://github.com/mybatis/mybatis-3

Что такое Мибатис

MyBatis — отличныйСтруктура сохраняемого уровня, который поддерживает пользовательский SQL, хранимые процедуры и расширенное сопоставление. MyBatis избегает почти всего кода JDBC и ручной настройки параметров и получения наборов результатов, он может использовать простыеXMLилианнотацияЧтобы настроить и сопоставить информацию SQL, сопоставьте интерфейсы и Java POJO (обычные старые объекты Java, обычные объекты Java) с записями в базе данных.

Происхождение Мибатиса

  • MyBatis — это проект с открытым исходным кодом iBatis от Apache.
  • В 2010 году этот проект был перенесен в код Google компанией Apache Software Foundation и переименован в MyBatis.
  • Мигрировал на Github в ноябре 2013 года.

что такое ОРМ

Объектно-реляционное сопоставление (OBJECT/RELATIONALMAPPING, ORM для краткости)метод разработки программного обеспеченияпроизводится путем разработки. Используется для сопоставления объектов, представленных объектной моделью, со структурой базы данных реляционной модели на основе SQL. Таким образом, когда мы специально работаем с объектом-сущностью, нам больше не нужно иметь дело со сложными операторами SQL, а просто оперировать атрибутами и методами объекта-сущности. Технология ORM обеспечивает мост между объектами и отношениями, и данные объектного типа на переднем плане и реляционные данные в базе данных преобразуются друг в друга через этот мост.

Фреймворк ORM и отличие MyBatis

Контраст Mybatis Hibernate
доля рынка высоко высоко
подходящая отрасль Интернет-проект электронной коммерции Традиционный (ERP CRM OA)
представление высоко Низкий
Гибкость SQL высоко Низкий
порог обучения Низкий высоко
Файл конфигурации SQL Глобальный файл конфигурации, файл сопоставления Глобальный файл конфигурации, файл сопоставления
ORM полуавтоматический полная автоматизация
Независимость от базы данных Низкий высоко

процесс кодирования

  1. Напишите глобальный файл конфигурации: xxxConfig.xml
  2. POJO-класс
  3. Файл карты: xxxMapper.xml
  4. Напишите код дао: интерфейс xxxDao, класс реализации xxxDaoImpl
  5. Класс тестирования подразделения

нужно

1. Запросите информацию о пользователе в соответствии с идентификатором пользователя.

2. Список информации о пользователях с нечетким запросом на основе имени пользователя.

3. Добавьте пользователей

Строительство проекта

  • Создайте проект maven: mybatis-demo
  • POM-файл
<dependencies>
        <!-- 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>5.1.35</version>
        </dependency>

        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  • SqlMapConfig.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>
    <properties resource="db.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>
  • 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">
<mapper namespace="test">
</mapper>
  • класс ЗП
public class User {

    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // getter\setter方法
}

Реализация спроса

запросить пользователя

файл карты

<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User">
    select * from user where id = #{id} 
</select>

<!-- 根据名称模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="java.lang.String" 
            resultType="com.kkb.mybatis.po.User">
     select * from user where username like '%${value}%' 
</select>

Инструкции по настройке:

 - parameterType:定义输入参数的Java类型,
 - resultType:定义结果映射类型。
 - #{}:相当于JDBC中的?占位符
 - #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
 - ${value}:取出参数名为value的值。将${value}占位符替换。    

注意:如果是取简单数量类型的参数,括号中的参数名称必须为value

Интерфейс Dao и класс реализации

public interface UserDao {
    public User findUserById(int id) throws Exception;
  public List<User> findUsersByName(String name) throws Exception;
}
  • жизненный цикл (сфера применения)
  1. sqlsession: уровень метода
  2. sqlsessionFactory: глобальная область (уровень приложения)
  3. sqlsessionFactoryBuilder: уровень метода
public class UserDaoImpl implements UserDao {
    //注入SqlSessionFactory
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this. sqlSessionFactory = sqlSessionFactory;
    }

    private SqlSessionFactory sqlSessionFactory;

    @Override
    public User findUserById(int id) throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        User user = null;
        try {
            //通过sqlsession调用selectOne方法获取一条结果集
            //参数1:指定定义的statement的id,参数2:指定向statement中传递的参数
            user = session.selectOne("test.findUserById", id);
            System.out.println(user);   
        } finally{
            session.close();
        }
        return user;
    }


    @Override
    public List<User> findUsersByName(String name) throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        List<User> users = null;
        try {
            users = session.selectList("test.findUsersByName", name);
            System.out.println(users);      
        } finally{
            session.close();
        }
        return users;
    }
}

тестовый код

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws Exception {
        SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testFindUserById() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        User user = userDao.findUserById(22);
        System.out.println(user);
    }
    @Test
    public void testFindUsersByName() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        List<User> users = userDao.findUsersByName("老郭");
        System.out.println(users);
    }
}

Разница между #{} и ${}

  • разница 1
#{} :相当于JDBC SQL语句中的占位符? (PreparedStatement)

${}  : 相当于JDBC SQL语句中的连接符合 + (Statement)
  • разница 2
#{} : 进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加上’’)

${}  :进行输入映射的时候,将参数原样输出到SQL语句中
  • Отличие 3
#{} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,#{}中参数名称可以任意

${}  : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value
  • Отличие 4
${} :存在SQL注入问题 ,使用OR 1=1 关键字将查询条件忽略

Добавить пользователя

#{}: Получение данных посредством отражения --- StaticSqlSource

${}: через выражение OGNL уровень будет меняться соответственно вложенности объекта --DynamicSqlSource

файл карты

<!-- 添加用户 -->
    <insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
      insert into user(username,birthday,sex,address) 
      values(#{username},#{birthday},#{sex},#{address})
    </insert>

Интерфейс Dao и класс реализации

public interface UserDao {
    public void insertUser(User user) throws Exception;
}
public class UserDaoImpl implements UserDao {
    //注入SqlSessionFactory
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this. sqlSessionFactory = sqlSessionFactory;
    }

    private SqlSessionFactory sqlSessionFactory;

    @Override
    Public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            sqlSession.insert("test.insertUser", user);
            sqlSession.commit();
        } finally{
            session.close();
        }   
    }
}

тестовый код

    @Override
    Public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            sqlSession.insert("insertUser", user);
            sqlSession.commit();
        } finally{
            session.close();
        }

    }

возврат первичного ключа

<insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
        <!-- selectKey将主键返回,需要再返回 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select 1608976
        </selectKey>
       insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address});
    </insert>

Добавьте тег selectKey, чтобы вернуть первичный ключ.

  • keyProperty: указывает возвращаемый первичный ключ, свойство которого хранится в pojo.
  • order: порядок выполнения sql в теге selectKey соответствует оператору вставки. Из-за принципа самоинкремента mysql первичный ключ генерируется после выполнения оператора вставки, поэтому порядок выполнения selectKey здесь следующий.
  • resultType: тип JAVA, соответствующий возвращаемому первичному ключу.
  • 1608976: это функция mysql, которая возвращает значение идентификатора новой записи в столбце auto_increment.

Эта серия статей GithubРасширенное руководство по серверной частиОн был включен, этот проект совершенствуется, добро пожаловать в звезду.

Все статьи в официальном аккаунте написаны авторами блогов и будут постоянно обновляться. Если вы хотите стать свидетелем или расти вместе с блоггерами, добро пожаловать на внимание!

欢迎扫码关注哦!!!
Добро пожаловать, чтобы отсканировать код, чтобы следовать! ! !