JDBC--访问数据库

1.JDBC是什么?

   JDBC(java database connectivity)Java数据库连接,是Java语言中用来规范客户端程序如何来     访问数据库【关系型数据库】的应用程序接口,提供了诸如查询和更新数据库中数据的方法

我们通常说的JDBC是面向关系型数据库的

JDBC--访问数据库_第1张图片

 2.JDBC访问数据库需要用到的类、接口、方法

    2.1.java.sqlDriverManager--负责加载各种不同驱动程序(Driver),并根据不同的请求,    向调用者返回相应的数据库连接。 驱动程序,会将自身加载到DriverManager中去。 

   2.1.1数据驱动程序(Driver)--- 根据所连接的数据库不同需要下载对应数据库的驱动程序。

   例如:MySQL数据库----MySQL :: Download MySQL Connector/J (Archived Versions)

     mysql-connector-java-5.1.38-bin.jar

     通过java的反射机制,来给DriverManager,提供被加载的数据库驱动名称。

      Class.forName(“数据库驱动名称【包名+类名】”);

     数据库驱动名称来自mysql-connector-java-5.1.38-bin.jar中Driver的java类的全名称。

      Class.forName(“com.mysql.jdbc.Deiver”);

   2.1.2向调用者返回相应的数据库连接

         DriverManager类中的静态方法getConnection(url,username,password)向调用者返               回相应的数据库连接

         static  Connection   getConnection(url,username,password)

        参数url---指定被连接的数据库位置

        【jdbc:mysql://数据库服务器IP:端口/数据库名称】

        参数username---登陆数据库服务器的用户名

       参数password----登陆数据库服务器的密码

 2.2 java.sql包Connection接口---数据库连接,负责与进行数据库间通讯,SQL执行以及事务处    理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement

1.产生用以执行SQL的Statement

   Statement  createStatement()【用以执行SQL查询和更新(针对静态SQL语句和单次执行)】

   select   * from  t_user  where uid=12;[拼接字符串]

2.产生用以执行SQL的PreparedStatement。

       用于执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)

       PreparedStatement  prepartatement(Sql)

       参数sql---包含动态参数的SQL语句

       select   * from  t_user  where uid=?;【需要给sql动态传递值】

        ?---占位符

2.3.java.sql包Statement接口---用以执行SQL查询和更新(针对静态SQL语句和单次执行)以

以执行SQL更新【insert/update/delete】

int executeUpdate(SQL)

参数SQL--[insert/update/delete]字符串类型的sql语句

以执行SQL查询[select]

ResultSet executeQuery(SQL)

参数SQL---[select]字符串类型的sql语句

 2.4 java.sql包PreparedStatement接口--用以执行包含动态参数的SQL查询和更新(在服务器端    编译,允许重复执行以提高效率)

          以执行SQL更新【insert / update /delete】

          int executeUpdate()

          以执行SQL查询【select】

          ResultSet    executeQuery()

          注意:PreparedStatement需要执行的sql语句

  1. sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
  2. PreparedStatement对象所执行的sql语句中有“?【占位符】”

          有一组填补sql语句占位符的方法

           setInt(参数1,参数2)  int--int

           setLong(参数1,参数2)  long---bigint

           setDouble(参数1,参数2) double--double

  setString(参数1,参数2)  String--varchar/char

           .....................

           参数1---SQL语句中“?”的位置【从1开始】

           参数2---SQL语句中“?”具体数据值

   2.5.java.sql包ResultSet接口 --- 数据库结果集的数据表,通常通过执行查询数据库的语句生成

       ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指         针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while         循环中使用它来迭代结果集。

        默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且            只能按从第一行到最后一行的顺序进行。

JDBC--访问数据库_第2张图片

 boolean  next()--将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回         false。在 while 循环中使用它来迭代结果集。

 由于通过next方法将指针移动到下一行,我们现在就可以取出指针指向的当前行的数据值。要获取当前行中保存的数据值,就需要一列一列的取出数据值,所以ResultSet会有一组获取指定列数据的方法。

getXXXX(int colindex)---int colindex[当前需要获取数据值的列在当前行中的位置【从0开始】]

getXXXX(String colname)--String colname[当前需要获取数据值的列名称]

1 [int]--[id]

Zhangsan  [varchar]--[name]

23 [int]--[age]

2[int]--[id]

Lisi  [varchar]--[name]

24  [int]--[age]

3[int]--[id]

