发表于: 2020-11-02 23:54:07

1 1321


今天完成的事情:

使用debug模式跟踪源码,发现append  最终的结果是将null转化成字符串,递增,输出count=4,length() 方法用于返回字符串的长度,所以第一个结果输出4,用debug跟踪stringBuffer,在第二段源码发现,为空就抛出异常。




spring整合mybatis,和不用实现类的mybatis



需要用到实现类方式:在spring-config中引入db.properties连接数据库,加载SqlSessionFactoryBean配置,之后加入mybatis的配置文件SqlMapConfig.xml,供其加载mybatis的初始化数据,并映射StudentMapper.xml文件,导入sql语句,最后引入实现类StudentDaoImpl。StudentDaoImpl类中有sqlSession对象,sqlSession的作用是操作数据库(实现增删改查),在这里sqlSession对象执行了selectOne方法

通过id获取两个数据。


~ mapper中的namespace是用来绑定dao接口的,即面向接口编程。

~ 当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句

~ 在同一次请求中不允许出现相同名称的方法、类和常量,但是在某些特殊的应用中必须要使用相同名称的方法、类和常量,需要把他们放到不同的空间里,这个空间就是命名空间。

~ 命名空间主要是为了解决命名冲突问题

~ 确保方法名称的唯一性,如果两个xml文件中的方法名一样,那么就用namespace区分

了解了一下在mapper代理中,namespace的作用

最下面是mapper代理的配置,作用:扫描包的路径和sqlSessionFactory对象。




不使用mapper代理:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!--    加载配置文件-->
   <context:property-placeholder  location="classpath:db.properties" />



<!--  数据源,使用DBCP  -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
         destroy-method="close">
       <property name="driverClassName" value="${jdbc.driver}"/>
       <property name="url" value="${jdbc.url}"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
       <property name="maxActive" value="10"/>
       <property name="maxIdle" value="5"/>

   </bean>

<!--  sqlSessionFactory  -->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--    加载MyBatis的配置文件    -->
       <property name="configLocation" value="SqlMapConfig.xml"/>
<!--     数据源   -->
       <property name="dataSource" ref="dataSource"/>
   </bean>

<!--  原始DAO接口  -->
   <bean id="studentDao" class="com.jnshu.Dao.StudentDaoImpl">
       <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
   </bean>

   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <!-- 指定扫描的包名
           如果扫描多个包,每个包中间使用半角逗号分隔 -->
       <property name="basePackage" value="com/jnshu/Mapper"/>
       <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
   </bean>

</beans>

mapper代理

不用实现类的mybatis

在接口中直接定义方法

JDBC不使用db.properties:

JDBC使用db.properties:

创建一个JDBC工具类,使用ClassLoader加载Properties配置文件。然后在java程序中导入这个包

package Util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
* JDBC工具类
*/

public class JDBCUtils {
private static String url;
   private static String user;
   private static String password;
   private static String driver;
   /**
    * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
    */
   static {
//读取资源文件,获取值


       try {
//1.创建Properties集合类
           Properties pro = new Properties();

           //获取src路径下的文件的方式--->ClassLoader 类加速器
           ClassLoader classLoader = JDBCUtils.class.getClassLoader();
           URL res = classLoader.getResource("jdbc.properties");
           String path = res.getPath();
           System.out.println(path);

           //2.加载文件
         //  pro.load(new FileReader("src/yewubiao.properties"));
           pro.load(new FileReader(path));

           //3.获取数据,赋值
           url = pro.getProperty("ur1");
           user = pro.getProperty("user");
           password = pro.getProperty("password");
           driver = pro.getProperty("driver");
           //4.注册驱动
           Class.forName(driver);
       } catch (IOException e) {
e.printStackTrace();
       } catch (ClassNotFoundException e) {
e.printStackTrace();
       }
}

/**
    * 获取连接
    * @return   连接对象
    */

   public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
   }

/**
    * 释放资源
    * @param stmt
    * @param conn
    */

   public static void close(Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
           } catch (SQLException throwables) {
throwables.printStackTrace();
           }
}

if (conn != null) {
try {
stmt.close();
           } catch (SQLException throwables) {
throwables.printStackTrace();
           }
}

}

/**
    * 释放资源
    * @param stmt
    * @param conn
    */
   public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs != null) {
try {
rs.close();
           } catch (SQLException throwables) {
throwables.printStackTrace();
           }
}

if (stmt != null) {
try {
stmt.close();
           } catch (SQLException throwables) {
throwables.printStackTrace();
           }
}

if (conn != null) {
try {
stmt.close();
           } catch (SQLException throwables) {
throwables.printStackTrace();
           }
}
}
}


package jdbc;


import JDBCTest.emp;
import Util.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
*/


public class TestJDBC7 {

public static void main(String[] args){
List<emp> list = new TestJDBC7().findAll2();
       System.out.println(list);
       System.out.println(list.size());
   }


/**
    * 演示JDBC的工具类
    * @return
    */
   public List<emp> findAll2() {
Connection conn = null;
       Statement stmt = null;
       ResultSet rs = null;
       List<emp> list = null;
       try {
//            //1.注册驱动
//            Class.forName("com.mysql.jdbc.Driver");
//            //2.获取连接
//            try {
//                conn = DriverManager.getConnection("jdbc:mysql:///yewubiao","root","wsj199599");
           conn = JDBCUtils.getConnection();
           //3.定义sql
               String sql = "select * from emp";
               //4.获取执行sql的对象
               stmt = conn.createStatement();
               //5.执行sql
               rs = stmt.executeQuery(sql);
               //6.遍历结果集,封装对象,装载集合
               emp emp = null;
               list = new ArrayList<emp>();
               while (rs.next()){
//获取数据
                   int id = rs.getInt("id");
                   String ename = rs.getString("ename");
                   int job_id = rs.getInt("job_id");
                   int mgr =rs.getInt("mgr");
                   Date joindate = rs.getDate("joindate");
                   double bonus = rs.getDouble("bonus");
                   int dept_id = rs.getInt("dept_id");
                   emp = new emp();
                   emp.setId(id);
                   emp.setEname(ename);
                   emp.setJob_id(job_id);
                   emp.setMgr(mgr);
                   emp.setJoindate(joindate);
                   emp.setBonus(bonus);
                   emp.setDept_id(dept_id);

                   //装载集合
                   list.add(emp);
               }
} catch (SQLException throwables) {
throwables.printStackTrace();
           }
finally {
//            if (rs !=null){
//                try {
//                    rs.close();
//                } catch (SQLException throwables) {
//                    throwables.printStackTrace();
//                }
//            }
//            if (stmt !=null){
//                try {
//                    rs.close();
//                } catch (SQLException throwables) {
//                    throwables.printStackTrace();
//                }
//            }
//            if (conn !=null){
//                try {
//                    rs.close();
//                } catch (SQLException throwables) {
//                    throwables.printStackTrace();
//                }
//            }

           JDBCUtils.close(rs,stmt,conn);
       }
return list;


   }
}



明天计划的事情:

继续重做任务一



遇到的问题:

解决了


收获:

熟悉DEBUG,spring+mybatis,JDBC




返回列表 返回列表
评论

    分享到