mybatis-config.xml(配置文件)
SqlSessionFactory:主要用于创建SqlSession,相当于整个数据库在内存中的镜像,所以说在一个项目中只能有一个工程。采用单利模式创建对象即可完成只有一个工厂类的操作。
SqlSession:应用层与持久层进行交互的(执行sql语句) 在一个项目当中SqlSession可以有多个,每当执行sql操作时就应当创建一个Sqlsession,执行完毕后最后关闭释放资源即可。可以创建一个工具类哦
(1)Sqlssion中的一些重要方法
? configuration标签中的子标签一定要按照顺序来写properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environment-s,databaseIdProvider,mappers
properties:是一个配置属性的元素,通常用于将内部的标签外在化。将四个连接数据库的串单独放到一个配置文件中进行编辑(db.properties)以键值对的方式来进行创建。在mybatis的配置文件中导入db.properties
<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:一些标签的开关可以再次标签中进行设置
typeAliases:可以定义别名,在mapper映射文件中可以直接使用别名
<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的数据类型之间的转换
environments:是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境ID。其中<enviroment>是它的子元素,可以定义多个,其中ID属性用于表示所定义环境的ID值。在子标签中包含事务管理和数据源的配置信息,其中transactionManager 元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪个事务管理器;dataSource元素用于配置数据源,他的type属性用于指定使用哪种数据源。
在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>
原文:https://blog.51cto.com/15079589/2650749