mybatis-config.xml(配置文件)html
SqlSessionFactory:主要用于建立SqlSession,至关于整个数据库在内存中的镜像,因此说在一个项目中只能有一个工程。采用单利模式建立对象便可完成只有一个工厂类的操做。java
SqlSession:应用层与持久层进行交互的(执行sql语句) 在一个项目当中SqlSession能够有多个,每当执行sql操做时就应当建立一个Sqlsession,执行完毕后最后关闭释放资源便可。能够建立一个工具类哦mysql
(1)Sqlssion中的一些重要方法sql
configuration标签中的子标签必定要按照顺序来写properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environment-s,databaseIdProvider,mappers数据库
properties:是一个配置属性的元素,一般用于将内部的标签外在化。将四个链接数据库的串单独放到一个配置文件中进行编辑(db.properties)以键值对的方式来进行建立。在mybatis的配置文件中导入db.propertiesmarkdown
<properties resource="db.properties"></properties> <!--引入该属性后再<dataSource>标签中value值得地方替换成db.properties中的键名(关键字进行调用。关键字可自定义)--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource>
setting:一些标签的开关能够再次标签中进行设置session
typeAliases:能够定义别名,在mapper映射文件中能够直接使用别名mybatis
<typeAliases> <!-- 设置类型的别名 若是不写alias属性,系统默认的别名为类名的首字母小写--> <!--<typeAlias alias="customer" type="com.ruanyuan.pojo.Customer" />--> <!-- <typeAlias alias="user" type="com.ruanyuan.pojo.User" />--> <!--能够给整个实体类的包进行建立,默认是类名首字母小写--> <package name="com.runayuan.pojo"/> </typeAliases>
typeHandlers:用于数据库的数据类型和java的数据类型之间的转换app
environments:是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境ID。其中<enviroment>是它的子元素,能够定义多个,其中ID属性用于表示所定义环境的ID值。在子标签中包含事务管理和数据源的配置信息,其中transactionManager 元素用于配置事务管理,它的type属性用于指定事务管理的方式,即便用哪一个事务管理器;dataSource元素用于配置数据源,他的type属性用于指定使用哪一种数据源。ide
在mybatis中,能够配置两种类型的事务管理器,分别是JDBC和MANACED。
<environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC" /> <!-- 启动数据链接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
mappers:指定映射文件的具体位置其中第二种方式是只有在使用接口的形式下才可使用
<mappers> <!--第一种--> <mapper resourse="com/mapper/UserMapper.xml"></mapper> <!--第二种使用包名引入--> <package name="com.mapper"/> </mappers>
在将来实际项目开发中,全部的标签都必需要写id属性
select标签中的paramterType属性能够省略不写,resultType属性必须得写。但根据java开发手册中的ORM映射规范来说 不要用 resultClass 当返回参数,即便全部类属性名与数据库字段一一对应,也须要 定义<resultMap>;反过来,每个表也必然有一个<resultMap>与之对应。 说明: 配置映射关系,使字段与 DO 类解耦,方便维护。
因此说最好使用resultMap标签,当使用resultMap标签时,不得使用resultType标签。两个标签只能写一个
<mapper namespace="">
对于<insert><update><delete>这3个标签,一般咱们只写id属性,其余属性一律不写。 在xml中写sql语句时,涉及到传参时要使用#{}的方式。其中的参数名称要和实体类中属性名称保持一致,只有这样在mybatis的ORM映射才能真正的起到做用。
namespace为工做空间,其中的属性都为当前mapper文件的绝对路径例:com.mapper,UserMapper
select:该标签在你执行查询语句时进行使用
<!--id具备惟一性,要将id的名称和接口类中所定义的方法名保持一致 parameterType:传入参数的类型 resultType:返回的数据类型 --> <select id="getCustomerById" parameterType="Integer" resultType="customer"> select <include refid="customerColums"></include> customer where cust_id = #{cust_id} </select>
模糊查询时要用concat拼接。
例如:
<!--paramerType:传入的参数类型,resultType:返回的数据类型--> <select id="getCustomerByName" parameterType="String" resultType="com.xiangyu.pojo.Customer"> select * from customer where cust_name like concat('%',#{value},'%') </select>
若是在查询全部信息时,paramterType为List集合中的泛型的绝对路径
update:执行修改语句时进行使用
delete:执行删除语句时进行使用
insert:执行插入语句时进行使用
在插入数据后想要经过对象获取到该用户id时,一般状况下会获取不到,因此咱们要来使用useGeneratedKeys="true" keyProperty="" 这两个属性来进行配置其中keyProperty中的值为咱们定义的实体类中的数据库的主键名称。
<!-- 插入语句 数据库能够实现自动增加时 --> <insert id="isnertCustomer" parameterType="customer" useGeneratedKeys="true" keyProperty="custId"> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) </insert> <!-- 插入语句,数据库不会实现自动增加时 --> <insert id="isnertCustomer" parameterType="customer"> <selectKey keyProperty="cust_id" resultType="Integer" order="BEFORE"> select if(max(cust_id) is null,1,max(cust_id)+1) as newId from customer </selectKey> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) </insert>
(1)resultMap
有的时候在建立数据库中的字段时两个单词之间会用‘__’进行链接,但在定义java实体类中的属性值时一般喜欢使用驼峰命名法来命名两个单词,而正由于如此在mybatis中orm映射机制会因为实体类中的属性值和数据库中字段的值不一致而致使映射失败,传值无效报错
解决方法:(1)在mybatis的配置文件中(mybatis-config.xml)
<!--configuration标签中的settings标签进行全局设置--> <!--在一般状况下,java中的实体类中的属性通常是采用驼峰命名命名的,而数据库中表的字段则用下划线区分字母。在这种状况下,Mybatis提供了一个全局属性mapUnderscoreToCamelCase来解决二者名字不一致的问题。--> <setting name="mapUnderscoreToCamelCase" value="true" />
(2)也能够直接使用上文所说起到的resultMap进行自定义映射(important)
<resultMap id="BaseResultMap" type="com.ruanyuan.pojo.User"> <!--主键--> <id column="user_id" jdbcType="BIGINT" property="userId" /> <!--columu:数据库中的字段名,jdbctype:字段的数据类型,property:你在实体类中本身定义的一个实体类属性名称--> <result column="user_code" jdbcType="VARCHAR" property="userCode" /> <result column="user_name" jdbcType="VARCHAR" property="userName" /> <result column="user_password" jdbcType="VARCHAR" property="userPassword" /> <result column="is_state" jdbcType="CHAR" property="state" /> </resultMap>
一个实体类对应一个mapper.xml文件,实体类的名称和mapper的名称保持一致,sql语句写到mapper.xml文件z中,将mybatis-config配置文件放在根目录下,在该文件中进行链接数据库操做。而且还要映射有sql语句的mapper.xml文件。
(2)Sql元素:在一个映射文件中,一般须要定义多条sql语句,这些sql语句的组成可能有一部分是相同的
若是每个sql语句都重写一遍相同的部分,那势必会增长代码量,致使映射文件过于臃肿
此时就须要使用sql元素将SQL语句中的相同的组成部分抽取出来,而后在须要的地方用<include>标签进行插入便可。
<sql id="Base_Column_List"> user_id, user_code, user_name, user_password, is_state, create_time, update_time </sql> <select id="selectByPrimaryKey" parameterType="Integer" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from login_user where user_id = #{userId} </select>