mybatis的基本认识和基本的CRUD操作

本文介绍了mybatis作为ORM框架的基础概念,探讨了mybatis与hibernate的区别,并详细阐述了mybatis进行CRUD操作的步骤,包括配置映射文件、别名的使用以及如何处理列名与属性名不一致的问题。同时,提到了日志管理在mybatis应用中的重要性。
摘要由CSDN通过智能技术生成

mybatis

mybatis:一个ORM框架(操作数据库)

MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写全部SQL,如果查询出来数据的列和对象中的 字段不一致,我们还得手动进行一个映射配置

mybatis和hibernate的区别

简单区别
MyBatis自己写SQL,性能更好控制,并且mybatis不能自己生产数据库表
mybatis:
1. 操作简单,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于对象模	
	型要求不高的项目,使用更加合适。
2. 可以进行更为细致的SQL优化,可以减少查询字段。
3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工`		作量也比较大,而且不太容易适应快速数据库修改。
4. 二级缓存机制不佳。

hibernate:
1. 功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的
	项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快。
2. 有更好的二级缓存机制,可以使用第三方缓存。
3. 缺点就是学习门槛高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好
	Hibernate方面需要你的经验和能力都很强才行。

MyBatis与JDBC的区别
MyBatis只需要关注SQL,其它完成了封装

mybatis基本CRUD步骤实现

1.导入相应的jar包
在这里插入图片描述配置核心配置文件 mybatis-config.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>
    <!--
        每个环境都代表对应一个数据库连接
        environments:环境(们)
    -->
    <!--引入 db.properties文件-->
    <properties resource="db.properties" />
    <environments default="development">
        <!-- 真实数据库环境【用户】 -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <!--dataSource:数据源(连接池) -->
            <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>
        <!-- 读取SQL的映射文件 -->
        <mapper resource="cn/itsource/domain/ProductMapper.xml" />
    </mappers>
</configuration>

配置映射文件 XxxMapper.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:命名空间(一个domain对应一个这个xml)
 -->
<mapper namespace="cn.itsource.domain.ProductMapper">
    <!--
        如果到时候想找到这条SQL: namespace+id
            等会要找到它:cn.itsource.domain.ProductMapper.findOne
            parameterType:代表传参类型
                long -> Long  _long -> long
            resultType:返回的某一个条数的类型(必需写全限定名)
     -->
    <select id="findOne" parameterType="long" resultType="cn.itsource.domain.Product" >
    	//这里是一条简单的查询一条数据的查询语句
        select * from product where id = #{id}
    </select>
</mapper>

接下来完成简单的查询一条数据

	1.在配置映射文件 XxxMapper.xml中
	<select id = findOne"  parameterType="long" resultType="cn.itsource.domain.Product" >
    	//这里是一条简单的查询一条数据的查询语句
        select * from product where id = #{id}
    </select>
    2.在创建一个测试类写一个方法
    	//读取核心配置文件
  		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        //创建工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        //创建sqlsession对象
        SqlSession sqlSession = factory.openSession();
        //查询
        Product product = sqlSession.selectOne("cn.itsource.domain.ProductMapper.findOne", 1L);
        System.out.println(product);
        //关闭
        sqlSession.close();
	

3.对重复代码抽取工具类 mybatisUtil

//先在外面定义一个静态的工厂
 private static SqlSessionFactory factory;
	//在静态代码块中
    static {
        try {
        	//创建工厂
            factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
    	//返回一个sqlsession
        return factory.openSession();
    }

重点 CRUD

映射文件 XxxMapper.xml中写的sql语句

查询一条
	<!--
        parameterType 传入数据类型
        resultType 返回·对象
    -->
    <select id="findOne" parameterType="long" resultType="cn.itsource.domain.Product">
        select * from product where id = #{id}
    </select>
	查询所有
	 <select id="findAll" resultType="cn.itsource.domain.Product">
        select * from product
    </select>
	
	 <!--
        添加后显示id
        useGeneratedKeys:是否需要主键
        keyColumn:主键所在的列
        keyProperty:类中所在的属性
    -->
    <insert id="add" parameterType="cn.itsource.domain.Product"
            useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        INSERT INTO product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
        VALUES (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
  </insert>
  
	//删除
	 <delete id="del" parameterType="long">
        delete from product where id = #{id}
    </delete>
    
    //修改
    <update id="update" parameterType="cn.itsource.domain.Product">
        update product set productName=#{productName},dir_id=#{dir_id},
        salePrice=#{salePrice},supplier=#{supplier},brand=#{supplier},cutoff=#{cutoff},costPrice=#{costPrice}
        where id = #{id}
    </update>

这里有一点注意:

#与$的区别
#(占位符,接收普通参数,预编译,性能好,安全性高),
$(字符串的拼接,不能预编译,性能不好,安全性不高),

CRUD的关键代码

"cn.itsource.domain.ProductMapper.save"(这里的字符串是XxxMapper.xml,
		<mapper namespace="cn.itsource.domain.ProductMapper"> namespacem"命名空间"内容加上id名
	)

session.insert("cn.itsource.domain.ProductMapper.save", product);

session.update("cn.itsource.domain.ProductMapper.update", product);

session.delete("cn.itsource.domain.ProductMapper.delete",id);

Product product = session.selectOne("cn.itsource.domain.ProductMapper.findOne",id);

List<Product> products = session.selectList("cn.itsource.domain.ProductMapper.findAll");

别名的认识和使用

内置别名(文档中有)
自定义别名 mybatis-config.xml\
别名不区别大小写
注意它的配置顺序(如果配置错误会有提示)

<!-- 配置别名 -->
<typeAliases>
    <!-- 配置一个别名(不区分大小写) -->
    <!--<typeAlias type="cn.itsource.domain.Product" alias="product" />-->
    <package name="cn.itsource.domain" />
</typeAliases>

列名与属性名不一致

添加与修改在相应位置修改名称即可
查询需要创建一个resultMap
使用的时候返回结果必需是resultMap
<!--
    准备一个映射(ORM)配置
    resultMap:结果映射
 -->
<resultMap id="productMapper" type="product">
    <!--如果是主键不一致,使用id这个标签-->
    <id column="id" property="id" />
    <!--
        result:某一个属性的映射
            column:列名(表中) property:属性名(对象中)
    -->
    <result column="dir_id" property="dirId" />
</resultMap>
<!-- 查询所有数据 -->
<select id="findAll" resultMap="productMapper" >
    select * from product
</select>

日志管理

在资源根目录创建:log4j.properties

#log4j.properties(日志文件:)
# ERROR错误的日志 WARN:警告 INFO:普通信息  DEBUG:调试日志  TRACE:日志
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
#把左边包名改成你自己的包名
log4j.logger.cn.itsource=TRACE

# 日志打印到控制台中
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 日志打印的一种格式(可以灵活地指定布局模式)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 日志打印的格式是什么样子的  %d:日期 %p:优先级 %c:类的全名  %m:输出的结果 %n:换行
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值