Как установить информацию для входа в базу данных из переменной?

Я использую MyBatis в проекте Java. Я знаю, что информация о доступе к базе данных, такая как хост, имя базы данных, имя пользователя и пароль, хранится в configuration.xml. Но я хотел бы знать, могу ли я установить эту информацию для входа в мою программу Java.

Это потому, что мое приложение обращается к разным базам данных по разным адресам, и я настраиваю их в приложении. Пожалуйста помогите.


person Petr Velký    schedule 17.05.2011    source источник
comment
Вам нужно подключаться к разным БД одновременно? Или вам просто нужна разная информация о БД для разных сред (dev, test, prod,...)?   -  person AngerClown    schedule 17.05.2011


Ответы (6)


XML-файл конфигурации поддерживает элемент <properties>. Вы можете либо указать на внешний файл (через атрибут resource), либо определить каждый <property> непосредственно в xml.

На свойства можно ссылаться в других местах в XML-файлах конфигурации и сопоставления Mybatis с синтаксисом ${property}, подобным этому (из документация):

<properties resource="org/mybatis/example/config.properties"> 
  <property name="username" value="dev_user"/> 
  <property name="password" value="F2Fa3!33TYyg"/> 
</properties> 

<dataSource type="POOLED"> 
  <property name="driver" value="${driver}"/> 
  <property name="url" value="${url}"/> 
  <property name="username" value="${username}"/> 
  <property name="password" value="${password}"/> 
</dataSource> 

Обратите внимание, что элементы свойств переопределяют любые свойства, определенные в файле.

person AngerClown    schedule 17.05.2011
comment
Итак, я попытался создать такое свойство, но, вероятно, это не то, что мне делать. Итак, мне нужно создать файл config.propeties, как вы написали, но как я могу отправить свои динамические данные в эти свойства? Вот что я пробовал: Properties props = null; props.setProperty("username", "root"); Reader reader = Resources.getResourceAsReader("wsnscc/mybatis/xml/Configuration.xml"); FACTORY = new SqlSessionFactoryBuilder().build(reader, props); - person Petr Velký; 18.05.2011
comment
Это должно сработать. Можете ли вы убедиться, что FACTORY.getConfiguration().getVariables().getProperty("username") возвращает ожидаемое значение? - person AngerClown; 18.05.2011
comment
Я думаю, что понял, но теперь я пытаюсь выяснить, как отправить переменную с данными в класс mybatissqlsessionfactory. Я создаю factory следующим образом: session = MyBatisSqlSessionFactory.getSqlSessionFactory().openSession(); mapper = session.getMapper(StaticMapper.class); Но мне нужна переменная с информацией для входа в систему, чтобы как-то установить свойства внутри MyBatisSqlSessionFactory. - person Petr Velký; 19.05.2011
comment
Конфигурация читается только после создания SqlSessionFactory. Если вы пытаетесь подключиться к нескольким БД, вам необходимо создать одну SqlSessionFactory для каждой БД. - person AngerClown; 19.05.2011
comment
Моя проблема не в том, что я использую несколько баз данных. Я просто не знаю, как отправить эти свойства из основной программы в статический класс MyBatisSqlSessionFactory, где устанавливаются свойства базы данных. Мне просто нужно создать в основной программе какой-то файл со свойствами, а затем я могу создать сеанс, когда factory читает тот же файл с conf? Буду признателен за образец кода... - person Petr Velký; 21.05.2011
comment
Код в вашем первом комментарии выглядит правильно для этого, за исключением props = null. Вы можете загрузить свойства с чем-то вроде: props = Properties.load(Resources.getResourceAsStream("file.properties")). - person AngerClown; 22.05.2011
comment
Ссылка на документацию мертва. - person michaelgulak; 14.01.2017

Поскольку существующих ответов было недостаточно, чтобы помочь мне с той же проблемой, вот мое решение. Работает с myBatis 3.2.1.

1. In mybatis-config.xml

  • Добавьте те элементы свойств, которые вы хотите установить изнутри Java, в раздел <property>.
  • Обратитесь к этим элементам в разделе <dataSource>, используя ${*property*} в качестве значения.
<?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>
        <property name="url" value=""/>
        <property name="username" value=""/>
        <property name="password" value=""/>
    </properties>            
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>  
            <dataSource type="POOLED">
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    ...
    </mappers>
</configuration>

2. В Яве

Создайте объект Properties, добавьте свойства, которые вы выбрали для установки вручную, и передайте их методу build() при получении SqlSessionFactory:

Properties properties = new Properties();
properties.setProperty("username", "myUser");
properties.setProperty("password", "myPwd");
properties.setProperty("url", "myConnectionURL");

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
person user905686    schedule 21.03.2013

Поскольку существующих ответов было недостаточно, чтобы помочь мне с той же проблемой, вот мое решение. Работает с myBatis 3.0.3.

файл 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>
    <properties>
        <property name="url" value=""/>
        <property name="username" value=""/>
        <property name="password" value=""/>
    </properties>            
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>  
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    ...
    </mappers>
</configuration>

Java-код:

Properties properties = new Properties();
properties.setProperty("username", userName);
properties.setProperty("password", password);
properties.setProperty("url", dbURL);

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, properties);

Примечание. Для myBatis 3.0.3 метод SqlSessionFactoryBuilder().build() не принимает InputStream в качестве параметра, как это предлагается в ответе пользователя 905686, вместо этого следует использовать Reader.

person Sumit    schedule 08.04.2015

Если вы хотите использовать Spring 4 и @Configuration в Data Config

Как установить fetchSize для оператора select iBatis

Разница в том, как вы можете загрузить файл конфигурации

@Value("classpath:mybatis-config.xml")
private Resource myBatisResource ;
person vsingh    schedule 16.05.2017

Напишите себе источник данных, который расширяет форму BasicDataSource, следующим образом.

package org.popkit.mydatasource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;

import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

public class MyDataSource extends BasicDataSource implements InitializingBean {

public Logger getParentLogger() throws SQLFeatureNotSupportedException {
    return null;
}

@Override
public void afterPropertiesSet() throws Exception {
    String url = this.getUrl();

    // following do as yourself
    if (StringUtils.isBlank(url)) {
        this.setUrl("#your jdbc.url");
    }
    String username = this.getUsername();
    if (StringUtils.isBlank(username)) {
        this.setUsername("#your jdbc.username");
    }
    String password = this.getPassword();
    if (StringUtils.isBlank(password)) {
        this.setPassword("#your jdbc.pwd");
    }
}

}

в xml

<bean id="dataSource" class="org.popkit.mydatasource.MyDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value=""/>
    <property name="username" value="" />
    <property name="password" value=""/>
    <property name="initialSize" value="2" />
    <property name="maxActive" value="30" />
    <property name="maxIdle" value="10" />
    <property name="minIdle" value="3" />
    <property name="maxWait" value="30000" />
    <property name="removeAbandoned" value="true" />
    <property name="removeAbandonedTimeout" value="30" />
    <property name="validationQuery" value="SELECT 1" />
</bean>
person Aborn Jiang    schedule 27.02.2018

Сначала напишите информацию о драйвере, имени пользователя, пароле в каком-либо файле и прочитайте содержимое этого файла в своем приложении Java.

Свойства свойства=новые свойства();

properties.load("ВХОДНОЙ ПОТОК");

person pmad    schedule 17.05.2011
comment
А потом? Ваш ответ не кажется полным. - person user905686; 21.03.2013