【Java工程师之路】[2-4.2]JDBC编程

一、JDBC的理论概述
JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。
J2SE的一部分,由java.sql,javax.sql包组成。
关系图:
   [应用程序]--[JDBC]--[MySQL Driver]--[MySQL]

二、连接数据库步骤
1、注册驱动(只做一次)(DriverManager)
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver");//推荐方式

2、建立连接(Connection)
String url = "jdbc:mysql://localhost:3306/jdbc";
//url格式:jdbc:子协议:子名称//主机名:端口/数据库名?属性名=属性值&...
String name = "root";
String password = "";
Connection conn =  DriverManager.getConnenctiong(url,user,password);

3、创建执行SQL的语句(Statement)
Statement st = conn.createStatement();
//PreparedStatement的应用

4、执行语句(ResultSet)
ResultSet rs = st.executeQuery("select * from user");
//int numok = st.executeUpdate(sql);

5、处理执行结果
while(rs.next()){
  rs.getObject(1);
  rs.getObject(2);
  ...
}

6、释放资源
rs.close();
st.close();
conn.close();
//尽量晚建立,尽量早关闭

三、连接数据库步骤分解
Base.java
JdbcUtils.java(JdbcUtilsSing.java)
CRUD.java
SQLinject.java//PreparedStatement

四、JDBC中的数据类型(日期问题、大段文本数据、二进制类型的数据)
详见Java.sql.Types
1、常见类型String、int、float等;
2、时间类型(DATE)Date、(TIME)Time、(TIMESTAMP)Datetime;
3、大段文本数据--字符(CLOB)text、character--char[];
4、二进制类型的数据--字节(BLOB)blob、binary--byte[];

五、DAO模式--DAO对象(数据访问对象)
1、业务逻辑层--》Domain对象(领域对象)《--数据访问层
单独放在Domain对象包中,一般都是实体对象,与数据库表也有对应关系。
2、(业务逻辑)DAO接口--》《--DAOImpl实现(数据访问)_ _异常处理用RuntimeException继承类封装
3、使用DAO工厂模式(代码超经典)--工厂模式ABSTRACT FACTORY
//DaoFactory类--单例模式
public class DaoFactory {
    private static UserDao userDao = null;
    private static DaoFactory instance = new DaoFactory();

