3.5 MyBatis框架的核心构件
框架的核心构件(这个图要看懂)
1).SqlMapConfig.xml配置文件:它是MyBatis的全局配置文件(名称是不固定的),其中配置了数据源、事务等MyBatis的运行环境。
2).映射文件(mapper.xml):配置sql语句。
3).SqlSessionFactory(会话工厂):根据配置文件创建工厂,作用是为了创建SqlSession对象
4).SqlSession(会话对象):是面向程序员的接口,作用是向数据库发出sql语句(增、删、改、查)。
5).Executor(执行器):它是一个接口,是SqlSession内部真正操作数据库的对象。
6).mapped Statement(底层封装对象):对操作数据库存储封装,包括sql语句、输入参数、输出结果类型等。输入参数包括:java数据类型、hashmap和自定义pojo类型。输出结果类型包括:java数据类型、hashmap和自定义pojo类型。
? ? ?PreparededStatement对象里面用的占位符, #{}
ResultSet 里面的每一行的每一个列的值要和每一个java对象中的每一个属性要对应起来。
下载MyBatis框架(Mybatis 3.5)其中:mybatis-3.5.0.jar是核心包,pdf是操作手册,lib目录下的是依赖包。
(1) 在Eclipse(Java EE版本的Eclipse)下创建一个动态web工程。
(2) 导入核心包 mybatis-3.5.0.jar和lib目录下的所有jar文件。
(3) 导入MySQL数据库的驱动包。
(4) 选中工程,创建一个config目录(Source Folder),在其中创建log4j.properties配置文件,内容如下:log4j.rootLogger = debug,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
- 在config目录下,创建SqlMapConfig.xml文件
- 在config目录下创建一个sqlmap目录,其中存放映射文件。
4.4 创建SqlMapConfig.xml文件内容
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合后 environments将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/db_mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="oyhj"/>
</dataSource>
</environment>
</environments>
</configuration>
4.5 创建数据库、表以及对应的实体类
在MySQL中创建一个名为db_mybatis的数据库。
在该数据库中创建一个t_user表,表中内容如下,并自行输入若干条记录。
创建对应的实体类UserInfo,代码略。
4.6创建实体类对应的映射文件(查询单一实体)
映射文件命名:
- 原始的MyBatis的命名方式:例如User.xml。
- Mapper代理的命名方式:XXXMapper.xml,例如UserMapper.xml
创建User.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- namespace是命名空间, 作用是对sql进行分类化管理-->
<!-- 如果使用mapper代理的方式进行开发,namespace会有特殊的作用-->
<mapper namespace="test">
<!-- 在映射文件中会配置很多sql语句,通过select标签执行数据库的查询,id:标识映射文件中的sql语句
由于将sql语句封装到mappedStatement对象中,所以id也称作statement的id
parameterType:输入参数的类型 #{}表示一个占位符
.#{id}:其中id表示接收参数的名称,如果参数类型是基本数据类型,名称可以随意
resultType:指定sql查询结果所输出的java对象类型
-->
<select id="findUserById" parameterType="int" resultType="cn.xync.pro.entity.UserInfo">
select * from userinfo where id=#{id}
</select>
</mapper>
在SqlMapConfig.xml文件中加载映射文件:
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
5.7 单体测试
@Test
public void findUserById() throws IOException
{ //MyBatis主配置文件
String resource="SqlMapConfig.xml";
//得到配置文件流
InputStream input=Resources.getResourceAsStream(resource);
//创建会话工厂对象,传入MyBatis配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(input);
//通过工厂对象得到会话对象
SqlSession sqlSession=sqlSessionFactory.openSession();
/*通过sqlSession操作数据库
selectOne方法的第一个参数是映射文件中的statement的id值:spacename+"."+id值
selectOne方法的第二个参数是和parameterType类型对应的值
selectOne方法的返回值和ResultType类型对应*/
UserInfo user=sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
//关闭sqlSession对象
sqlSession.close();
}
我在创建对象的时候没有在数据库和session对象里面把所有属性一一对应导致在查询的时刻始终查不到对象,最后在检查过后修改了mysql的表里的属性,让元素一一对应起来,最后成功查询到,正确代码如上.