1.Mybatis是干什么的?解决了什么问题?有什么好处?
答:它是一款轻量级的持久层框架,支持了定制化Sql,存储过程和高级映射。Mybatis避免了所有jdbc代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XMl或注解来配置和映射原生信息,将接口和Java的pojos映射成数据库中的记录。
2. 如何安装mybatis
使用 MyBatis,只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
3.mybatis使用的流程,实现的流程?
1核心配置文件:xml文件,全局的配置文件,放到maven项目下的resources中,或者web项目下的src, 在这里我们要配置数据源,事务的处理,加载其他的mapper配置文件。
简单实例:
//头文件
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载属性文件 -->
<propertiesresource="db.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!--<property name="jdbc.driver" value=""/> -->
</properties>
<!--全局配置参数,需要时再设置 -->
<!--<settings>
</settings>-->
<!--和spring整合后 environments配置将废除-->
<environmentsdefault="development">
<environmentid="development">
<!--使用jdbc事务管理,事务控制由mybatis-->
<transactionManagertype="JDBC" />
<!--数据库连接池,由mybatis管理-->
<dataSourcetype="POOLED">
<propertyname="driver" value="${jdbc.driver}" />
<propertyname="url" value="${jdbc.url}" />
<propertyname="username" value="${jdbc.username}" />
<propertyname="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--加载 映射文件 -->
<mappers>
<mapper resource="mapper/User.xml"></mapper>
</mappers>
</configuration>
2创建一个sqlsessionfactory,用于解析配置文件,例如我们在测试类中,可以对配置文件进行解析
String resource = "SqlMapConfig.xml";
//如何对配置文件resouce读取解析
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybati的配置信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3我们要通过上面得到的session.factory获取sqlsession
然后创建一个sqlsession(会话,是一个写好的接口,是一个执行器)
SqlSession sqlSession =sqlSessionFactory.openSession();
4执行器调用数据库的操作是增删改查 (可以将重复的操作放到缓存中)
sqlSession.update,insert,delete,select等操作
5mapper statement(底层对象的封装)对底层数据库进行操作,用到一些输入参数,输出参数,在映射文件中,namespace叫命名空间,是对sql进行分类化管理,管理sql
<mapper namespace="com.neusoft.dao.UserMapper">
<select id="findUserById" parameterType="int"resultType="com.neusoft.bean.User">
SELECT * fromuser where id=#{value};
</select>
</mapper>
3继续整合,还是不够好,非常复杂?
基于接口的实现
写一个UserMapper的接口,与UserMapper.Xml文件映射,映射的方式即为namespace等改为接口的地址
<mappernamespace="com.neusoft.dao.UserMapper">
<selectid="findUserById"中id必须与接口中方法名一样,
在测试类中, UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
用sqlsession.getMapper();加载接口,基于反射机制。还没有很懂。
4优化
为为实体类定义别名,简化sql映射xml文件中的引用
在mapper.xml中按如下的写:
<select id="findUserById" parameterType="int"resultType="user">
在核心配置文件中:
<typeAliases>
<typeAliastype="com.neusoft.bean.User"alias="user"></typeAlias>
</typeAliases>
注意:namespace 不能那么写
<typeAliases>
<package name=" com.neusoft.bean"/>
</typeAliases>
com.neusoft.bean.User这个实体类的别名就会被设置成User
5解决字段名和实体类属性名不相同的冲突,数据表里第一个字段为order_id,
实体类id
<!--
根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
-->
<select id="getOrderById"parameterType="int"
resultType="me.gacl.domain.Order">
select * from orders whereorder_id=#{id}
</select>
<!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
-->
<selectid="selectOrder" parameterType="int"
resultType="me.gacl.domain.Order">
select order_idid, order_no orderNo,order_price price from orders where order_id=#{id}
</select>
<!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<selectid="selectOrderResultMap" parameterType="int"resultMap="orderResultMap">
select * fromorders where order_id=#{id}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMaptype="me.gacl.domain.Order" id="orderResultMap">
<!-- 用id属性来映射主键字段-->
<idpropertyid" column="order_id"/>
<!-- 用result属性来映射非主键字段-->
<resultproperty="orderNo" column="order_no"/>
<resultproperty="price" column="order_price"/>
</resultMap>