Mybatis学习笔记(0)---- JDBC
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
在介绍Mybatis之前需要先了解一下JDBC,才能更清楚Mybatis究竟帮我们做了什么。
JDBC
JDBC(Java Database Connectivity,Java数据库连接)是java中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC的层次结构
(jdbc是sun公司提供一套用于数据库操作的接口,java程序员只需面向这套接口编程即可。不同数据库厂商,需要针对这套接口,提供不同的实现。不同的实现的集合即为不同数据库的驱动)
jdbc接口(API)包括两个层次:
面向应用的API:java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)
面向数据库的API:java Driver API,供开发商开发数据库驱动使用。
JDBC程序编写步骤
获取数据库连接
要素一:Driver接口实现类
Driver接口介绍
java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接去访问实现了Driver接口的类,而是由驱动程序管理类(java.sql.Driveranager)去调用这些Driver实现。
加载和注册JDBC驱动
加载驱动:加载JDBC驱动需调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名。Class.forName("com.mysql.jdbc.Driver")
注册驱动:DriverManager类是驱动程序管理类,负责管理驱动程序。使用DriverManager.registerDriver类的registerDriver()方法来注册驱动了的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例。
要素二:URL
JDBC URL用于标志一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分用冒号分割(jdbc:子协议:子名称)【jdbc:mysql://localhost:3306/test】
public Connection getConnection(){ //第一种 Driver driver = com.mysql.jdbc.Driver(); //第二种 //Class clazz = Class.forName("com.mysql.jdbc.Driver"); //Driver driver = (Driver)clazz.newInstance(); String url = "jdbc:mysql://localhost:3306/test"; Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "123456"); Connection connection = driver.connect(url, info); return connextion; //第三种 //DriverManager.registerDriver(driver);//driver为第二种中的driver //上面注册可以不要,在Mysql的Driver实现类中,有一块静态代码块,已经实现了注册 //return DriverManager.getConection(url, user, password);//获取到连接 }
//第四种,将基本信息放在配置文件中 public Connection getConnection(){ //1.读取配置文件中的4个基本信息 InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");//ClassLoader.getSystemClassLoader() Properties pros = new Properties(); pro.load(is); String user = pros.getProperty("user"); String password = pros.getProperty("password"); String url = pros.getProperty("url"); String driverClass = pros.getProperty("driverClass"); //2.加载驱动 Class.forName(driverClass); //3.获取连接 return DriverManager.getConnection(url, user, password); } jdbc.properties user=root password=1234567 url=jdbc:mysql://localhost:3306/test driverClass=com.mysql.jdbc.Driver
使用PreparedStatement实现CRUD操作
操作和访问数据库
数据库连接被用于向数据库服务器发送命令和上去了语句,并接受数据库服务器返回的结果,其实一个数据库连接相当于一个socket连接。
在java.sql包中有3个接口分别定义了对数据库的调用的不同方式:
Statement:用于执行静态SQL语句并返回它所生成结果的对象。(弊端:需要拼写Sql语句,可能存在Sql注入问题。)
PreparedStatement:SQL语句被预编译并存储在此对象中,可以使用此对象多次高效的执行该语句。
CallableStatement:用于执行SQL存储过程。
public void testPreparedStatement(){ //获取连接 Connection conn = getConnnection(); //预编译sql语句,返回PreparedStatement实例 String sql = "insert into student(name,email) values (?,?)"; PreparedStatement ps = conn.preparedStatement(sql) ; //填充占位符 ps.setString(1, "哪吒"); ps.setString(2, "nezha@gmail.com"); //执行操作 ps.execute(); conn.close(); ps.close(); }
public void testQuery() { Connection conn = getConnection(); String sql = "select * from student where id = ?"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet resultSet = ps.executeQuery(); if(resultSet.next()){//判断结果集中是否有数据,并指针下一 int id = resultSet.getInt(1); String name = resultSet(2) ; } }