Wangwu  [varchar]--[name]

25  [int]--[age]

通过ResultSet对象得到第一行数据值
int  id=ResultSet对象.getInt(0);
int  id=ResultSet对象.getInt(“id”);
//id==1
String name=ResultSet对象.getString(1);
String name=ResultSet对象.getString(“name”);
//name==zhangsan
int  age=ResultSet对象.getInt(2);
int  age=ResultSet对象.getInt(“age”);
//age==23

3.JDBC访问数据库的流程

JDBC--访问数据库_第3张图片

 测试基于Statement接口的数据库访问

1.创建数据库表

create table t_user(
user_id int primary key auto_increment,
user_name varchar(20),
user_pass varchar(20),
user_age int,
user_sex bit,
user_hei double,
user_day datetime
);

2、创建java项目,导入数据库启动包

3、创建保存用户信息的java类

package com.wangxing.test1;
/*
 * 保存用户信息的Java类
 */

import java.sql.Date;

public class UserBean {
	private int userid;
	private String username;
	private String userpass;
	private int userage;
	private boolean usersex;
	private double hei;
	private Date userday;
	
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUserpass() {
		return userpass;
	}
	public void setUserpass(String userpass) {
		this.userpass = userpass;
	}
	public int getUserage() {
		return userage;
	}
	public void setUserage(int userage) {
		this.userage = userage;
	}
	public boolean isUsersex() {
		return usersex;
	}
	public void setUsersex(boolean usersex) {
		this.usersex = usersex;
	}
	public double getHei() {
		return hei;
	}
	public void setHei(double hei) {
		this.hei = hei;
	}
	public Date getUserday() {
		return userday;
	}
	public void setUserday(Date userday) {
		this.userday = userday;
	}
	
	
}

4、创建数据库驱动管理类

package com.wangxing.test1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.locks.Condition;

public class DBConnection {
	//创建数据库启动名称
	private static final String DRIVERNAME="com.mysql.jdbc.Driver";
	//定义数据库url
	private static final String URL="jdbc:mysql://127.0.0.1:3306/test";
	//定义数据库登录账号
	private static final String USENAME="root";
	//定义数据库登录密码
	private static final String PASSWORD="123456";
	//静态代码块
	static{
		//加载数据库驱动
		try {
			Class.forName(DRIVERNAME);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/*
	 * 得到数据库连接
	 */
	public static Connection getConnection(){
		Connection conn=null;
		//得到数据库连接
		try {
			conn=DriverManager.getConnection(URL, USENAME, PASSWORD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
}

5.创建数据库用户表信息的访问类

package com.wangxing.test1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.swing.event.ListDataEvent;

public class UserService {
	/**
	 * 添加学生信息
	 * @param userbean
	 * @return
	 */
	public boolean insertUser(UserBean userbean) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			// 创建Statemen对象
			Statement statement = conn.createStatement();
			// 创建添加数据的sql语句
			String sql = "insert into t_user values(null,'" + userbean.getUsername() + "','" + userbean.getUserpass()
					+ "'," + userbean.getUserage() + "," + userbean.isUsersex() + "," + userbean.getHei() + ",'"
					+ userbean.getUserday() + "');";
			// 执行添加sql
			int temp = statement.executeUpdate(sql);
			if (temp > 0) {
				flag = true;
			}
			statement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	// 根据id修改信息
	public boolean updateUser(UserBean userbean) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			// 创建Statemen对象
			Statement statement = conn.createStatement();
			// 修改sql
			String sql2 = "update t_user set user_name='" + userbean.getUsername() + "',user_pass="
					+ userbean.getUserpass() + ",user_age=" + userbean.getUserage() + ",user_sex="
					+ userbean.isUsersex() + ",user_hei=" + userbean.getHei() + ",user_day='" + userbean.getUserday()
					+ "'where user_id=" + userbean.getUserid() + ";";
			// 执行添加sql
			int temp = statement.executeUpdate(sql2);
			if (temp > 0) {
				flag = true;
			}
			statement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	// 根据id删除信息
	public boolean deleteUser(int userid) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			// 创建Statemen对象
			Statement statement = conn.createStatement();
			// 删除sql
			String sql3 = "delete from t_user where user_id=" + userid + ";";
			int temp = statement.executeUpdate(sql3);
			if (temp > 0) {
				flag = true;
			}
			statement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}
	// 查询所有学生信息
		public List selectAll(){
			List userlist=null;
			try {
				// 得到数据库链接
				Connection conn = DBConnection.getConnection();
				// 创建Statemen对象
				Statement statement = conn.createStatement();
				String sql4="select * from t_user;";
				ResultSet rs= statement.executeQuery(sql4);
				userlist=new ArrayList();
				while(rs.next()){
					int userid=rs.getInt("user_id");
				    String username=rs.getString("user_name");
				    String userpass=rs.getString("user_pass");
				    int userage=rs.getInt("user_age");
				    boolean usersex=rs.getBoolean("user_sex");
				    double userhei=rs.getDouble("user_hei");
				    Date date=rs.getDate("user_day");
				    UserBean userBean=new UserBean();
				    userBean.setUserid(userid);
				    userBean.setUsername(username);
				    userBean.setUserpass(userpass);
				    userBean.setUserage(userage);
				    userBean.setUsersex(usersex);
				    userBean.setHei(userhei);
				    userBean.setUserday(date);
				    userlist.add(userBean);
				}
				rs.close();
				statement.close();
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return userlist;
		}
		//根据id查询学生信息
				public UserBean selectById(int uid){
					UserBean userBean=null;
					try {
						// 得到数据库链接
						Connection conn = DBConnection.getConnection();
						// 创建Statemen对象
						Statement statement = conn.createStatement();
						String sql5="select * from t_user where user_id="+uid+";";
						ResultSet rs= statement.executeQuery(sql5);
						if(rs.next()){
							int userid=rs.getInt("user_id");
						    String username=rs.getString("user_name");
						    String userpass=rs.getString("user_pass");
						    int userage=rs.getInt("user_age");
						    boolean usersex=rs.getBoolean("user_sex");
						    double userhei=rs.getDouble("user_hei");
						    Date date=rs.getDate("user_day");
						    userBean=new UserBean();
						    userBean.setUserid(userid);
						    userBean.setUsername(username);
						    userBean.setUserpass(userpass);
						    userBean.setUserage(userage);
						    userBean.setUsersex(usersex);
						    userBean.setHei(userhei);
						    userBean.setUserday(date);
						}
						rs.close();
						statement.close();
						conn.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
					return userBean;
				}
}

6.测试

package com.wangxing.test1;

import java.sql.Connection;
import java.sql.Date;
import java.util.List;


public class Test1 {

	public static void main(String[] args) {
		/*
		//创建UserService对象
		UserService userservice=new UserService();
		//创建UserBean
		UserBean userbean=new UserBean();
		userbean.setUsername("张飒");
		userbean.setUserpass("123456");
		userbean.setUserage(24);
		userbean.setUsersex(true);
		userbean.setHei(185.9);
		userbean.setUserday(new Date(System.currentTimeMillis()));
		boolean flag=userservice.insertUser(userbean);
		if(flag){
			System.out.println("添加成功");
		}
		*/
		/**
		 * 根据id修改
		 */
		/*
		//创建UserService对象
				UserService userservice=new UserService();
				//创建UserBean
				UserBean userbean=new UserBean();
				userbean.setUserid(1);
				userbean.setUsername("张三");
				userbean.setUserpass("111111");
				userbean.setUserage(28);
				userbean.setUsersex(true);
				userbean.setHei(185.9);
				userbean.setUserday(new Date(System.currentTimeMillis()));
				boolean flag=userservice.updateUser(userbean);
				if(flag){
					System.out.println("修改成功");
				}
				*/
		
		/*
		UserService userservice=new UserService();
		boolean flag=userservice.deleteUser(4);
		if(flag){
			System.out.println("删除成功");
		}
		*/
		
		/*
		UserService userservice=new UserService();
		Listuserlist=userservice.selectAll();
		for(UserBean userBean:userlist){
			System.out.println(userBean.getUsername()+"\t"+userBean.getHei());
		}
		*/
		/*
		UserService userservice=new UserService();
		UserBean userbean=userservice.selectById(2);
		if(userbean!=null){
			System.out.println(userbean.getUsername()+"\t"+userbean.getHei());
		}
		*/
	}

}

测试基于PreparedStatement接口的数据库访问

1.创建数据库表

create table t_user(
user_id int primary key auto_increment,
user_name varchar(20),
user_pass varchar(20),
user_age int,
user_sex bit,
user_hei double,
user_day datetime
);

2.创建java项目,导入数据库驱动包

3.依据数据库表创建保存用户信息的java类

package com.wangxing.test2;
/*
 * 保存用户信息的Java类
 */

import java.sql.Date;

public class UserBean {
	private int userid;
	private String username;
	private String userpass;
	private int userage;
	private boolean usersex;
	private double hei;
	private Date userday;
	
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUserpass() {
		return userpass;
	}
	public void setUserpass(String userpass) {
		this.userpass = userpass;
	}
	public int getUserage() {
		return userage;
	}
	public void setUserage(int userage) {
		this.userage = userage;
	}
	public boolean isUsersex() {
		return usersex;
	}
	public void setUsersex(boolean usersex) {
		this.usersex = usersex;
	}
	public double getHei() {
		return hei;
	}
	public void setHei(double hei) {
		this.hei = hei;
	}
	public Date getUserday() {
		return userday;
	}
	public void setUserday(Date userday) {
		this.userday = userday;
	}
	
	
}

4.创建数据库连接类

package com.wangxing.test2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.locks.Condition;

public class DBConnection {
	//创建数据库启动名称
	private static final String DRIVERNAME="com.mysql.jdbc.Driver";
	//定义数据库url
	private static final String URL="jdbc:mysql://127.0.0.1:3306/test";
	//定义数据库登录账号
	private static final String USENAME="root";
	//定义数据库登录密码
	private static final String PASSWORD="123456";
	//静态代码块
	static{
		//加载数据库驱动
		try {
			Class.forName(DRIVERNAME);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/*
	 * 得到数据库连接
	 */
	public static Connection getConnection(){
		Connection conn=null;
		//得到数据库连接
		try {
			conn=DriverManager.getConnection(URL, USENAME, PASSWORD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
}

5.创建数据库访问类

package com.wangxing.test2;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.swing.event.ListDataEvent;

public class UserService {
	public boolean insertUser(UserBean userbean) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			// 创建Statemen对象
			String sql = "insert into t_user values(null, ?,?,?,?,?,?);";
			PreparedStatement preparedStatement = conn.prepareStatement(sql);
			preparedStatement.setString(1, userbean.getUsername());
			preparedStatement.setString(2, userbean.getUserpass());
			preparedStatement.setInt(3, userbean.getUserage());
			preparedStatement.setBoolean(4, userbean.isUsersex());
			preparedStatement.setDouble(5, userbean.getHei());
			preparedStatement.setDate(6,userbean.getUserday() );
			// 执行添加sql
			int temp = preparedStatement.executeUpdate();
			if (temp > 0) {
				flag = true;
			}
			preparedStatement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	// 根据id修改信息
	public boolean updateUser(UserBean userbean) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			String sql2 = "update t_user set user_name=?,user_pass=?,user_age=?,user_sex=?,user_hei=?,user_day=?  where user_id= ?;";
			PreparedStatement preparedStatement = conn.prepareStatement(sql2);
			preparedStatement.setString(1, userbean.getUsername());
			preparedStatement.setString(2, userbean.getUserpass());
			preparedStatement.setInt(3, userbean.getUserage());
			preparedStatement.setBoolean(4, userbean.isUsersex());
			preparedStatement.setDouble(5, userbean.getHei());
			preparedStatement.setDate(6,userbean.getUserday());
			preparedStatement.setInt(7, userbean.getUserid());
			int temp = preparedStatement.executeUpdate();
			if (temp > 0) {
				flag = true;
			}
			preparedStatement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	// 根据id删除信息
	public boolean deleteUser(int userid) {
		boolean flag = false;
		try {
			// 得到数据库链接
			Connection conn = DBConnection.getConnection();
			// 删除sql
			String sql3 = "delete from t_user where user_id=?;";
			// 创建Statemen对象
			PreparedStatement preparedStatement = conn.prepareStatement(sql3);
			preparedStatement.setInt(1, userid);
			int temp = preparedStatement.executeUpdate();
			if (temp > 0) {
				flag = true;
			}
			preparedStatement.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}
	// 查询所有学生信息
		public List selectAll(){
			List userlist=null;
			try {
				// 得到数据库链接
				Connection conn = DBConnection.getConnection();
				String sql4="select * from t_user;";
				// 创建Statemen对象
				PreparedStatement preparedStatement = conn.prepareStatement(sql4);
				ResultSet rs= preparedStatement.executeQuery(sql4);
				userlist=new ArrayList();
				while(rs.next()){
					int userid=rs.getInt("user_id");
				    String username=rs.getString("user_name");
				    String userpass=rs.getString("user_pass");
				    int userage=rs.getInt("user_age");
				    boolean usersex=rs.getBoolean("user_sex");
				    double userhei=rs.getDouble("user_hei");
				    Date date=rs.getDate("user_day");
				    UserBean userBean=new UserBean();
				    userBean.setUserid(userid);
				    userBean.setUsername(username);
				    userBean.setUserpass(userpass);
				    userBean.setUserage(userage);
				    userBean.setUsersex(usersex);
				    userBean.setHei(userhei);
				    userBean.setUserday(date);
				    userlist.add(userBean);
				}
				rs.close();
				preparedStatement.close();
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return userlist;
		}
		//根据id查询学生信息
				public UserBean selectById(int uid){
					UserBean userBean=null;
					try {
						// 得到数据库链接
						Connection conn = DBConnection.getConnection();
						String sql5="select * from t_user where user_id=?;";
						// 创建Statemen对象
						PreparedStatement preparedStatement = conn.prepareStatement(sql5);
						preparedStatement.setInt(1, uid);
						ResultSet rs= preparedStatement.executeQuery();
						if(rs.next()){
							int userid=rs.getInt("user_id");
						    String username=rs.getString("user_name");
						    String userpass=rs.getString("user_pass");
						    int userage=rs.getInt("user_age");
						    boolean usersex=rs.getBoolean("user_sex");
						    double userhei=rs.getDouble("user_hei");
						    Date date=rs.getDate("user_day");
						    userBean=new UserBean();
						    userBean.setUserid(userid);
						    userBean.setUsername(username);
						    userBean.setUserpass(userpass);
						    userBean.setUserage(userage);
						    userBean.setUsersex(usersex);
						    userBean.setHei(userhei);
						    userBean.setUserday(date);
						}
						rs.close();
						preparedStatement.close();
						conn.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
					return userBean;
				}
}

6.测试

package com.wangxing.test2;

import java.sql.Connection;
import java.sql.Date;
import java.util.List;


public class Test1 {

	public static void main(String[] args) {
		/*
		//创建UserService对象
		UserService userservice=new UserService();
		//创建UserBean
		UserBean userbean=new UserBean();
		userbean.setUsername("张三三");
		userbean.setUserpass("123456");
		userbean.setUserage(24);
		userbean.setUsersex(true);
		userbean.setHei(185.9);
		userbean.setUserday(new Date(System.currentTimeMillis()));
		boolean flag=userservice.insertUser(userbean);
		if(flag){
			System.out.println("添加成功");
		}
		*/
		/**
		 * 根据id修改
		 */
		/*
		        //创建UserService对象
				UserService userservice=new UserService();
				//创建UserBean
				UserBean userbean=new UserBean();
				userbean.setUserid(1);
				userbean.setUsername("张飒");
				userbean.setUserpass("123456");
				userbean.setUserage(23);
				userbean.setUsersex(true);
				userbean.setHei(170);
				userbean.setUserday(new Date(System.currentTimeMillis()));
				boolean flag=userservice.updateUser(userbean);
				if(flag){
					System.out.println("修改成功");
				}
				*/
		/*
		
		UserService userservice=new UserService();
		boolean flag=userservice.deleteUser(5);
		if(flag){
			System.out.println("删除成功");
		}
		*/
		
		/*
		UserService userservice=new UserService();
		Listuserlist=userservice.selectAll();
		for(UserBean userBean:userlist){
			System.out.println(userBean.getUsername()+"\t"+userBean.getHei());
		}
		*/
		
		
		UserService userservice=new UserService();
		UserBean userbean=userservice.selectById(1);
		if(userbean!=null){
			System.out.println(userbean.getUsername()+"\t"+userbean.getHei());
		}
		
		
	}

}

Statement与PreparedStatement的区别?

Statement接口

PreparedStatement接口

继承关系

是Statement接口的子接口

使用范围

当执行相似SQL(结构相同,具体值不同)语句的次数比较少

当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作..)语句一样,只是具体的值不一样,被称为动态SQL

优点

语法简单

语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)

缺点

采用硬编码效率低,安全性较差。

执行非相似SQL语句时,速度较慢。

原理

硬编码,每次执行时相似SQL都会进行编译

相似SQL只编译一次,减少编译次数

你可能感兴趣的:(Java,java,开发语言,后端)