前瞻
1.JDBC原生开发步骤
导包:将需要的jar包复制到项目名下的新建的lib文件夹中,
jdbc的原生开发步骤
1、注册驱动
2、获得连接
3、获得执行者对象
4、获得结果集
5、结果集处理
6、释放资源
public class Test {
public static void main(String[] args) throws Exception {
//1.注册驱动,反射方式加载
Class.forName("com.mysql.jdbc.Driver");
//设置url,用户名,密码
String url = "jdbc:mysql://127.0.0.1:3306/day08";//person是数据库名
String username = "root";
String password = "root";
//2.获得连接对象
Connection con = DriverManager.getConnection(url, username, password);
//System.out.println(con);
//3.获得执行者对象
String sql = "select * from phones";
PreparedStatement ps = con.prepareStatement(sql);
//4.获得结果集
ResultSet rs = ps.executeQuery();
//5.结果集处理,
while(rs.next()){
System.out.println(rs.getString("id")+" "+rs.getString("pinpai")+" "+
rs.getString("xinghao")+" "+rs.getString("jiage"));
}
//6.释放资源
rs.close();
ps.close();
con.close();
}
}
2.Jdbc问题总结
1、数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率
设想:使用数据库连接池
2、sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,要重新编译,系统不易维护。
设想:将sql语句 统一配置在文件中,修改sql不需要修改java代码。
3、通过preparedStatement向占位符设置参数,存在硬编码( 参数位置,参数)问题。系统不易维护。
设想:将sql中的占位符及对应的参数类型配置在配置文件中,能够自动输入 映射。
4、遍历查询结果集存在硬编码(列名)。
设想:自动进行sql查询结果向java对象的映射(输出映射)。
3.mybaits介绍
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
4.范围和生命周期
SqlSessionFactoryBuilder
此类可被实例化,使用和丢弃。一旦创建了 SqlSessionFactory后,这个类就不需要存在了。因此 SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用 SqlSessionFactoryBuilder来创建多个 SqlSessionFactory实例,但是最好的方式是不需要保持它一直存在来保证所有 XML解析资源,因为还有更重要的事情要做。
SqlSessionFactory
此类一旦被创建,SqlSessionFactory实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用 SqlSessionFactory的最佳实践是在应用程序运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此 SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如 Google Guice或 Spring。这样的框架允许你创建支持程序来管理单例 SqlSessionFactory的生命周期。
SqlSession
每个线程都应该有它自己的 SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将 SqlSession实例的引用放在任何类型的管理范围中,比如 Serlvet架构中的 HttpSession。如果你现在正用任意的 Web框架,要考虑SqlSession放在一个和 HTTP请求对象相似的范围内。换句话说,基于收到的 HTTP请求,你可以打开了一个 SqlSession,然后返回响应,就可以关闭它了。关闭 Session很重要,你应该确保使用 finally块来关闭它。
下面的示例就是一个确保 SqlSession关闭的基本模式:
正文
1.编写实例
mybatis开发过程小结
1、编写SqlMapConfig.xml
2、编写mapper.xml
定义了statement
3、编程通过配置文件创建SqlSessionFactory
4、通过SqlSessionFactory获取SqlSession
5、通过SqlSession操作数据库
如果执行添加、更新、删除需要调用SqlSession.commit()
6、SqlSesion使用完成要关闭
1.1SqlMapConfig.xml(公用文件,名称不固定)
通过SqlMapConfig.xml加载mybatis运行环境。
1.2根据id查询用户-pojo(User.java)
1.3User.xml(重点)
建议命名规则:表名+mapper.xml
早期ibatis命名规则:表名.xml
1.4创建SqlSessionFactory:
2.改进:根据用户名称模糊查询用户信息
根据用户名称模糊查询用户信息可能返回多条记录。
2.1 User.xml
2.2编码
2.3使用${}接收参数
3.比较
3.1 Mybatis解决jdbc编程的问题
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
- Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
- 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
- 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
3.2 mybatis与hibernate重要区别
企业开发进行技术选型 ,考虑mybatis与hibernate适用场景。
mybatis:入门简单,程序容易上手开发,节省开发成本 。mybatis需要程序员自己编写sql语句,是一个不完全 的ORM框架,对sql修改和优化非常容易实现 。
mybatis适合开发需求变更频繁的系统,比如:互联网项目。
hibernate:入门门槛高,如果用hibernate写出高性能的程序不容易实现。hibernate不用写sql语句,是一个 ORM框架。
hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统。
总之,企业在技术选型时根据项目实际情况,以降低成本和提高系统 可维护性为出发点进行技术选型。