DriverManager: 注册驱动,获取连接
Connection: 表示连接,java程序和数据库之间的桥梁
Statement: 执行SQL语句的对象,小货车
ResultSet: 结果集,查询的结果都会保存到结果集中
使用PreparedStatement
能够了解什么是框架
掌握mybatis框架开发快速入门
理解自定义mybatis框架
mybatis_day01_01_helloworld 体验mybatis第1个项目
mybatis_day0101_02_framework 自定义框架
学习连接池的原理和好处
每次创建数据库连接的问题
我们现实生活中每日三餐。我们并不会吃一餐饭就将碗丢掉,而是吃完饭后将碗放到碗柜中,下一餐接着使用。目的是重复利用碗,我们的数据库连接也可以重复使用,可以减少数据库连接的创建次数。提高数据库连接对象的使用率。
连接池的概念: 连接池是创建和管理数据库连接的缓冲池技术。连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。
连接池中会保存一些连接,这些连接可以重复使用,降低数据资源的消耗
javax.sql.DataSource
表示数据库连接池,是JDK中提供的一个接口,没有具体的实现,它的实现由连接池的厂商去实现。我们只需要学习这个工具如何使用即可。
public interface DataSource {
Connection getConnection();
...
}
常用的连接池实现组件有以下这些
连接池的原理?
1.启动连接池,连接池就会初始化一些连接
2.当用户需要使用数据库连接,直接从连接池中取出
3.当用户使用完连接,会将连接重新放回连接池中
连接池的好处?
连接池中会存放一些连接,这些连接可以重复使用,降低数据库的资源消耗
学习C3P0连接池
C3P0地址:https://sourceforge.net/projects/c3p0/?source=navbar
C3P0是一个开源的连接池。Hibernate框架,默认推荐使用C3P0作为连接池实现。
C3P0的jar包:c3p0-0.9.1.2.jar
参数 | 说明 |
---|---|
initialPoolSize | 连接池刚启动时,连接池内包含的连接数量 |
maxPoolSize | 连接池中最多可以放多少个连接 |
checkoutTimeout | 连接池中没有连接时最长等待时间 |
maxIdleTime | 连接池中的空闲连接多久没有使用就会回收。默认是0,0表示不回收 |
我们看到要使用C3P0连接池,需要设置一些参数。那么这些参数怎么设置最为方便呢?使用配置文件方式。
配置文件的要求
配置文件c3p0-config.xml
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day16property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">10property>
<property name="checkoutTimeout">2000property>
<property name="maxIdleTime">1000property>
default-config>
<named-config name="itheimac3p0">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">15property>
<property name="checkoutTimeout">2000property>
<property name="maxIdleTime">1000property>
named-config>
c3p0-config>
com.mchange.v2.c3p0.ComboPooledDataSource
类表示C3P0的连接池对象,常用2种创建连接池的方式:
1.无参构造,使用默认配置
2.有参构造,使用命名配置
ComboPooledDataSource类API
public ComboPooledDataSource()
无参构造使用默认配置(使用xml中default-config标签中对应的参数)
public ComboPooledDataSource(String configName)
有参构造使用命名配置(configName:xml中配置的名称,使用xml中named-config标签中对应的参数)
public Connection getConnection() throws SQLException
从连接池中取出一个连接
c3p0-0.9.5.2.jar
和mchange-commons-java-0.2.12.jar
c3p0-config.xml
配置文件,配置对应参数ComboPooledDataSource
,使用默认配置或命名配置C3P0配置文件名称必须为c3p0-config.xml
C3P0命名配置可以有多个
准备数据
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
score DOUBLE DEFAULT 0.0
);
配置文件
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">10property>
<property name="checkoutTimeout">2000property>
<property name="maxIdleTime">1000property>
default-config>
<named-config name="itheimac3p0">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">15property>
<property name="checkoutTimeout">2000property>
<property name="maxIdleTime">1000property>
named-config>
c3p0-config>
java代码
public class Demo01 {
public static void main(String[] args) throws Exception {
// 方式一: 使用默认配置(default-config)
// new ComboPooledDataSource();
// ComboPooledDataSource ds = new ComboPooledDataSource();
// 方式二: 使用命名配置(named-config:配置名)
// new ComboPooledDataSource("配置名");
ComboPooledDataSource ds = new ComboPooledDataSource("otherc3p0");
// for (int i = 0; i < 10; i++) {
// Connection conn = ds.getConnection();
// System.out.println(conn);
// }
// 从连接池中取出连接
Connection conn = ds.getConnection();
// 执行SQL语句
String sql = "INSERT INTO student VALUES (NULL, ?, ?, ?);";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "张三");
pstmt.setInt(2, 25);
pstmt.setDouble(3, 99.5);
int i = pstmt.executeUpdate();
System.out.println("影响的行数: " + i);
pstmt.close();
conn.close(); // 将连接还回连接池中
}
}
注意:配置文件名称必须为:
c3p0-config.xml
,将配置文件放在src目录下
只需要单独修改配置文件,不用修改代码
多个配置的好处:
CP30使用步骤?
c3p0-0.9.5.2.jar
,mchange-commons-java-0.2.12.jar
C3P0常用参数?
initialPoolSize | 启动连接池时,初始化的连接数量 |
---|---|
maxPoolSize | 连接池最大的连接数量 |
checkoutTimeout | 连接池没有连接时,最大的等待时间,单位是毫秒 |
maxIdleTime | 连接池中的连接空闲多久会被销毁,默认是0,0表示不销毁 |
学习Druid连接池的使用
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控数据库连接池和SQL的执行情况。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid地址:https://github.com/alibaba/druid
DRUID连接池使用的jar包:druid-1.0.9.jar
参数 | 说明 |
---|---|
initialSize | 刚启动连接池时,连接池中包含连接的数量 |
maxActive | 连接池中最多可以放多少个连接 |
maxWait | 获取连接时最大等待时间,单位毫秒 |
API介绍
com.alibaba.druid.pool.DruidDataSourceFactory
类有创建连接池的方法
public static DataSource createDataSource(Properties properties)
创建一个连接池,连接池的参数使用properties中的数据
我们可以看到Druid连接池在创建的时候需要一个Properties对象来设置参数,所以我们使用properties文件来保存对应的参数。
Druid连接池的配置文件名称随便,放到src目录下面方便加载
druid.properties
文件内容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day17
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
导入druid的jar包
在src目录下创建一个properties文件,并设置对应参数
加载properties文件的内容到Properties对象中
创建Druid连接池,使用配置文件中的参数
从Druid连接池中取出连接
执行SQL语句
关闭资源
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day25
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
java代码
public class Demo04 {
public static void main(String[] args) throws Exception {
// 加载配置文件中的配置参数
InputStream is = Demo04.class.getResourceAsStream("/druid.properties");
Properties pp = new Properties();
pp.load(is);
// 创建连接池,使用配置文件中的参数
DataSource ds = DruidDataSourceFactory.createDataSource(pp);
// for (int i = 0; i < 10; i++) {
// Connection conn = ds.getConnection();
// System.out.println(conn);
// }
// 从连接池中取出连接
Connection conn = ds.getConnection();
// 执行SQL语句
String sql = "INSERT INTO student VALUES (NULL, ?, ?, ?);";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "王五");
pstmt.setInt(2, 35);
pstmt.setDouble(3, 88.5);
int i = pstmt.executeUpdate();
System.out.println("影响的行数: " + i);
// 执行查询
sql = "SELECT * FROM student;";
ResultSet rs = pstmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
double score = rs.getDouble("score");
System.out.println("id: " + id + " ,name: " + name + " ,age = " + age + " ,score = " + score);
}
pstmt.close();
conn.close(); // 将连接还回连接池中
}
}
Druid使用步骤?
Druid常用的配置参数
参数 | 说明 |
---|---|
initialSize | 刚启动连接池时,初始化连接的数量 |
maxActive | 连接池中最大的连接数量 |
maxWait | 没有连接时,最大的等待时间 |
Druid连接池基本使用不管是C3P0连接池,配置大致都可以分为2种:1.连接数据库的参数
,2.连接池的参数
,这2种配置大致参数作用都相同,只是参数名称可能不一样。
我们每次操作数据库都需要创建连接池,获取连接,关闭资源,都是重复的代码。我们可以将创建连接池和获取连接池的代码放到一个工具类中,简化代码。
编写一个连接池的工具类,简化Druid连接池的使用
DataSourceUtils.java
public class DataSourceUtils {
// 1.声明静态数据源成员变量
private static DataSource ds;
// 2.创建连接池对象
static {
// 加载配置文件中的数据
InputStream is = DataSourceUtils.class.getResourceAsStream("/druid.properties");
Properties pp = new Properties();
try {
pp.load(is);
// 创建连接池,使用配置文件中的参数
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 3. 定义得到数据源的方法
public static DataSource getDataSource() {
return ds;
}
// 4. 定义得到连接对象的方法
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
// 5.定义关闭资源的方法
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
// 6.重载关闭方法
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
}
测试类代码
public class Demo03 {
public static void main(String[] args) throws Exception {
// 拿到连接
Connection conn = DataSourceUtils.getConnection();
// 执行sql语句
String sql = "INSERT INTO student VALUES (NULL, ?, ?, ?);";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "李四");
pstmt.setInt(2, 30);
pstmt.setDouble(3, 50);
int i = pstmt.executeUpdate();
System.out.println("影响的函数: " + i);
// 关闭资源
DataSourceUtils.close(conn, pstmt);
}
}
使用连接池工具类后可以简化代码,我们重点是写SQL去执行。
编写连接池工具类步骤
三层架构
表示层:和用户交互的界面
业务层(Service):处理业务逻辑
数据访问层(DAO/ Data Access Object):操作数据库的
三层架构好处:
使用三层架构完成用户登录案例
我们在企业开发中为了提高开发效率会使用框架进行开发ssm。什么是框架呢?
学习框架的概念
框架解决了哪些问题
之前我们都是根据需求写出所有的相关代码麻烦,累,繁琐。框架是对常见功能的封装,一个半成品。我们在框架的基础上开发出成品的软件。
假如你要造一辆马车,在没有零件的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后做成轮子,门,等部件,然后组装起来,很麻烦。
框架就相当于现成的轮子,门等部件。我们只需要拿过来使用即可。
框架是别人写好的代码,是对常见功能的封装,是一个半成品。
常见框架如:Spring,SpringMVC,Mybatis,JdbcTemplate,Bootstrap等等。
企业项目中使用框架,程序员不再需要重复造轮子,只需要专注实现业务需求,提升了开发效率。
一个成熟的框架,经过了在众多企业项目中的验证使用,稳定性有保障。
在J2EE应用中,通常把项目整体进行分层设计。有表现层、业务层、持久层。
MyBatis是一款优秀的持久层框架,MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。
关于持久层的框架,还有一个封装程度更高的框架(hibernate)。该框架相对比较重量级,以及其它各个方面的原因,目前流行程度下降了很多,企业项目中用的越来越少了。
SpringMVC是一种基于Java,实现了Web MVC设计模式,将Web层进行解耦。SpringMVC可以简化我们日常Web开发。
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。让开发变的更简单。
什么是框架,它解决了哪些问题?
mybatis是企业中非常流行的框架,是ssm中的m
mybatis框架介绍
学习mybatis下载
mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目改名为mybatis。是一个持久层框架
http://www.mybatis.org/mybatis-3/
连接到github地址:https://github.com/mybatis/mybatis-3/releases
了解mybatis的开发步骤
mybatis开发环境的搭建
利用mybatis框架,从MySQL中查询所有的用户
[外链图片转存失败(img-DzESUALv-1564982999456)(1557583413350.png)]
CREATE TABLE USER (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
birthday DATE,
sex CHAR(1) DEFAULT '男',
address VARCHAR(50)
);
INSERT INTO USER VALUES (NULL, '孙悟空','1980-10-24','男','花果山水帘洞');
INSERT INTO USER VALUES (NULL, '白骨精','1992-11-12','女','白虎岭白骨洞');
INSERT INTO USER VALUES (NULL, '猪八戒','1983-05-20','男','福临山云栈洞');
INSERT INTO USER VALUES (NULL, '蜘蛛精','1995-03-22','女','盤丝洞');
SELECT * FROM USER;
创建模块:mybatis01_01_helloworld
加入mybatis相关jar包:在模块下新建lib文件夹,复制mybatis框架jar包到lib文件夹下
mybatis 框架包
mysql 数据库驱动包
log4j 日志包
编写用户实体类(User)
/**
用户实体类对象 */
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// 省略构造方法/getter/setter/toString
}
复制log4j.properties到 src 下
### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
mybatis的环境搭建做了哪几件事情?
mybatis为了灵活,将数据库相关数据和SQL语句写到XML配置文件中。
复制source\资料\01_mybatis约束\sqlMapConfig.xml到src下,说明:它是mybatis框架的核心配置文件,mybatis就是靠这些信息来运行的。
<configuration>
<environments default="default">
<environment id="default">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
<mappers>
mappers>
configuration>
创建com.itheima.dao包,创建UserMapper接口。编写查询所有用户的方法:List
/**
定义DAO中方法
*/
public interface UserMapper {
/**
查询所有的用户
*/
List<User> findAllUsers();
}
在com.itheima.dao包中创建UserMapper.xml映射文件
<mapper namespace="com.itheima.dao.UserMapper">
<select id="findAllUsers" resultType="com.itheima.entity.User">
select * from user;
select>
mapper>
在src/sqlMapConfig.xml添加UserMapper.xml的映射
<mappers>
<mapper resource="com/itheima/dao/UserMapper.xml"/>
mappers>
编写mybatis访问数据库的Java代码
package com.itheima.test;
import com.itheima.dao.UserMapper;
import com.itheima.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestUserMapper {
public static void main(String[] args) throws IOException {
//1. 得到核心配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//2. 创建会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 创建会话工厂
SqlSessionFactory factory = builder.build(inputStream);
//4. 通过会话工厂得到会话对象
SqlSession session = factory.openSession();
//5. 由会话对象得到DAO接口的对象,由mybatis生成接口的代理对象。
UserMapper userMapper = session.getMapper(UserMapper.class);
//6. 实现CRUD
List<User> userList = userMapper.findAllUsers();
for (User user : userList) {
System.out.println(user);
}
//7. 释放资源
session.close();
}
}
注:UserMapper的对象是由mybatis生成的接口代理对象
能够使⽤用C3P0连接池
c3p0-0.9.5.2.jar
和mchange-commons-java-0.2.12.jar
c3p0-config.xml
配置文件,配置对应参数ComboPooledDataSource
,使用默认配置或命名配置能够使⽤用DRUID连接池
能够编写连接池工具类
/*
Durid连接池工具类
*/
public class DataSourceUtils {
// 1.声明静态连接池成员变量
private static DataSource ds;
// 2.创建连接池对象
static {
Properties pp = new Properties();
try {
pp.load(DataSourceUtils.class.getResourceAsStream("/druid.properties"));
// 创建Druid连接池
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 3.返回连接池中的连接
public static Connection getConnection() throws SQLException {
Connection conn = ds.getConnection();
return conn;
}
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
// 关闭资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
能够了解什么是框架
别人写好的代码,对常见功能的封装,是一个半成品
掌握mybatis框架开发快速入门
理解自定义mybatis框架
核心1: sqlSession.getMapper(UserMapper.class); 返回接口的代理对象,实现类
核心2:调用 List
得到方法所在的接口名和方法名 -》 com.itheima.dao.UserMapper.findAllUsers
会去接口映射文件中
// 2.创建连接池对象
static {
Properties pp = new Properties();
try {
pp.load(DataSourceUtils.class.getResourceAsStream("/druid.properties"));
// 创建Druid连接池
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 3.返回连接池中的连接
public static Connection getConnection() throws SQLException {
Connection conn = ds.getConnection();
return conn;
}
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
// 关闭资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
能够了解什么是框架
别人写好的代码,对常见功能的封装,是一个半成品