文章目录
- 1. JDBC
- 1.1 操作流程
- 1.2 DAO
- 2. MyBatis
- 2.1 环境搭建
- 2.2 文件配置
- 2.2.1 xxxDao.xml(sql语句配置文件/mapper文件)
- 2.2.2 核心配置文件
- 2.2.3 测试
- 2.2.4 sql插入语句流程示例
- 3. JDK动态代理
- 3.1 什么是代理
1. JDBC
1.1 操作流程
- 注册数据库
- 获取连接
- 获取数据库操作对象
- 执行语句
- 处理结果集
- 释放资源
1.2 DAO
DAO(Date Access Object)是用于对数据库进行操作的对象
具体流程
- 实现一个基础的统一
BaseDAO
的类,在类中定义增删改查的方法,update/delete/select等; - 针对各个数据库表的不同针对性的定义
CustomerDAO
接口,在接口中定义一系列针对该数据库表的操作接口方法; - 实现一个
CustomerDAO
接口的类CustomerDAOImpl
,该类继承自BaseDAO
,具体的类实现为:
class CustomerDAOImpl extends BaseDAO implements CustomerDAO{
// 对CustomerDAO接口的实现
@Override
....
}
- 在对数据库进行操作时,实例化
CustomerDAOImpl
,使用其中覆写的方法完成业务逻辑。
2. MyBatis
2.1 环境搭建
- 创建数据库表
- maven项目配置pom.xml文件,加入MyBatis/MySQL等依赖
- 创建实体类
entity
,定义实体类属性,属性名和数据库表列名一致- 创建DAO接口,定义操作数据库的方法
- 创建
mapper.xml
文件,将数据库操作的sql语句写入文件中,建议sql语句与java代码分开- 创建MyBatis的主配置文件(xml),通常放置于
resources
目录下,定义创建连接实例的数据源对象并指定其他mapper文件的位置- 测试代码
2.2 文件配置
2.2.1 xxxDao.xml(sql语句配置文件/mapper文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!--通用部分,"http://mybatis.org/dtd/mybatis-3-mapper.dtd"是约束文件,
包含了文件的限定标签和属性,以及标签出现顺序-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace通常是Dao接口的全限定类名-->
<mapper namespace="org.mybatis.example.BlogMapper">
<!--
id:要执行的sql语句的唯一标识,是一个自定义字符串,
推荐使用dao接口中的方法名称
-->
<!--
resultType:告诉MyBatis执行sql语句完成后,把数据赋值给哪个类型的对象
通常使用Java对象的全限定名称
-->
<!--
#{id}是一个占位符,可以在执行sqlSession查询的时候进行替换,用于输入
-->
<select id="selectBlog" resultType="com.xxx.xxx.Blog">
select * from Blog where id = #{id}
</select>
</mapper>
2.2.2 核心配置文件
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 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"/>
<!--配置数据源,创建Connection对象-->
<dataSource type="POOLED">
<!--驱动内容-->
<property name="driver" value="${driver}"/>
<!--数据库连接信息-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置,找到其中定义的sql语句-->
<mappers>
<!--
使用mapper的resource属性来指定mapper文件的路径
这个路径是从类路径的根目录开始的,也即target/classes
一个mapper resource指定一个mapper文件
-->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
2.2.3 测试
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
// 1. 定义MyBatis主配置文件的位置
String resource = "org/mybatis/example/mybatis-config.xml";
// 2. 读取主配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3. 创建SqlSessionFactory对象,使用SqlSessionFactoryBuilder类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 4. 获取SqlSession对象
SqlSession session = sqlSessionFactory.openSession()
// 5. 指定要执行的sql语句标识(id)
// sql的标识=namespace + "." + 标签的id属性值
String sqlId = "org.mybatis.example.BlogMapper" + "." + "selectBlog";
// 6. 通过SqlSession的方法来执行SQL语句
Blog blog = (Blog)session.selectOne(sqlId);
// 7. 关闭SqlSession对象
session.close();
// 上面的6和7两步可以写在一个try块中
/*try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}*/
注意:如果在运行时出现找不到xxxDao.xml文件的错误,可能是因为对应的mapper文件没有拷贝到相应的target/classes目录下的对应路径中,这个时候需要在pom.xml文件中配置资源插件,来对src/main/java目录中的xml文件经行处理
2.2.4 sql插入语句流程示例
- 编写
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="org.mybatis.example.StudentDao">
<insert id="insertStudent">
insert into student values(#{id}, #{name}, #{age})
</insert>
</mapper>
- 在逻辑代码中编写插入语句
// sql语句
String sqlId = "org.mybatis.example.StudentDao" + "." + "insertStudent";
// 插入的实体类
Student student = new Student();
student.setId(1);
student.setName(Tom);
student.setAge(23);
// mybatis会自动解析student类中的数据并去赋值,根据的是getXXX()方法来获取对应属性
int res = session.insert(sqlId, student);
// 提交事务
session.commit();
3. JDK动态代理
3.1 什么是代理
代理也即中介,例如现实生活中的代理商、代理服务器以及一些留学中介机构都是代理的体现
代理也有一些特点:
- 代理和被代理的主体的目标是一致的,比如代理商和厂家都是为了卖东西;
- 通常,代理商被称作代理,厂家被称作目标;
- 代理需要收取一定的报酬