发表于: 2017-06-08 21:34:23

2 1012


【说明】今天把昨天计划写的东西给弄得差不多了,比如spring + mybatis的xml版本和注解版本。

一:今日完成

1)maven项目中mybatis使用步骤:

先是配置pom文件

       <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.2.8</version>
                   </dependency>

然后创建pojo(model,entity):对应数据库的表的字段

创建java对象和数据库之间的映射文件

     <mapper namespace="命名空间">
                 <select id="selectStuById" parameterType="int" resultType="返回类型">
                 <!-- 底层的 SQL 语句 -->
                 select * from stu where id=#{stuid}
                 </select>
             </mapper>

创建mybatis的配置文件,注册数据库和前面定义的 映射文件

 <!-- 注册对象的空间命名 -->
                 <environments default="development">
                 <environment id="development">
                 <transactionManager type="JDBC"/>
                 <dataSource type="POOLED">
                 <!-- 1. 加载数据库驱动:oracle.jdbc.driver.OracleDriver -->
                 
<property name="driver" value=""/>
                 <!-- 2. 数据库连接地址:oracle.jdbc.driver.OracleDriver -->
                 
<property name="url" value=""/>
                 <!-- 数据库用户... -->
                 
<property name="username" value=""/>
                 <!-- 数据库密码... -->
                 
<property name="password" value=""/>
                 </dataSource>
                 </environment>
                 </environments>

      <mappers>

                 <!-- 注册映射文件:java 对象与数据库之间的 xml 文件路径! -->

       <mappers>
                 </configuration>

既然有了配置的 xml,下一步就需要让 Mybatis 加载它了。

  1. 1,首先以输入流的形式加载 xml
  2. 2,以 “SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession” 的流程最后构建出 SqlSession。
  3. 3,通过 SqlSession 获取 UserMapper 接口,再调用该接口的数据操纵方法。
代码如下:(省略sqlSessionFactory的生成代码)

public void testQueryById()  throws Exception{

Stu stu = null;

SqlSession session = sqlSessionFactory.openSession();

try {

/* Un-recommended Method */

/*

* stu = (Stu)session.selectOne(

* "com.nicchagil.mybatisonly.mapper.UserMapper.queryUser",username);

*/

/* Recommended Method */

StuDAO stuDAO = session.getMapper(StuDAO.class);

stu = stuDAO.queryById(1);

System.out.println("id - " + stu.getId() + " , name - " + stu.getName());

} catch (SQLException e) {

e.printStackTrace();

} finally {

session.close();

}

}

结果运行良好

2)使用spring + mybatis 的基本开发流程

先去pom里面配置一下

<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>

然后是通过 applicationContext-mybatis.xml  配置关于 Mybatis 数据源的信息。

需要 配置

1,注册数据源

2,注册 sqlSessionFactory,需指定 sqlSessionFactory 所引用的数据源

3,在哪些 package 下扫描 Mapper 接口,即 DAO 接口

除了 Mybatis 的信息,还有一些 Spring 的信息需要配置:

1,注册 dao(mapper)接口 bean

2,引用 sqlSessionFactory

下面是详细的配置文件

    <!-- JDBC Data Source -->

 <!--    注册数据源,常见的有 JDBC 或 JNDI -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url"

value="jdbc:mysql://localhost:3306/db_abbey?useUnicode=true&amp;characterEncoding=UTF-8" />

<property name="username" value="root" />

<property name="password" value="698970s" />

    </bean>

    

    <!-- JNDI Data Source -->

 <!--    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

        <property name="jndiName">

            <value>JNDI_TEST_DB</value>

        </property>

    </bean> -->

    

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->

<!-- 注册 sqlSessionFactory -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <!-- 自动取对应包中不包括包名的简单类名作为包括包名的别名。 -->

    <property name="typeAliasesPackage" value="com.ljl.study.entity" />

   <!-- sqlSessionFactory 是用来生产 sqlSession 以操作数据库的,所以,需指定 sqlSessionFactory 所引用的数据源 -->

        <property name="dataSource" ref="dataSource" />

   <!--    表示我们的 Mapper 文件存放的位置,当我们的 Mapper 文件跟对应的 Mapper 接口处于同一位置的时候可以不用指定该属性的值。 -->

        <property name="mapperLocations" value="classpath:com/ljl/study/dao/StuDAO.xml"></property>

        <!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->

    </bean>

<!-- DAO接口定义成bean,并且交由spring管理 -->

    <bean id="stuDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">

        <property name="mapperInterface" value="com.ljl.study.dao.StuDAO" />

        <property name="sqlSessionFactory" ref="sqlSessionFactory" />

    </bean>

再看 junit单元测试

/**

* 查询所有学员信息

*/

@Test

public void testQueryAll() {

AbstractApplicationContext ctx=null;

ctx=new ClassPathXmlApplicationContext("classpath:applicationContext-mybatis.xml");

StuDAO stuDAO=(StuDAO) ctx.getBean("stuDAO");

 

List<Stu> all = new ArrayList<Stu>();

try {

System.out.println(stuDAO);

all=stuDAO.queryAll();

for (int i = 0; i < all.size(); i++) {//遍历集合

   System.out.println(all.get(i).toString());

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

ctx.close();

}

}

运行结果良好
3)再采用 基于 注解的方法去尝试

和第二条不一样的地方有一个地方

<!-- DAO接口所在包名,Spring会自动查找其下的类 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="com.ljl.study.dao" />

<property name="sqlSessionFactoryBeanName"  value="sqlSessionFactory"></property>  

</bean>  

对,就是这里!其它都一样

再看测试代码

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class SpringMybatisUseAnnotationTest {

@Autowired

    private StuDAO stuDAO;

 

    @Test

    public void testQueryById() {

    Stu stu = new Stu();

    try {

stu = stuDAO.queryById(1);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

  System.out.println(stu);

    }

运行结果良好

二:明日计划

任务二和三再次重构一遍!

三:疑难问题

【问题】中间junit单元测试有报错说是不能加载mapper.xml ,经过师兄查看发现是路径的书写格式有问题,应该是   / 而不是  .     。

四:思考总结

只有认真对比各种实现方式之后才能发现之间的差别和联系,弄清楚了也就好了


返回列表 返回列表
评论

    分享到