一,数据库有关框架:
1.框架:提高开发效率。按部就班
2.数据库框架:
ORM:Object Relation Mapping 对象关系映射。JavaBean --Object数据库----Relation
知名框架:Hibernate ,MyBatis,JPA(Java Persist API:JavaEE技术之一,ORM标准)
-----------------------------------------------------------------------------------------------------------------------
DBUtils,Spring JDBCTemplate不能算是ORM框架,只是对JDBC编码进行简化处理
二、DBUtils框架:
QueryRunner:
1.构造方法:
QueryRunner()默认构造方法;
QueryRunner(DataSource ds)需要一个数据源;
2.具体方法:
batch:批处理
int[]
batch(Connection conn, String sql, Object[][] params)
// Execute a batch of SQL INSERT, UPDATE, or DELETE queries.使用默认构造方法时
int[]
batch(String sql, Object[][] params)
// Execute a batch of SQL INSERT, UPDATE, or DELETE queries.
Object[][]params:高维:执行的语句条数,低维:每条语句需要的参数
query:查询
public <T> T query(String sql,ResultSetHandler<T> rsh,Object... params)throws SQLException
////Executes the given SELECT SQL query and returns a result object. The Connection
is retrieved from the DataSource
set in the constructor.
public <T> T query(Connection conn,String sql,ResultSetHandler<T> rsh, Object... params)throws SQLException
////Executes the given SELECT SQL query and returns a result object. The Connection
is retrieved from the DataSource
set in the constructor.
update:DML INSERT UPDATE DELETE
int update(String sql, Object... params)
Executes the given INSERT, UPDATE, or DELETE SQL statement.
update(Connection conn,String sql, Object... params)
Executes the given INSERT, UPDATE, or DELETE SQL statement.
注意:多次调用update方法,需要在一个事物中,用update(Connection conn,String sql, Object... params)
,用默认构造方法。
例子:
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileReader; 4 import java.io.InputStream; 5 import java.io.Reader; 6 import java.sql.Blob; 7 import java.sql.Clob; 8 import java.sql.SQLException; 9 import java.util.Date; 10 11 import javax.sql.rowset.serial.SerialBlob; 12 import javax.sql.rowset.serial.SerialClob; 13 14 import org.apache.commons.dbutils.QueryRunner; 15 import org.junit.Test; 16 17 import com.itheima.util.DBCPUtil; 18 19 /* 20 create table student( 21 id int primary key, 22 name varchar(100), 23 birthday date 24 ); 25 */ 26 public class DBUtilDemo1 { 27 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 28 @Test 29 public void testAdd() throws SQLException{ 30 qr.update("insert into student values(?,?,?)", 1,"wf",new Date()); 31 } 32 // @Test 33 // public void testAdd1() throws SQLException{ 34 // qr.update("insert into student values(?,?,?)", 2,"qhs","1930-09-08"); 35 // } 36 37 /* 38 * create table t1(id int primary key,content longblob); 39 */ 40 @Test 41 public void testBlob() throws Exception{ 42 // InputStream in = new FileInputStream("src/20.jpg"); 43 // qr.update("insert into t1 values(?,?)", 1,in); 44 45 InputStream in = new FileInputStream("src/20.jpg"); 46 byte b[] = new byte[in.available()]; 47 in.read(b); 48 in.close(); 49 Blob blob = new SerialBlob(b); 50 qr.update("insert into t1 values(?,?)", 2,blob); 51 } 52 /* 53 * create table t2(id int primary key,content longtext); 54 */ 55 @Test 56 public void testClob() throws Exception{ 57 File file = new File("src/jpm.txt"); 58 Reader r = new FileReader(file); 59 char ch[] = new char[(int)file.length()]; 60 r.read(ch); 61 r.close(); 62 Clob c = new SerialClob(ch); 63 qr.update("insert into t2 values(?,?)", 1,c); 64 } 65 /* 66 * create table t3(id int,name varchar(100)); 67 */ 68 @Test 69 public void testBatch()throws Exception{ 70 71 Object params[][] = new Object[10][]; 72 for(int i=0;i<params.length;i++){ 73 params[i] = new Object[]{i+1,"aaa"+(i+1)}; 74 } 75 qr.batch("insert into t3 values(?,?)", params); 76 } 77 }
1 import java.io.InputStream; 2 import java.sql.Connection; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 import java.util.Properties; 7 8 import javax.sql.DataSource; 9 10 import org.apache.commons.dbcp.BasicDataSourceFactory; 11 12 public class DBCPUtil { 13 private static DataSource dataSource; 14 static{ 15 try { 16 InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); 17 Properties props = new Properties(); 18 props.load(in); 19 dataSource = BasicDataSourceFactory.createDataSource(props); 20 } catch (Exception e) { 21 throw new ExceptionInInitializerError("error"); 22 } 23 } 24 public static Connection getConnection(){ 25 try { 26 return dataSource.getConnection(); 27 } catch (SQLException e) { 28 throw new RuntimeException("error"); 29 } 30 } 31 public static DataSource getDataSource(){ 32 return dataSource; 33 } 34 35 }
1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/day17 3 username=root 4 password=123456 5 initialSize=10 6 maxActive=50 7 maxIdle=20 8 minIdle=5 9 maxWait=60000 10 connectionProperties=useUnicode=true;characterEncoding=utf8 11 defaultAutoCommit=true 12 defaultReadOnly= 13 defaultTransactionIsolation=REPEATABLE_READ
三、DBUtils所有的结果处理器(查询返回的结果集)
封装的结果是什么样的:
ArrayHandler:适用于结果集只有一条结果的情况。返回Obejct[],数组中的元素就是记录的每列数据。
ArrayListHandler:适用于结果集中有多条结果的情况。返回的是一个List<Object[]>,List封装了记录,Object[]每条记录的每列数据。
BeanHandler, BeanListHandler,
ColumnListHandler:适用于取某一列的值。返回的是List<Object>,集合中就是该列中的数据。
KeyedHandler:适用于结果中有多条的情况。返回的是一个Map<Object,Map<String,Object>>。
MapHandler:适用于结果只有一条的情况。Map<String,Object>,key是字段名,value,字段值。
MapListHandler:适用于结果有多条的情况。List<Map<String,Object>>.List封装了所有的记录,每条记录封装到Map中,key是字段名,value,字段值。
ScalarHandler:适用于结果中只有一行和只有一列的情况。返回的是一个Object。
ThreadLocal类
利用DBUtils进行事物有关操作
利用DBUtils进行多表操作