原始jdbc操作的分析
原始jdbc开发存在的问题如下:
①数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
②sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
③查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置
应对上述问题给出的解决方案:
①使用数据库连接池初始化连接资源
②将sql语句抽取到xml配置文件中
③使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
可以看出原生的jdbc使用起来并不友好,为了更好的使用jdbc,需要将jdbc封装起来。屏蔽jdbc api底层的访问细节,来简化我们的开发
什么是ORM思想?
简介:对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
其实,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中
用mybatis来举例:
ORM让实体类看起来就像一个虚拟的数据库表,通过操作这个虚拟的表来影响数据库中的表,让我们不再关心复杂的sql语句,只需要操作对象即可。
ORM相关框架
Hibernate:我们把它称之为全自动的 ORM 框架,程序员在使用 Hibernate 时几乎不用编写 sql 语句,而是通过操作对象即可完成对数据库的增删改查。
Mybatis: 我们把它称之为半自动的 ORM 框架,因为在使用mybatis时需要自己编写sql语句,但是API的使用还是很方便的。跟Hibernate 相比,MyBatis 更加轻量,更加灵活。
这两种框架都是一些比较老的框架了,各自都有强化的版本了。以后再去补充!
Mybatis案例:
编写USer实体类
package pojo;
/**
* @author Lenovo
* @version 1.0
* Create by 2022/9/22 10:21
*/
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
//省略get个set方法
}
创建数据库表
Mybatis核心配置文件
<?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>
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--自定义别名-->
<typeAliases>
<typeAlias type="pojo.User" alias="user"></typeAlias>
</typeAliases>
<!--数据源环境-->
<environments default="developement"><!--指定默认的环境名称-->
<environment id="developement"><!--指定当前环境的名称-->
<transactionManager type="JDBC"></transactionManager><!--指定当前事务管理类型是jdbc-->
<dataSource type="POOLED"><!--指定当前数据源类型是连接池-->
<!--数据源配置的基本参数-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
Mapper映射文件
<?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="Dao">
<resultMap id="BaseResultMap" type="User">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</resultMap>
<!--查询操作-->
<select id="findAll" resultType="user">
select * from user
</select>
<insert id="add" parameterType="user">
insert into user values(#{id},#{username},#{password})
</insert>
</mapper>
编写测试代码
public static void ceshi01() throws IOException {
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> userList = sqlSession.selectList("Dao.findAll");
//打印结果
for (User user : userList) {
System.out.println(user.toString());
}
//释放资源
sqlSession.close();
}
输出结果: