最近在学习持久层,我从jdbc到mybatis到mybatisplus自己上网找了几个demo来模仿学习理解。
文章目录
JDBC(Java DataBase Connectivity)
简介:
JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。是java程序访问关系数据库最原生的接口。
主要作用:
-
连接数据源,如:数据库。
-
为数据库传递查询和更新指令。
-
处理数据库响应并返回的结果。
使用一般步骤(以插入为例):
- 加载JDBC驱动到jvm(java虚拟机)
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///ssm";//所连数据库的URL
String username = "root";//连接对应数据库时使用的账号
String password = "123456";//对应账号的密码
- 建立链接
Connection conn = DriverManager.getConnection(url,username,password);
- 编写对应需求的SQL语句,例如插入一个account到ssm库的account表
String sql = "insert into ssm.account(id,name,money) values(?,?,?)";
- 使用PreparedStatement声明语句预编译,提高效率同时防止sql注入。执行语句
PreparedStatement ps = conn.prepareStatement(sql);
account account = new account();
account.setId(99);account.setMoney(20.01);account.setName("Breeze");
ps.setInt(1,account.getId());
ps.setString(2,account.getName());
ps.setDouble(3,account.getMoney());
ps.executeUpdate();
- 关闭preparedstatement和connection
ps.close();
conn.close();
它有最显而易见的优点:
1.直接访问数据库底层类。执行效率高
2.步骤比较简单,容易理解。
但这种传统的桥接模式也逐渐显现一些缺点:
1.SQL语句硬编码在java代码文件中,由于实际应用sql语句经常发生变化。那么变动后就需要啊重新编译部署。
(硬编码:硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。 硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改)
2.频繁地创建数据库连接和释放,造成数据库资源浪费,要对异常进行捕捉处理,处理转换数据类型。最后还要正确关闭连接。较为繁琐,效率下降。
3.对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
(例如下面的库名表名字段名就硬编码在了java文件里,每次使用要创建关闭全部完成)
String sql = "insert into ssm.account(id,name,money) values(?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,account.getId());
ps.setString(2,account.getName());
ps.setDouble(3,account.getMoney());
ps.executeUpdate();
ps.close();
conn.close();
4.有时进行CRUD操作时需要进行一些判断限定时,拼接sql语句的过程令人十分痛苦。
举个简单的例子:查询操作, select xx from xxx where xxx and/or xxx xxx,访问数据库的时候经常需要加入许多限定,要进行不同条件的判断。如果根据条件去判断就要控制拼接sql语句,过程繁琐,代码难看难读。选择直接分开写的话,又会带来代码冗余的问题。
为了消除jdbc这些问题,mybatis框架他来了。他将sql语句写在xml文件中,支持动态sql,就明显很好地解耦合,解决了硬编码和sql语句拼接的问题。
Mybatis
简介:
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用一般步骤:
- 数据库建表
- 导入依赖mybatis、mysql-connector-java、…
- 编写核心配置文件:mybatis-config.xml(放于resource目录下)
<?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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>
- 编写mybatis工具类,sqlsessionfactory(实现了传统的connection相关功能)
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
- 创建实体类
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码
//构造,有参,无参
//set/get
//toString()
}
- 编写Mapper接口类
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectUser();
}
- 编写Mapper.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.kuang.dao.UserMapper">
<select id="selectUser" resultType="com.kuang.pojo.User">
select * from user
</select>
</mapper>
- 使用(编写测试类)
public class MyTest {
@Test
public void<