J2EE进阶之JDBC工具类DbUtils使用 二十
来源:互联网 发布:电脑安全防护软件 编辑:程序博客网 时间:2024/06/06 09:35
JDBC之DbUtils使用
O-R Mapping简介
ORM:Object Relation Mapping。
Java:一切都是对象(实体对象)。数据库:关系型数据库。
常用O-R Mapping映射工具 Hibernate CMP JPA(Java Persistent API) Ibatis--->MyBatis Commons DbUtils(只是对JDBC简单封装) Spring JDBC Template
一、DBUtil框架的使用
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
API介绍(查看QueryRunner的API)
org.apache.commons.dbutils.QueryRunner :DBAssist org.apache.commons.dbutils.ResultSetHandler
工具类
org.apache.commons.dbutils.DbUtils、。
点击下载jar包和源码
先创建一个Account表
QueryRunner类
QueryRunnerDemo
1 package jdbcdemo4.wsj.demo; 2 3 import java.io.File; 4 import java.io.FileReader; 5 import java.io.Reader; 6 import java.sql.Clob; 7 import java.sql.SQLException; 8 import javax.sql.rowset.serial.SerialClob; 9 import org.apache.commons.dbutils.QueryRunner; 10 import org.junit.Test; 11 import utils.DBCPUtil; 12 /** 13 * 14 * @author Angus 15 * 16 */ 17 public class QueryRunnerDemo { 18 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 19 @Test 20 public void testAdd() throws SQLException{ 21 qr.update("insert into account (name,money) values (?,?)", "ddd",1000); 22 } 23 @Test 24 public void testUpdate() throws SQLException{ 25 qr.update("update account set money=? where id=?", 10000,4); 26 } 27 @Test 28 public void testDelete() throws SQLException{ 29 qr.update("delete from account where id=?", 4); 30 } 31 32 //插入10条数据 33 @Test 34 public void testBatch() throws SQLException{ 35 Object[][] params = new Object[10][]; 36 for (int i = 0; i < params.length; i++) { 37 params[i] = new Object[]{i+1,"aaa"+(i+1)}; 38 39 } 40 qr.batch("insert into t1(id,name) values(?,?)", params); 41 } 42 43 //了解:大文本和二进制的操作 44 /* 45 create table t2(id int,content longtext ); 46 */ 47 //注意类型:content longtext Java:java.sql.Clob 48 @Test 49 public void testLob() throws Exception{ 50 File file = new File("src/a.txt"); 51 Reader reader = new FileReader(file); 52 char ch[] = new char[(int)file.length()]; 53 reader.read(ch); 54 reader.close(); 55 56 Clob clob = new SerialClob(ch); 57 qr.update("insert into t2 (id,content) values (?,?)", 1,clob); 58 } 59 }
二、DBUtil提供的结果处理器:ResultSetHandler接口
demo测试
1 package jdbcdemo4.wsj.demo; 2 3 import java.sql.SQLException; 4 import java.util.List; 5 import java.util.Map; 6 7 import jdbcdemo4.wsj.domain.Account; 8 9 import org.apache.commons.dbutils.QueryRunner; 10 import org.apache.commons.dbutils.handlers.ArrayHandler; 11 import org.apache.commons.dbutils.handlers.ArrayListHandler; 12 import org.apache.commons.dbutils.handlers.BeanHandler; 13 import org.apache.commons.dbutils.handlers.BeanListHandler; 14 import org.apache.commons.dbutils.handlers.ColumnListHandler; 15 import org.apache.commons.dbutils.handlers.KeyedHandler; 16 import org.apache.commons.dbutils.handlers.MapHandler; 17 import org.apache.commons.dbutils.handlers.MapListHandler; 18 import org.apache.commons.dbutils.handlers.ScalarHandler; 19 import org.junit.Test; 20 21 import utils.DBCPUtil; 22 23 /** 24 * @author Angus 25 * 需要掌握的:BeanHandler BeanListHandler ScalarHandler 26 */ 27 public class QueryRunnerDemo1 { 28 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 29 //适合结果只有一条,把结果封装到JavaBean中:BeanHandler 30 @Test 31 public void test1() throws SQLException{ 32 Account a = qr.query("select * from account", new BeanHandler<Account>(Account.class)); 33 System.out.println(a); 34 } 35 //适合结果有多条,把结果封装到JavaBean中List:BeanListHandler 36 @Test 37 public void test2() throws SQLException{ 38 List<Account> as = qr.query("select * from account", new BeanListHandler<Account>(Account.class)); 39 for(Account a:as) 40 System.out.println(a); 41 } 42 //ArrayHandler:把结果集中的第一行数据转成对象数组.适合结果有一条。 Object[] 43 @Test 44 public void test3() throws SQLException{ 45 Object[] objs = qr.query("select * from account", new ArrayHandler()); 46 for(Object obj:objs) 47 System.out.println(obj);//每列的值 48 } 49 //ArrayListHandler:适合结果有多条。把结果集中的每一行数据都转成一个数组,再存放到List中。 List<Object[]> 50 @Test 51 public void test4() throws SQLException{ 52 List<Object[]> list = qr.query("select * from account", new ArrayListHandler()); 53 for(Object[] objs:list){ 54 System.out.println("---------------"); 55 for(Object obj:objs){ 56 System.out.println(obj);//每列的值 57 } 58 } 59 60 } 61 //ColumnListHandler:将结果集中某一列的数据存放到List中。 取某一列 List<Object> 62 @Test 63 public void test5() throws SQLException{ 64 List<Object> list = qr.query("select * from account", new ColumnListHandler("name")); 65 for(Object obj:list){ 66 System.out.println(obj); 67 } 68 } 69 //KeyedHandler(name):适合多条记录。将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。 70 @Test 71 public void test6() throws SQLException{ 72 Map<Object,Map<String,Object>> bmap = qr.query("select * from account", new KeyedHandler("id")); 73 for(Map.Entry<Object,Map<String,Object>> bme:bmap.entrySet()){ 74 System.out.println("---------------"); 75 for(Map.Entry<String, Object> lme:bme.getValue().entrySet()){ 76 System.out.println(lme.getKey()+"="+lme.getValue()); 77 } 78 } 79 } 80 //MapHandler:适合只有一条结果。将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 81 @Test 82 public void test7() throws SQLException{ 83 Map<String,Object> map = qr.query("select * from account", new MapHandler()); 84 for(Map.Entry<String, Object> lme:map.entrySet()){ 85 System.out.println(lme.getKey()+"="+lme.getValue()); 86 } 87 } 88 //MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List 89 @Test 90 public void test8() throws SQLException{ 91 List<Map<String,Object>> list = qr.query("select * from account", new MapListHandler()); 92 for(Map<String,Object> map:list) 93 for(Map.Entry<String, Object> lme:map.entrySet()){ 94 System.out.println(lme.getKey()+"="+lme.getValue()); 95 } 96 } 97 //ScalarHandler:适合结果只有一条且只有一列的情况。 count(*) 98 @Test 99 public void test9() throws SQLException{100 Object obj = qr.query("select * from account where id=1", new ScalarHandler("name"));101 System.out.println(obj);102 obj = qr.query("select count(*) from account", new ScalarHandler(1));//java.lang.Long103 System.out.println(obj.getClass().getName());104 System.out.println(obj);105 }106 107 }
三、DBUtil做事务开发:4个版本 以转账为例
第一个版本 异常没有做处理,模拟
service层
public interface BusinessService { /** * 转账 * @param srcAccountName 源账户 * @param destAccountName 目标账户 * @param money 金额 */ void transfer(String srcAccountName,String destAccountName,float money);}
service实现层
import jdbcdemo4.wsj.dao.AccountDao;import jdbcdemo4.wsj.dao.impl.AccountDaoImpl;import jdbcdemo4.wsj.service.BusinessService;public class BusinessServiceImpl implements BusinessService { private AccountDao dao = new AccountDaoImpl(); public void transfer(String srcAccountName, String destAccountName, float money) { dao.transfer(srcAccountName, destAccountName, money); }}
Dao层
public interface AccountDao { void transfer(String srcAccountName, String destAccountName, float money);}
dao实现
public class AccountDaoImpl implements AccountDao { private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); public void transfer(String srcAccountName, String destAccountName, float money) { try { qr.update("update account set money=money-? where name=?",money,srcAccountName); int i=1/0; //这样出现了异常就造成只减不加。。 qr.update("update account set money=money+? where name=?",money,destAccountName); } catch (SQLException e) { e.printStackTrace(); } }}
main方法测试
public class Main { public static void main(String[] args) { BusinessService s = new BusinessServiceImpl(); s.transfer("aaa", "bbb", 100); }}
第二种情况,能解决事物问题,但是不建议这样写,事务的要求一般都是业务上的要求,不合理
dao实现修改后
1 public class AccountDaoImpl implements AccountDao { 2 private QueryRunner qr = new QueryRunner(); 3 public void transfer(String srcAccountName, String destAccountName, 4 float money) { 5 Connection conn = null; 6 try { 7 conn = DBCPUtil.getConnection(); 8 conn.setAutoCommit(false);//开启事务 9 qr.update(conn,"update account set money=money-? where name=?",money,srcAccountName); 10 int i=1/0; 11 qr.update(conn,"update account set money=money+? where name=?",money,destAccountName); 12 conn.commit(); 13 } catch (SQLException e) { 14 if(conn!=null){ 15 try { 16 conn.rollback(); 17 } catch (SQLException e1) { 18 e1.printStackTrace(); 19 } 20 } 21 e.printStackTrace(); 22 }finally{ 23 //把连接还回池中 24 if(conn!=null){ 25 try { 26 conn.close(); 27 } catch (SQLException e) { 28 e.printStackTrace(); 29 } 30 } 31 } 32 } 33 34 }
第三种情况,也能解决,也不建议这么写
可以修改service层
1 public class BusinessServiceImpl implements BusinessService { 2 3 public void transfer(String srcAccountName, String destAccountName, 4 float money) { 5 Connection conn = null; 6 try{ 7 conn = DBCPUtil.getConnection(); 8 conn.setAutoCommit(false); 9 AccountDao dao = new AccountDaoImpl(conn); 10 Account sAccount = dao.findAccount(srcAccountName); 11 Account dAccount = dao.findAccount(destAccountName); 12 13 sAccount.setMoney(sAccount.getMoney()-money); 14 dAccount.setMoney(dAccount.getMoney()+money); 15 16 dao.update(sAccount); 17 // int i=1/0; 18 dao.update(dAccount); 19 conn.commit(); 20 }catch(Exception e){ 21 if(conn!=null){ 22 try { 23 conn.rollback(); 24 } catch (SQLException e1) { 25 e1.printStackTrace(); 26 } 27 } 28 throw new RuntimeException(e); 29 }finally{ 30 if(conn!=null){ 31 try { 32 conn.close(); 33 } catch (SQLException e) { 34 e.printStackTrace(); 35 } 36 } 37 } 38 39 40 } 41 42 }
Connection这样的接口应该出现在DAO层,但是出现在了业务逻辑层。。。
Dao层修改后:
1 public class AccountDaoImpl implements AccountDao { 2 private QueryRunner qr = new QueryRunner(); 3 private Connection conn; 4 public AccountDaoImpl(Connection conn){ 5 this.conn = conn; 6 } 7 @Override 8 public Account findAccount(String srcAccountName) { 9 try { 10 return qr.query(conn,"select * from account where name=?", new BeanHandler<Account>(Account.class), srcAccountName); 11 } catch (SQLException e) { 12 throw new RuntimeException(e); 13 } 14 } 15 @Override 16 public void update(Account sAccount) { 17 try { 18 qr.update(conn,"update account set money=? where name=?",sAccount.getMoney(),sAccount.getName()); 19 } catch (SQLException e) { 20 throw new RuntimeException(e); 21 } 22 } 23 24 }
Dao层完事了 但是service层不推荐。。
第四种情况
这里引用了ThreadLocal概念,建议先了解四、ThreadLocal:很重要,很简单第四部分模块在看线程处理情况
把service层的事物处理抽取出来到事物管理器中:
TransactionManager
1 public class TransactionManager { 2 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); 3 4 public static Connection getConnection(){ 5 Connection conn = tl.get();//获取当前线程上的链接 6 if(conn==null){ 7 conn = DBCPUtil.getConnection(); 8 tl.set(conn); 9 } 10 return conn; 11 } 12 public static void startTransaction(){ 13 Connection conn = getConnection(); 14 try { 15 conn.setAutoCommit(false); 16 } catch (SQLException e) { 17 e.printStackTrace(); 18 } 19 } 20 public static void rollback(){ 21 Connection conn = getConnection(); 22 try { 23 conn.rollback(); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 } 27 } 28 public static void commit(){ 29 Connection conn = getConnection(); 30 try { 31 conn.commit(); 32 } catch (SQLException e) { 33 e.printStackTrace(); 34 } 35 } 36 public static void release(){ 37 Connection conn = getConnection(); 38 try { 39 conn.close();//链接回池 40 tl.remove();//从当前线程上把链接移除。与服务器有关:服务器都使用了线程池。 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 } 45 }
service层修改
1 public class BusinessServiceImpl implements BusinessService { 2 3 public void transfer(String srcAccountName, String destAccountName, 4 float money) { 5 Connection conn = null; 6 try{ 7 conn = DBCPUtil.getConnection(); 8 conn.setAutoCommit(false); 9 AccountDao dao = new AccountDaoImpl(conn); 10 Account sAccount = dao.findAccount(srcAccountName); 11 Account dAccount = dao.findAccount(destAccountName); 12 13 sAccount.setMoney(sAccount.getMoney()-money); 14 dAccount.setMoney(dAccount.getMoney()+money); 15 16 dao.update(sAccount); 17 // int i=1/0; 18 dao.update(dAccount); 19 conn.commit(); 20 }catch(Exception e){ 21 if(conn!=null){ 22 try { 23 conn.rollback(); 24 } catch (SQLException e1) { 25 e1.printStackTrace(); 26 } 27 } 28 throw new RuntimeException(e); 29 }finally{ 30 if(conn!=null){ 31 try { 32 conn.close(); 33 } catch (SQLException e) { 34 e.printStackTrace(); 35 } 36 } 37 } 38 39 40 } 41 42 }
Dao层稍微改动
1 public class AccountDaoImpl implements AccountDao { 2 private QueryRunner qr = new QueryRunner(); 3 @Override 4 public Account findAccount(String srcAccountName) { 5 try { 6 return qr.query(TransactionManager.getConnection(),"select * from account where name=?", new BeanHandler<Account>(Account.class), srcAccountName); 7 } catch (SQLException e) { 8 throw new RuntimeException(e); 9 } 10 } 11 @Override 12 public void update(Account sAccount) { 13 try { 14 qr.update(TransactionManager.getConnection(),"update account set money=? where name=?",sAccount.getMoney(),sAccount.getName()); 15 } catch (SQLException e) { 16 throw new RuntimeException(e); 17 } 18 } 19 20 }
这样就基本解决了事物的问题。。
四、ThreadLocal:很重要,很简单
查看JDK中API:线程局部变量。。简单理解就是一个容易,一个线程放的数据,只有该线程能取到。
demo测试
写一个线程
public class Thread1 extends Thread { private ThreadLocal<String> tl; public Thread1(ThreadLocal<String> tl) { this.tl = tl; } public void run() { System.out.println(Thread.currentThread()+"取:"+tl.get()); }}
测试main方法:
public class ThreadLocalDemo { public static void main(String[] args) { ThreadLocal<String> tl = new ThreadLocal<String>();//容器 tl.set("p");//main主线程 Thread1 tt = new Thread1(tl); tt.start(); Object obj = tl.get(); System.out.println(Thread.currentThread().getName()+"取:"+obj); }}
输出结果只有main中能取出 而Thread1中无法取到。。。
五、利用DBUtil进行多表的存和取
一对多
一个用户对应多个订单案例
创建表
create table customers( id int primary key, name varchar(100));create table orders( ordernum int primary key, money float(8,2), customerId int, constraint customer_id_fk foreign key (customerId) references customers(id));
封装JavaBean数据
public class Customer implements Serializable { private int id;// private String name; private List<Orders> orders = new ArrayList<Orders>(); //....
。
public class Orders implements Serializable { private int ordernum;//订单号 private float money; private Customer customer;
测试:
public class CustomerDaoImplTest { private CustomerDao dao = new CustomerDaoImpl(); @Test public void testAddCustomer() { Customer c = new Customer(); c.setId(1); c.setName("wsj"); Orders o1 = new Orders(); o1.setOrdernum(1); o1.setMoney(1000); Orders o2 = new Orders(); o2.setOrdernum(2); o2.setMoney(100); //建立关联关系 c.getOrders().add(o1); c.getOrders().add(o2); dao.addCustomer(c); } @Test public void testFindCustomer() { Customer c = dao.findCustomer(1); System.out.println(c); for(Orders o:c.getOrders()) System.out.println(o); }}
Dao编写
1 public class CustomerDaoImpl implements CustomerDao { 2 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 3 public void addCustomer(Customer c) { 4 try { 5 //保存客户的基本信息 6 qr.update("insert into customers values (?,?)", c.getId(),c.getName()); 7 //判断客户有没有订单,如果有,保存订单信息 8 List<Orders> orders = c.getOrders(); 9 if(orders.size()>0){ 10 Object[][] params = new Object[orders.size()][]; 11 for(int i=0;i<orders.size();i++){ 12 params[i] = new Object[]{orders.get(i).getOrdernum(),orders.get(i).getMoney(),c.getId()}; 13 } 14 qr.batch("insert into orders (ordernum,money,customerId) values (?,?,?)", params); 15 } 16 } catch (SQLException e) { 17 throw new RuntimeException(e); 18 } 19 } 20 //一对多: 21 //客户:少的一方。订单:多的一方。 22 //在查少的一方的信息时,多的一方要不要一块查出来? 看需求。 23 public Customer findCustomer(int customerId) { 24 try { 25 //查询客户的基本信息 26 Customer c = qr.query("select * from customers where id=?", new BeanHandler<Customer>(Customer.class), customerId); 27 //查询客户对应的订单信息,并建立关系 28 if(c!=null){ 29 //针对查询客户有多少订单这种情况。 30 //极懒List<Orders> os = qr.query("select count(*) from orders where customerId=?", new BeanListHandler<Orders>(Orders.class), customerId); 31 //懒的List<Orders> os = qr.query("select ordernum from orders where customerId=?", new BeanListHandler<Orders>(Orders.class), customerId); 32 //饿的List<Orders> os = qr.query("select * from orders where customerId=?", new BeanListHandler<Orders>(Orders.class), customerId); 33 List<Orders> os = qr.query("select * from orders where customerId=?", new BeanListHandler<Orders>(Orders.class), customerId); 34 c.setOrders(os); 35 } 36 return c; 37 } catch (SQLException e) { 38 throw new RuntimeException(e); 39 } 40 } 41 42 }
多对多
老师和学生的关系案例
创建表
create table teachers( id int primary key, name varchar(100), salary float(8,2));create table students( id int primary key, name varchar(100), grade varchar(10));create table teachers_students( t_id int, s_id int, primary key(t_id,s_id), constraint teacher_id_fk foreign key (t_id) references teachers(id), constraint student_id_fk foreign key (s_id) references students(id));
封装JavaBean
public class Teacher implements Serializable { private int id; private String name; private float salary; private List<Student> students = new ArrayList<Student>();
。
public class Student implements Serializable { private int id; private String name; private String grade; private List<Teacher> teachers = new ArrayList<Teacher>();
测试:
1 public class TeacherDaoImplTest { 2 private TeacherDao dao = new TeacherDaoImpl(); 3 @Test 4 public void testAddTeacher() { 5 Teacher t1 = new Teacher(); 6 t1.setId(1); 7 t1.setName("RT"); 8 t1.setSalary(10000); 9 10 Teacher t2 = new Teacher(); 11 t2.setId(2); 12 t2.setName("WZT"); 13 t2.setSalary(10000); 14 15 Student s1 = new Student(); 16 s1.setId(1); 17 s1.setName("jsw"); 18 s1.setGrade("A"); 19 20 Student s2 = new Student(); 21 s2.setId(2); 22 s2.setName("wsj"); 23 s2.setGrade("A"); 24 25 t1.getStudents().add(s1); 26 t1.getStudents().add(s2); 27 28 t2.getStudents().add(s1); 29 t2.getStudents().add(s2); 30 31 dao.addTeacher(t1); 32 dao.addTeacher(t2); 33 } 34 35 @Test 36 public void testFindTeacher() { 37 Teacher t = dao.findTeacher(2); 38 System.out.println(t); 39 for(Student s:t.getStudents()){ 40 System.out.println(s); 41 } 42 } 43 44 }
Dao实现
1 public class TeacherDaoImpl implements TeacherDao { 2 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 3 @Override 4 public void addTeacher(Teacher t) { 5 try { 6 //保存老师的基本信息 7 qr.update("insert into teachers (id,name,salary) values (?,?,?)", t.getId(),t.getName(),t.getSalary()); 8 9 List<Student> students = t.getStudents(); 10 if(students.size()>0){ 11 for(Student s:students){ 12 //看看老师有没有关联学生,保存学生信息(看看学生信息有没有?没有,才保存) 13 Long l = (Long)qr.query("select count(*) from students where id=?", new ScalarHandler(1),s.getId()); 14 if(l==0){//学生信息不存在 15 qr.update("insert into students (id,name,grade) values(?,?,?)", s.getId(),s.getName(),s.getGrade()); 16 } 17 //保存关联信息到第三方表中 18 qr.update("insert into teachers_students (t_id,s_id) values (?,?)", t.getId(),s.getId()); 19 } 20 } 21 } catch (SQLException e) { 22 throw new RuntimeException(e); 23 } 24 25 } 26 27 @Override 28 public Teacher findTeacher(int teacherId) { 29 try{ 30 Teacher t = qr.query("select * from teachers where id=?", new BeanHandler<Teacher>(Teacher.class),teacherId); 31 if(t!=null){ 32 //查学生信息 33 // String sql = "select * from students where id in (select s_id from teachers_students where t_id=?)"; 34 // String sql = "select s.* from students s,teachers_students ts where s.id=ts.s_id and ts.t_id=?"; 35 String sql = "select s.* from students s inner join teachers_students ts on s.id=ts.s_id where ts.t_id=?"; 36 List<Student> students = qr.query(sql, new BeanListHandler<Student>(Student.class), teacherId); 37 t.setStudents(students); 38 } 39 return t; 40 } catch (SQLException e) { 41 throw new RuntimeException(e); 42 } 43 } 44 45 }
一对一
一个人对应一个身份证案例
建表
create table persons( id int primary key, name varchar(100));create table idcards( id int primary key, num varchar(18), constraint person_id_fk foreign key (id) references persons(id));
封装JavaBean
public class Person implements Serializable { private int id; private String name; private IdCard idCard;
.
public class IdCard implements Serializable { private int id; private String num; private Person person;
测试
1 public class PersonDaoImplTest { 2 private PersonDao dao = new PersonDaoImpl(); 3 @Test 4 public void testAddPerson() { 5 Person p1 = new Person(); 6 p1.setId(1); 7 p1.setName("代佩孜"); 8 9 IdCard ic = new IdCard(); 10 ic.setId(100);//无效 11 ic.setNum("1101010101"); 12 13 p1.setIdCard(ic); 14 dao.addPerson(p1); 15 } 16 17 @Test 18 public void testFindPerson() { 19 Person p = dao.findPerson(1); 20 System.out.println(p); 21 System.out.println(p.getIdCard()); 22 } 23 24 }
Dao实现
1 public class PersonDaoImpl implements PersonDao { 2 private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); 3 @Override 4 public void addPerson(Person p) { 5 try { 6 qr.update("insert into persons(id,name) values (?,?)", p.getId(),p.getName()); 7 IdCard ic = p.getIdCard(); 8 if(ic!=null){ 9 qr.update("insert into idcards(id,num) values (?,?)", p.getId(),ic.getNum()) ; 10 } 11 } catch (SQLException e) { 12 throw new RuntimeException(e); 13 } 14 } 15 //查询人的基本信息,关联的IdCard要不要查?关联的少的一方就查 16 public Person findPerson(int personId) { 17 try { 18 Person p = qr.query("select * from persons where id=?", new BeanHandler<Person>(Person.class), personId); 19 if(p!=null){ 20 IdCard ic = qr.query("select * from idcards where id=?",new BeanHandler<IdCard>(IdCard.class), personId); 21 p.setIdCard(ic); 22 } 23 return p; 24 } catch (SQLException e) { 25 throw new RuntimeException(e); 26 } 27 } 28 29 }
- J2EE进阶之JDBC工具类DbUtils使用 二十
- JDBC : 使用DBUtils 工具类
- JDBC之DbUtils工具
- JDBC(十)使用 DBUtils
- 开源JDBC工具类之DbUtils解析
- JDBC-DBUtils工具类
- JDBC( 十)减轻JDBC,dbutils使用
- JDBC之数据库连接的java配置工具类dbUtils
- JDBC相关(三):DButils工具类的使用详解
- DbUtils component学习使用(jdbc封装工具)
- 使用commons-dbutils简化JDBC操作(二) dbutils+反射
- J2EE进阶之CSS 二
- JDBC(12)—DBUtils工具类
- J2EE进阶之ajax和JSon使用 二十三
- JDBC工具-DBUtils
- J2EE进阶之JDBC简介 十六
- J2EE进阶之JDBC数据库连接池 十九
- J2EE进阶之Response 和Request 十
- VM虚拟机和windows的共享设置
- 关于数据库删除列等
- 日常训练-2016Multi-university第十场
- Kubernetes初探
- 电子邮件.NET控件MailBee.NET Objects使用指南合集(下)
- J2EE进阶之JDBC工具类DbUtils使用 二十
- 防火墙
- Agile&Lean 学习笔记(一)什么是SCRUM
- 4992: [Usaco2017 Feb]Why Did the Cow Cross the Road
- Spring@Autowired注解与自动装配
- 亚稳态以及测试逻辑实现
- windows下RNDIS/Ethernet Gadget device驱动安装
- NSIS 静默安装 以及 在安装软件时检测软件是否启动
- 每日一则JavaWeb---Spring的ResourceLoader的作用