发表于: 2019-12-30 23:59:17
1 1138
17.编写DAO,分别JdbcTemplate和Mybatis连接数据库,注意使用JDBCTemplate的时候分离Interface和Imple,使用Mybatis的时候注意理解为什么不需要Impl,注意遵守命名规范。
介绍一下概念:
DAO:数据访问对象(Data Access Object)是数据在瞬时状态和持久状态下转换的机制。
为什么需要 DAO ?数据库种类太多,业务流程也在变化。迁移或者升级一次一次数据库就重写整个数据库的读写部分太困难了。JdbcTemplate 和 Mybatis 都是 DAO 的一种实现。
JDBC:一套 java 访问数据库的 API,java 规范提供了一套接口,具体的实现交给各数据库厂家去完成,我们用的时候就去下载并引入对应厂家提供的 jar 包,称之为驱动。在这里,我们首先尝试用直接使用 JDBC 来连接 MySQL 数据库。JDBC 不仅跨数据库(前提是使用标准SQL语句),还能跨平台。
*听师兄的,换 idea了
首先使用 JDBC 连接数据库并查询,还是在昨天日报的 hello word 上进行修改,在 maven 的 pom.xml 中添加了mysql驱动(这段其实是《疯狂java讲义》上的示例代码)
JDBC 直接连接的部分就这样,我把代码贴在下面(但是我不是完全理解了这段代码,比如这个反射我就不懂,为啥maven导入的驱动不用 import 呢,我是不是应该去补补语法基础了?)
package
cn.mogeek.testCase;
import
java.sql.*;
public
class
App
{
public
static
void
main( String[] args )
throws
Exception
{
// 1.加载驱动,使用反射的知识,现在记住这么写。
Class.forName(
"com.mysql.jdbc.Driver"
);
try
(
// 2.使用DriverManager获取数据库连接,
// 其中返回的Connection就代表了Java程序和数据库的连接
// 不同数据库的URL写法需要查驱动文档知道,用户名、密码由DBA分配
Connection conn = DriverManager.getConnection(
,
"root"
,
"mogeek666"
);
// 3.使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();
// 4.执行SQL语句
/*
Statement有三种执行sql语句的方法:
1 execute 可执行任何SQL语句。- 返回一个boolean值,
如果执行后第一个结果是ResultSet,则返回true,否则返回false
2 executeQuery 执行Select语句 - 返回查询到的结果集
3 executeUpdate 用于执行DML语句。- 返回一个整数,
代表被SQL语句影响的记录条数
*/
ResultSet rs = stmt.executeQuery(
"select s.* , teacher_name"
+
" from student_table s , teacher_table t"
+
" where t.teacher_id = s.java_teacher"
))
{
// ResultSet有系列的getXxx(列索引 | 列名),用于获取记录指针
// 指向行、特定列的值,不断地使用next()将记录指针下移一行,
// 如果移动之后记录指针依然指向有效行,则next()方法返回true。
while
(rs.next())
{
System.out.println(rs.getInt(
1
) +
"\t"
+ rs.getString(
2
) +
"\t"
+ rs.getString(
3
) +
"\t"
+ rs.getString(
4
));
}
}
}
}
一通搜索发现上面这种写法不符合规范,应该要把 connection statement 抽象出来放在一个独立的class里面,数据库用户名米亚也不能够硬编码,二十要放在 properties 里面,然后我连接完也没释放资源。
另外添加 JDBCUnit 类,实现了 connection,配置转入 properties 内,并且用 junit 测试通过。
遇到的问题:
但是我一开始生成 properties 有点问题,后来把配置转入 properties 后编译报错如下:
我感觉是 properties 生成的位置有问题,后添加 resources 文件夹,并且转移 properties 后编译测试通过。
评论