JDBC连接及操作数据库:
第一步:注册驱动
第二步:获取连接
第三步:获取statement对象
第四步:执行SQL语句返回结果集
第五步:遍历结果集
第六步:关闭连接释放资源
传统方式连接数据库
public class JDBCDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//1.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2.获取连接
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/ssm”, “root”, “root”);
//3.获取Statement对象
PreparedStatement preparedStatement = connection.prepareStatement(“select * from tb_user”);
//4.执行SQL语句返回结果集
ResultSet resultSet = preparedStatement.executeQuery();
//5.遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getString(“username”));
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
用这种方式连接数据库存在一个重要的问题: 注册驱动时,当前类和MySQL的驱动类有很强的依赖关系。 当我们没有驱动类的时候,连编译都不能通过。 这种调用者与被调用者之间的依赖关系,就叫做程序的耦合,耦合分为高耦合(紧密联系)和低耦合(松散联系) 我们在开发中,理想的状态应该是编译时不依赖,运行时才依赖。 要做到编译时不依赖,就需要使用反射来创建类对象。
即将注册驱动部分的代码稍作修改如下: 编译时不依赖的数据库连接
public class JDBCDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//1.注册驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName(“com.mysql.jdbc.Driver”);
//2.获取连接
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/ssm”, “root”, “root”);
//3.获取Statement对象
PreparedStatement preparedStatement = connection.prepareStatement(“select * from tb_user”);
//4.执行SQL语句返回结果集
ResultSet resultSet = preparedStatement.executeQuery();
//5.遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getString(“username”));
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
这样做的好处是,我们的类中不再依赖具体的驱动类,此时就算删除mysql的驱动jar包依然可以通过编译,只不过因为没有驱动类所以不能运行罢了。 不过,此处还有一个问题,就是我们反射类对象的全限定类名称是在java类中写死的,数据库的端口号、用户名密码也是写死的,一旦要修改就等于是要修改源码。 自己小打小闹写的代码改源码什么的还好说,但如果是上线项目,改源码势必要停服务器重新编运行。 这么看来这个问题造成的后果很严重,其实它的解决方法也很简单,使用配置文件配置数据库连接信息就可以啦。 使用配置文件连接数据库 配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=root
代码实现
public class JDBCDemoPro {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//读取配置文件db.properties
Properties prop = new Properties();
prop.load(new FileInputStream(“db.properties”));
//获取配置文件中的相关参数值
String driver = prop.getProperty("jdbc.driver");
String url = prop.getProperty("jdbc.url");
String user = prop.getProperty("jdbc.username");
String password = prop.getProperty("jdbc.password");
//1.注册驱动
Class.forName(driver);
//2.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.获取Statement对象
PreparedStatement preparedStatement = connection.prepareStatement("select * from tb_user");
//4.执行SQL语句返回结果集
ResultSet resultSet = preparedStatement.executeQuery();
//5.遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
引入MyBatis依赖:
maven仓库查询网址:MavenRepository
mybatis:MyBatis基础包 logback-classic:日志依赖
刷新maven等待自动下载
libraries中有了所有导入的包表示依赖引入完成 编程式配置方法
MyBatis官方文档中并未详细的介绍如何编程式使用MyBatis,因为编程式配置方法代码有点复杂 但是大家没必要被代码吓退,因为在实际的开发中几乎没有机会去写这段代码,一般都是通过配置文件来拿到配置然后开启会话的 我们之所以讲解编程式配置方法,是因为使用配置文件配置时屏蔽了太多的细节 为了层层递进的介绍MyBatis的基础用法,使大家熟悉MyBatis整体结构,我们需要讲解编程式配置方法 代码实现 删除JDBC连接及操作数据库:JDBCDemo.java 新建编程式配置文件:StartNoXml.java
@SuppressWarnings({“SqlResolve”, “SqlNoDataSourceInspection”, “Duplicates”})
public class StartNoXml {
public static void main(String[] args) throws SQLException {
// 准备jdbc事务类
JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
// 配置数据源
PooledDataSource dataSource = new PooledDataSource(
“com.mysql.cj.jdbc.Driver”,
“jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false”,
“root”,
“root”);
// 配置环境,向环境中指定环境id、事务和数据源
Environment environment = new Environment.Builder(“development”)
.transactionFactory(jdbcTransactionFactory)
.dataSource(dataSource).build();
// 新建 MyBatis 配置类
Configuration configuration = new Configuration(environment);
// 得到 SqlSessionFactory 核心类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 开始一个 sql 会话
SqlSession session = sqlSessionFactory.openSession();
// 得到 sql 连接并运行 sql 语句
PreparedStatement preStatement = session
.getConnection()
.prepareStatement(“SELECT * FROM user WHERE id = ?”);
preStatement.setInt(1, 1);
ResultSet result = preStatement.executeQuery();
// 验证结果
while (result.next()) {
System.out.println("username: " + result.getString(“username”));
System.out.println("age: " + result.getString(“age”));
}
// 关闭会话
session.close();
}
}
执行结果
控制台打印结果如下图所示,表示我们已经成功连接数据库并查出了需要的值 步骤总结 1、得到 MyBatis 配置信息,即代码中的Configuration类 JdbcTransactionFactory 表示事务工厂,当 MyBatis 需要新建事务的时候,会通过它来新建 PooledDataSource 表示数据源,通过其构造参数,我们传入了数据库 url,数据库用户和密码等配置 Configuration 负责 MyBatis 架构中的配置部分,可以有多个 Environment 每个 Environment 都必须有唯一的 id,即代码中的 development 2、通过 Configuration 来创建 SqlSessionFactory MyBatis 是通过会话的方式来执行 SQL 的,因为我们必须拥有一个会话创建器,即会话工厂 3、新建 SqlSession 来执行 SQL 有了 SqlSessionFactory 后,我们就可以方便地新建会话,并通过会话来执行 SQL 了 而PreparedStatement及以下的内容,其实并不属于 MyBatis,它们是 JDBC 提供的,在实际的 MyBatis 开发中,你也不会这样去执行 SQL,在这里我们只是为了测试是否配置成功,并且展示 MyBatis 和 JDBC 的关系。 缺点分析 可以看到,编程式使用 MyBatis 其实是比较复杂,需要开发人员十分熟悉 MyBatis 的 API,所以绝大多数资料都推荐配置的方式使用 MyBatis
配置文件配置MyBatis:
代码实现 在resources文件夹下新建配置文件:mybatis-config.xml
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
有了上面编程式 API 的使用经验,那么你一定可以轻松的看懂配置项:
configuration 标签对应 Configuration 类 environment 标签对应 Environment 类 transactionManager 标签对应 JdbcTransactionFactory 类 dataSource 标签对应 PooledDataSource 类 启动类:StartWithXml.java
1、修改类名为StartWithXml 2、读取配置文件
InputStream configuration = Resources.getResourceAsStream(“mybatis-config.xml”);
执行结果
控制台打印结果如下图所示,表示我们已经成功连接数据库并查出了需要的值 步骤总结
1、读取配置文件,即 mybatis-config.xml
2、通过配置文件来创建 SqlSessionFactory
3、新建 SqlSession 来执行 SQL