    private DaoFactory() {
        try {
                        //properties文件
            Properties prop = new Properties();
            InputStream inStream = DaoFactory.class.getClassLoader()
                    .getResourceAsStream("daoconfig.properties");
            prop.load(inStream);
                        //反射加载类,并获得实例
            String userDaoClass = prop.getProperty("userDaoClass");
            Class clazz = Class.forName(userDaoClass);
            userDao = (UserDao) clazz.newInstance();//DAOImpl实现
        } catch (Throwable e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static DaoFactory getInstance() {
        return instance;
    }

    public UserDao getUserDao() {
        return userDao;
    }
}

六、事务
1、事务的概念与JDBC事务处理
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
2、事务的保存点处理
Savepoint sp = null;
sp = conn.setSavepoint();
if (conn != null && sp != null) {
   conn.rollback(sp);
   conn.commit();
}
3、JTA分布式事务的简要介绍
4、事务的隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

七、存储过程
存储过程的调用:
CallableStatement cs = null
String sql = "{ call addUser(?,?,?,?)}";
cs = conn.prepareCall(sql);
cs.registerOutParameter(4,Types,INTEGER);
cs.setString(1,"ps name");
cs.setDate(2,new java.sql.Date(System.currentTimeMillis()));
cs.setFloat(3,100f);

八、批处理
ps.addBatch();
ps.executeBatch();

九、可滚动结果集与分页技术,可更新和对更新敏感的结果集
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs.nest();
rs.previous();
rs.absolute(5);//绝对定位
//有很多定位方法可以使用。可以实现效率很低的分页。
//支持分页技术的mySQL:“limit 150 10”,从150条开始取10条。

十、元数据信息
1、数据库的元数据信息
DatabaseMetaData dbmd = conn.getMetaData();
2、参数的元数据信息
//read(String sql,Object[] params)
ps = conn.prepareStatemnet(sql);
//ParamterMetaData pmd = ps.getParamterMetaData();
//int count = pmd.getParameterCount();//参数的个数
for (int i = 1; i <= params.length; i++) {
    // System.out.print(pmd.getParameterClassName(i) + "\t");
    // System.out.print(pmd.getParameterType(i) + "\t");
    // System.out.println(pmd.getParameterTypeName(i));
    ps.setObject(i, params[i - 1]);
}
rs = ps.executeQuery();
3、利用结果集元数据将查询结果封装为map
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
    // System.out.print(rsmd.getColumnClassName(i) + "\t");
    // System.out.print(rsmd.getColumnName(i) + "\t");
    // System.out.println(rsmd.getColumnLabel(i));
    colNames[i - 1] = rsmd.getColumnLabel(i);
}
List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
while (rs.next()) {
    Map<String, Object> data = new HashMap<String, Object>();
    for (int i = 0; i < colNames.length; i++) {
        data.put(colNames[i], rs.getObject(colNames[i]));
    }
    datas.add(data);
}
return datas;

十一、反射技术
//由类Class构造类的实例Object,调用类的方法Method,类的属性Field,@声明Annontation。
//ORM对象关系映射(利用Java反射技术将查询结果封装为对象),由Domain类和SQL得到类的实例(Domain对象)。

十二、连接池,数据源DataSource
1、编写一个基本的连接池来实现连接的复用//DataSource原理
2、对基本连接池进行一些工程细节上的优化//
3、通过代理模式来保持用户关闭连接的习惯//重写closs方法
4、Java的动态代理及使用该技术完善连接代理//重写closs方法
5、标准DataSource接口及数据源的总结介绍
6、如何使用开源项目DBCP(实际项目中常用)
使用DBCP必须用的三个包:
commons-dbcp-1.2.1.jar, commons-pool-1.2.jar, commons-collections-3.1.jar。
配置参数。
Java API: BasicDataSourceFactory.createDataSource(properties); 

十三、优化JDBC代码,操作数据级别
1、将DAO中的修改方法提取到抽象父类中(增删改)
2、使用模板方法设计模式处理DAO中的查询方法(查)---模板方法模式Template Method
3、使用策略模式对模板方法设计模式进行改进---策略模式Strategy
*Spring框架中提供了一个JdbcTemplate工具类,JdbcTemplate类对JDBCAPI进行了很好的封装,这个类就像我们自己对JDBC进行封装一样,只是代码更健壮和功能更强大而已。我们以后在实际项目中可以使用JdbcTemplate类来完全替代直接使用JDBCAPI,这与直接使用JDBCAPI没有太大的性能区别。使用JdbcTemplate类需要额外从spring开发包中导入spring.jar和commons-logging.jar包。
4、使用JdbcTemplate工具类简化对象查询
static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());//绑定数据源;
//jdbc.queryForObject方法;
List users = jdbc.query(sql, args, argTypes, new BeanPropertyRowMapper(User.class));//jdbc.query方法;
//jdbc.queryForInt方法;
//jdbc.queryForMap方法;
//jdbc.queryForList方法;
5、使用JdbcTemplate完成数据库修改和其他功能
jdbc.update方法,更新public int update(String sql,Object[] args)。
jdbc.execute方法,插入数据并获得结果:public Object execute(ConnectionCallback action)。
6、使用支持命名参数的JdbcTemplate
static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(JdbcUtils.getDataSource());
//绑定数据源;
//支持命名参数:bean属性特性。
7、使用SimpleJdbcTemplate和泛型技术简化代码
//泛型:类型也是变量了<T> T method(String name,Class<T> clazz),
//可变长度参数:参数的个数可变<T> T method(String name,Class<T> clazz,Object... args),
8、使用JdbcTemplate实现DAO和用工厂灵活切换实现

你可能感兴趣的:(【Java工程师之路】[2-4.2]JDBC编程)