Вот пошаговое объяснение, как установить MySQL и JDBC и как его использовать:
3306
. -cp
или -classpath
при выполнении вашего Java-приложения. java -cp .;/path/to/mysql-connector.jar com.example.YourClassЗдесь есть
.
, чтобы добавить каталог current в путь к классам, чтобы он мог найти com.example.YourClass
, а ;
- разделитель классов, как в Windows. В Unix и клоны :
должны использоваться. javabase
. Вы, конечно, хотите World Domination, так что давайте использовать UTF-8. CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
root
является плохой практикой. CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
Да, java
- это имя пользователя, а password
- пароль здесь. jdbc:mysql://hostname:port/databasename
hostname
: имя хоста, на котором установлен сервер MySQL. Если он установлен на том же компьютере, где вы запускаете Java-код, вы можете просто использовать localhost
. Он также может быть IP-адресом, например 127.0.0.1
. Если вы столкнулись с проблемами подключения и с помощью 127.0.0.1
вместо localhost
решили проблему, у вас возникла проблема в конфигурации вашей сети / DNS / hosts. port
: порт TCP / IP, в котором слушает сервер MySQL. Это по умолчанию 3306
. databasename
: имя базы данных, к которой вы хотите подключиться. Это javabase
. Итак, конечный URL должен выглядеть так: jdbc:mysql://localhost:3306/javabase
main()
для проверки соединения. String url = "jdbc:mysql://localhost:3306/javabase";
String username = "java";
String password = "password";
System.out.println("Connecting database...");
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Database connected!");
} catch (SQLException e) {
throw new IllegalStateException("Cannot connect the database!", e);
}
Если вы получили SQLException: No suitable driver
, это значит, что либо драйвер JDBC не был полностью загружен, либо неправильный URL JDBC (т. е. он не был распознан ни одним из загруженных драйверов). Как правило, драйвер JDBC 4.0 должен быть автоматически загружен, когда вы просто бросаете его в путь к классам времени выполнения. Чтобы исключить одно и другое, вы всегда можете вручную загрузить его, как показано ниже: System.out.println("Loading driver...");
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded!");
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Cannot find the driver in the classpath!", e);
}
Обратите внимание, что вызов newInstance()
здесь не требуется. Это просто исправить старую и багги org.gjt.mm.mysql.Driver
. Объяснение здесь . Если эта строка выбрасывает ClassNotFoundException
, то JAR-файл, содержащий класс драйвера JDBC, просто не помещается в путь к классам. Обратите внимание, что вам не нужно загружать драйвер каждый раз перед подключением . Только один раз во время запуска приложения достаточно. Если вы получаете SQLException: Connection refused
или Connection timed out
или специфичные для MySQL CommunicationsException:
Communications link failure
, то это означает, что БД вообще недоступна. Это может иметь одну или несколько из следующих причин: неправильный IP-адрес или имя хоста в URL-адрес JDBC. Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером. Номер порта отсутствует или неверен в URL-адресе JDBC. Сервер БД отключен. Сервер БД не принимает соединения TCP / IP. У сервера БД закончились соединения. Что-то между Java и DB блокирует соединения, например. брандмауэр или прокси. Чтобы решить тот или иной, выполните следующие советы: Проверьте и проверьте их с помощью ping
. Обновите DNS или используйте IP-адрес в URL-адрес JDBC. Проверьте его на основе my.cnf
базы данных MySQL. Запустите БД. Убедитесь, что mysqld запущен без --skip-networking option
. Перезагрузите базу данных и исправьте свой код соответствующим образом, чтобы он закрывал соединения в finally
. Отключите брандмауэр и / или настройте брандмауэр / прокси, чтобы разрешить / переслать порт. Обратите внимание, что закрытие Connection
чрезвычайно важно. Если вы не закрываете соединения и не получаете их много за короткое время, тогда в базе данных могут отсутствовать соединения, и ваше приложение может сломаться. Всегда приобретайте Connection
в инструкции try-with-resources
. Или, если вы еще не на Java 7, явно закрывайте его в finally
блока try-finally
. Закрытие в finally
заключается только в том, чтобы оно было закрыто, а также в случае исключения. Это также относится к Statement
, PreparedStatement
и ResultSet
. Это было так далеко, что касается возможности подключения. Вы можете найти здесь более продвинутое руководство по загрузке и хранению полнофункциональных объектов модели Java в базе данных с помощью базового класса DAO.
Использование шаблона Singleton для соединение с БД является плохим подходом. См. Также другие вопросы: http://stackoverflow.com/q/9428573/ . Это ошибка первого запуска.
s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
Вам не нужно escape
дважды, когда вы используете raw mode
.
Выход: ['123', '3.1415926']
Также тип возврата будет списком strings
.Если вы хотите, чтобы возвращаемый тип, как integers
и floats
, использовал map
import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))
Выход: [123, 3.1415926]
Здесь есть две вещи:
re.findall
возвращает захваченные тексты, если шаблон регулярного выражения содержит в нем группы захвата r'\\.'
в вашем шаблон соответствует двум последовательным символам, \
и любому символу, отличному от новой строки. См. ссылку findall
:
Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.
blockquote>Обратите внимание, что чтобы
re.findall
возвращали только совпадающие значения, вы обычно можете
- удаляет избыточные группы захвата (например,
(a(b)c)
->abc
)- преобразует все группы захвата в , не захватывая (то есть замените
(
на(?:
) , если отсутствуют обратные ссылки, которые относятся к значениям группы в шаблоне (см. ниже)- вместо
re.finditer
использовать[x.group() for x in re.finditer(pattern, s)]
)В вашем случае
findall
вернул все захваченные тексты, которые были пустыми, потому что вы\\
в [литерале] строкиr''
, которые пытались сопоставить литерал\
.Чтобы соответствовать номерам, вам нужно использовать
-?\d*\.?\d+
Регулярное выражение соответствует:
-?
- Дополнительный знак минус\d*
- Необязательные цифры\.?
- Дополнительный десятичный разделитель\d+
- 1 или более цифр.См. demo
Вот демон IDEONE :
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)