質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.77%

  • Spring Boot

    212questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Spring Boot MavenでSQLite3に接続したい。

解決済

回答 1

投稿 2016/12/22 15:50 ・編集 2016/12/22 15:52

  • 評価
  • クリップ 0
  • VIEW 979
退会済みユーザー

退会済みユーザー

Spring Boot MavenでSQLite3に接続したいのですが、
STSを使用して「Spring Boot アプリケーション」を起動すると、
以下のエラーが出て起動出来ません。

(文字制限内とする為、import文などを削除してあります。)

「...Cannot load driver class: "org.sqlite.JDBC"」

発生している問題・エラーメッセージ

2016-12-22 14:55:50.236  WARN 7824 --- [main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.tomcat.jdbc.pool.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: "org.sqlite.JDBC"
...

該当のソースコード

SQLiteOperatorApplication.java

@SpringBootApplication
public class SQLiteOperatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(SQLiteOperatorApplication.class, args);
    }
}


ServletInitializer.java

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SQLiteOperatorApplication.class);
    }

}


Operator.java

@Entity
@Table(name="operator")
public class Operator {

    @Id
    @Column
    @NotNull
    @NotEmpty
    @Getter
    @Setter
    private int operatorId;

    @Column
    @NotNull
    @NotEmpty
    @Getter
    @Setter
    private String employmentId;

    @Column
    @NotNull
    @NotEmpty
    @Getter
    @Setter
    private String password;

    @Column
    @NotNull
    @NotEmpty
    @Getter
    @Setter
    private String userName;

    @Column
    @NotNull
    @NotEmpty
    @Getter
    @Setter
    private int userAuthority;

}


OperatorController.java

@Controller
public class OperatorController {
    protected static Logger log = LoggerFactory.getLogger( OperatorController.class ); 

    @Autowired
    OperatorRepository repository;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView index(
        @ModelAttribute("formModel")Operator operator, 
            ModelAndView mav) {
        log.info("★★★root accessed.★★★");
        mav.setViewName("index");
        mav.addObject("msg","this is operator list.");
        mav.addObject("formModel",operator);
        Iterable<Operator> list = repository.findAll();
        mav.addObject("operatorlist",list);
        return mav;
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    @Transactional(readOnly=false)
    public ModelAndView form(
            @ModelAttribute("formModel") 
            @Validated Operator operator,
            BindingResult result,
            ModelAndView mov) {
        ModelAndView res = null;
        if (!result.hasErrors()){
            repository.saveAndFlush(operator);
            res = new ModelAndView("redirect:/");
        } else {
            mov.setViewName("index");
            mov.addObject("msg","sorry, error is occured...");
            Iterable<Operator> list = repository.findAll();
            mov.addObject("datalist",list);
            res = mov;
        }
        return res;
    }
}


OperatorRepository.java

@Repository
public interface OperatorRepository  extends JpaRepository<Operator, Long> {

    public Operator findByOperatorId(int operatorId);
    public List<Operator> findByEmploymentId(String employmentId);
    public List<Operator> findByPasswordLike(String password);
    public List<Operator> findByUserNameLike(String userName);

}


index.html

<body>
    <h1 th:text="${msg}"></h1>
    <table border="2">
    <tr><th>ID</th><th>職番</th><th>パスワード</th><th>氏名</th><th>権限</th></tr>
    <tr th:each="obj : ${operatorlist}">
        <td th:text="${obj.operatorId}"></td>
        <td th:text="${obj.employmentId}"></td>
        <td th:text="${obj.password}"></td>
        <td th:text="${obj.userName}"></td>
        <td th:text="${obj.userAuthority}"></td>
    </tr>
    </table>
</body>
</html>


application.properties

spring.datasource.driverClassName="org.sqlite.JDBC"
spring.datasource.url="jdbc:sqlite:c:/operator.db"


pom.xml

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.operator</groupId>
    <artifactId>Operator</artifactId>
    <version>1.00</version>
    <packaging>jar</packaging>

    <name>SQLite</name>
    <description>Operator</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

試したこと

<scope>compile</scope>
を外してみましたが、同様でした。
pom.xml

        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
        </dependency>


PostgreSQLでは一覧表示したので、ロジックは合っていると思います。
pom.xml

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>


application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/operator
spring.datasource.username=postgres
spring.datasource.password=xxxxxxxx
spring.datasource.driverClassName=org.postgresql.Driver

補足情報(言語/FW/ツール等のバージョンなど)

Windows7
sts-3.8.2
java8

sqlte-jdbc-3.8.11.2.jar
を「参照ライブラリー」へ「ビルドパス」として構成しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

「gradle + mybatis-spring-boot-starter + SQLite3」でのコードを見つける事が出来たので、mavenへ適用する事で、SQLite3へのselectに成功しました。

小生、mybatisはこれが、初めて関わる案件なので「resultType=”map”」での返り値:

List<Map<String, Object>> result = session.selectList("SQLite3.mybatis.selectOperator");


を、spring-boot-starter-data-jpaでの

    public ModelAndView index(
        @ModelAttribute("formModel")Operator operator, 
            ModelAndView mav) {
        log.info("★★★root accessed.★★★");
        mav.setViewName("index");
        mav.addObject("msg","this is operator list.");
        mav.addObject("formModel",operator);
        Iterable<Operator> list = repository.findAll();
        mav.addObject("operatorlist",list);
        return mav;
    }


の「Iterable<Operator> list = repository.findAll();」を、どう書き換えるのかの調査に移ります。

===== 設定 =====
pom.xml
mybatis-spring-boot-starter1.2.0
を稼動させるには
spring-boot-starter-parent1.4.3.RELEASE
が必要な様でした。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
        </dependency>


mybatis-config.xml

<configuration>
    <environments default="operator_id">
        <environment id="operator_id">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.sqlite.JDBC"/><!-- sqliteのドライバーを設定 -->
                <property name="url" value="jdbc:sqlite:c:/operator.db"/><!-- dbのファイルパス -->
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="operator_mapper.xml"/>
    </mappers>
</configuration>


application.properties

spring.datasource.driverClassName=org.sqlite.JDBC
spring.datasource.url=jdbc:sqlite:c:operator.db


operator_mapper.xml

<mapper namespace="SQLite3.mybatis">
    <select id="selectOperator" resultType="map">
        select * from operator
    </select>
</mapper>


p.s.
小生のSTS mavenの環境では
mybatis-config.xml
application.properties
の両方に、DB接続設定を記述しないと、Spring Boot起動時にエラーとなりました。

あと、Spring Boot起動時に

WARN 5480 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.operator]' package. Please check your configuration.


が出ているので、これを解決すれば、
「「Iterable<Operator> list = repository.findAll();」を、どう書き換えるのか」
の解決になるのではないかと思っています。

投稿 2017/01/12 13:33

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.77%

関連した質問

同じタグがついた質問を見る

  • Spring Boot

    212questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。