mybatis(一)

mybatis简介

MyBatis是一个ORM的数据库持久化框架,主要用来操作数据库,ORM:对象关系映射
操作数据库:
jdbc:执行效率高,开发效率低,自己手动写sql,重复代码多,所以性能高,开发效率低
jpa:是对jdbc的封装,开发效率高,执行效率低,直接调用api就可以完成对应的crud操作,故而开发效率高,但是sql语句不是自己写的,我们不能很好的控制,所以执行效率低
mybatis:是两者特点的结合,开发效率比jdbc高,执行效率比jpa高,消除了重复代码,是自己手动写sql语句

使用步骤

1.导入对应的jar包
在这里插入图片描述
2.编写mybatis的核心配置文件

<?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>
 <!--引入jdbc.propeties文件-->
    <properties resource="jdbc.properties" />

	<!-- 环境们 (很多环境的意思)
		default:默认使用哪一个环境(必需对应一个环境的id)
	 -->
    
	<environments default="development">
		<!-- 
			一个环境  id:为这个环境取唯一一个id名称
		-->
		<environment id="development">
			<!--  
				事务管理   type:JDBC(支持事务)/MANAGED(什么都不做)
			-->
			<transactionManager type="JDBC" />
			<!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池 -->
			<dataSource type="POOLED">
				<!-- 连接数据库的参数 导入properties文件后,value值可以简写-->
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql:///mydb" />
				<property name="username" value="root" />
				<property name="password" value="admin" />
			</dataSource>
		</environment>
	</environments>
   <!-- 这个mappers代表的是相应的ORM映射文件 -->
	<mappers> 
		<mapper resource="cn/itsource/domain/ProductMapper.xml" /> 
	</mappers> 

</configuration> 

3.准备映射文件
一般情况下是和它对应的domain实体类在同一个层级
这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)
namespace的名称为了确定唯一性,请大家根据我的要求取名
记住一定要在mybatis-config.xml中引入
除了MyBatis支持的类型,其它的类型都通通使用全限定(全限定名可以设置别名)

<?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">
<!-- 
	这个Mapper的主要功能就是写sql
	mapper:根
	namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加
     namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
 -->
<mapper namespace="cn.itsource.mybatis.day1._1_hello.ProductMapper">
	<!-- 
		select : 这里面写查询语句
		id:用来确定这条sql语句的唯一
			   以后我们确定唯一,也就是找sql语句 : namespace +.+ id
			 例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
		parameterType : 传入的参数类型  long:大Long  _long:小long (具体的对应请参见文档)
		resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名
	 -->
	<select id="get" parameterType="long" resultType="cn.itsource.domain.Product">
		select * from product where id = #{id}
	</select>
</mapper> 

4.编写domain,dao层,测试

使用细节

添加时拿到返回的主键

<!-- 
		parameterType:需要传入我们的对象
		useGeneratedKeys: 是否需要主键 
		keyColumn:主键所在的列
		keyProperty:对象中的属性(代表主键的那个属性)
	 -->
	<insert id="save" parameterType="cn.itsource.domain.Product"
			useGeneratedKeys="true" 
			keyColumn="id"
			keyProperty="id"
		>
		insert into product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
			values (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
	</insert>

查看mybatis运行日志

在使用MyBatis的很多时候,我们需要把日志打印出来,帮助我们进行分析与排错
MyBatis中打印日志使用的是Log4j
log4j.properties(日志文件:)

log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.com.lzj=TRACE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

com.lzj:一定要根据自己的包名情况进行修改

取别名

内置别名

在这里插入图片描述

自定义别名

在mybatis-config.xml中配置

<typeAliases>
		<!-- 单个配置:练习 -->
		<typeAlias type="cn.itsource.mybatis.a_crud.Dept" alias="Dept" />
		<!-- 包的配置:项目,添加了包之后,类名就是别名 -->
		<package name="cn.itsource.mybatis.a_crud" />
</typeAliases>

动态sql

批量删除

<!-- delete from product where id in ( ? , ? ) 批量删除: 
collection="list":传入的list,相当于map的key,通过list得到传入的整个集合的值; 
		index="index" :每次循环的索引
 item="id" :每次循环的这个值 
open="(" :以什么开始 
separator=",":分隔符 
		close=")":以什么结束 
-->
	<delete id="deleteBatch" parameterType="java.util.List">
		delete from product where id
		in
		<foreach collection="list" index="index" item="id" open="("
			separator="," close=")">
			#{id}
		</foreach>
	</delete>

批量插入

<!-- 批量插入: 
	 insert into product(productName,salePrice,costPrice,cutoff,supplier,brand,dir_id) 
		values (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?) 
	   parameterType:传入参数是:java.util.List的类型的; 
	           对传入的list进行foreach循环:取出值填入插入的values中: 
		collection="list":这个不能修改,表示传入的一个list类似于一个key是list,得到传入的list集合
	    index="index":每一次遍历的序号 
		item="item":每次遍历的这个对象别名,可以修改 
		separator=",":每遍历一次后的分隔符
		-->
	<insert id="insertBatch" parameterType="java.util.List">
		insert into
		product(productName,salePrice,costPrice,cutoff,supplier,brand,dir_id)
		values
		<foreach collection="list" index="index" item="item"
			separator=",">
			(#{item.productName},#{item.salePrice},#{item.costPrice},#{item.cutoff},#{item.supplier},#{item.brand},#{item.dir_id})
		</foreach>
	</insert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值