Mybatis对JDBC进行封装,那平时数据库是否保持长连接?
备注:网友提示是用的连接池技术(c3p0 durid),查了下:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedstatement、callablestatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
先按照网上的教程搭了一个demo:(我觉得对于idea或java的工程目录我还是一知半解)
1、搭建maven项目(选择哪个quick start即可,这个方便项目自动下载依赖包)
2、创建的工程目录如下(这里面对App还有test,还是不理解是用来干啥的):
3、创建数据库,和插入测试数据
CREATE TABLE BOOK(
ID INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
NUMBER int );
insert into BOOK(NAME,NUMBER) VALUES
('Java程序设计',10),
('数据结构',10),
('设计模式',10)
4、各个文件里面的代码和配置:
(1)pom.xml(这里主要是加入依赖包的信息)
备注:这里所选择的数据库是mariadb,不知道改成mysql会是如何?
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--数据库相关 jar 包-->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.3.0</version>
</dependency>
<!-- JUnit单元测试工具 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
(2)BookDao
package com.wbg.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import com.wbg.entity.Book;
public class BookDao {
public Book getBookById(int id){
//使用类加载器加载mybatis的配置文件
InputStream inputStream=BookDao.class.getClassLoader().getResourceAsStream("config.xml");
//构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建能执行映射文件中的sql
SqlSession sqlSession=sqlSessionFactory.openSession();
Book book=sqlSession.selectOne("com.wbg.dao.bookMapper.selectBookById",id);
return book;
}
public static void main(String[] args) {
BookDao bookDao=new BookDao();
System.out.println(bookDao.getBookById(3));
}
}
(3)bookMapper
package com.wbg.dao;
import com.wbg.entity.Book;
public interface bookMapper {
Book selectBookById();
}
(4)Book
package com.wbg.entity;
public class Book {
int id;
String name;
int number;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", number=" + number +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Book(int id, String name, int number) {
this.id = id;
this.name = name;
this.number = number;
}
}
(5)bookmapper.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="com.wbg.dao.bookMapper">
<select id="selectBookById" resultType="com.wbg.entity.Book">
select * from Book where id=#{id}
</select>
</mapper>
(6)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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://XXXXXX:3306/XXXXTest"/>
<property name="username" value="root"/>
<property name="password" value="XXXXXX"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/bookMapper.xml"/>
</mappers>
</configuration>
以上操作,参考自https://www.cnblogs.com/weibanggang/p/9786178.html
遗留的疑问:
1、对于数据库的操作,一般会打成一个jar包,然后供各种业务开发需求调用是么?
2、getBookById中的工厂模式,一般只可以创建一个,这个还是一个女程序猿给我指点出来的,迟点再补充下工厂模式的内容
内容待续。。。。