发表于: 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,首先以输入流的形式加载 xml
- 2,以 “SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession” 的流程最后构建出 SqlSession。
- 3,通过 SqlSession 获取 UserMapper 接口,再调用该接口的数据操纵方法。
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&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 ,经过师兄查看发现是路径的书写格式有问题,应该是 / 而不是 . 。
四:思考总结
只有认真对比各种实现方式之后才能发现之间的差别和联系,弄清楚了也就好了
评论