MyBatis搭建

MyBatis 是一款优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动获取结果集的操作。

MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种 ORM(ORM )Object Relational Mapping 对象关系映射)实现.

它支持动态 SQL 以及数据缓存.

Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可.

Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html

1.添加依赖:mybatis,mysql等

    <!-- mysql-connector-java-->
	 <dependency>
		 <groupId>mysql</groupId>
		 <artifactId>mysql-connector-java</artifactId>
		 <version>5.1.35</version>
	  </dependency>
	
	<!-- mybatis-->
	 <dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.2</version>
     </dependency>

2.创建数据库对应实体类

3.创建mybatis全局配置文件 (mybatis-config.xml)

        具体配置要求请查看官网官网

<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE configuration
			PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
			"https://mybatis.org/dtd/mybatis-3-config.dtd">
	<configuration>
		<environments default="development">
			<environment id="development">
				<transactionManager type="JDBC"/>
				<dataSource type="POOLED">
					<property name="driver" value="com.mysql.jdbc.Driver"/>
					<property name="url" value="jdbc:mysql://localhost:3306/数据库名"/>
					<property name="username" value="数据库账号"/>
					<property name="password" value="数据库密码"/>
				</dataSource>
			</environment>
		</environments>
		<mappers>
			<mapper resource="mapper文件所在地址"/>
		</mappers>
	</configuration>

        也可以创建外部配置文件(.properties),避免重复修改,该文件以键值对形式存储

driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmdb
userName=root
pwd=123456

然后在mybatis核心配置文件中引用该文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="config.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driverName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${userName}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"/>
    </mappers>
</configuration>

4.定义接口

        在接口中定义方法,接口方法不可以重载

5.创建sql映射文件***mapper.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">
	<mapper namespace="mapper接口全类名">
		<select id="接口中对应方法名" parameterType="参数类型" resultType="返回类型全类名">
			sql语句
		</select>
	</mapper>

6.测试mybatis

        //读取配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        //创建 SqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //创建 SqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        //获得接口代理对象
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        Admin admin=adminDao.getAdminById(1);
		sqlSession.commit();
        sqlSession.close();

$和#的区别

    ${}:采用字符串拼接传值,主要用于动态地向sql中传递列名
    #{}:传值时采用预编译方式,主要用于向sql中传值使用

参数传递

    单个基本类型不需要做任何处理,

    多个需要使用 (@Param "id")绑定

    也可以使用paramerMap
    字符串类型单独传递时,也需要进行绑定

数据库事务

    JDBC默认事务自动提交
    MyBatis关闭了事务的自动提交:sqlSession.commit()

MyBatis默认会将查询结果封装到对象中去

        自动封装有前提条件

                        (1)开启了全局的自动结果映射 默认PATHFUL即单张表开启
                        (2)数据库列名与实体类属性名一致,如果不一致可以使用别名
                              可以开启驼峰命名映射    

<setting name="mapUnderscoreToCamelCase" value="true"/> 
即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn

数据库字段名和对应实体类的属性名不一致时

        1.起别名

        2.resultMap

<resultMap id="userResultMap" type="User">
		<id column="id" property="id_"/>
		<result property="userName" column="user_Name_" />
		<result property="userAge" column="user_age" />
</resultMap>

    (1)resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“useresultMap”
    (2)resutlMap 的 id 属性是映射的实体类
    (3)id 标签映射主键,result 标签映射非主键
    (4)property设置实体类的属性名称,column 映射查询结果(不是数据库)的列名称

动态sql

        <where>

        <if test>

特殊字符 

在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>
等,正常书写 mybatis 会报错,需要对这些符号进行转义。
注意:">"并不会报错

(1)使用转义字符
            特殊字符 转义字符
            <            &lt;
            >            &gt; 
            "          &quot; 
            ’            &apos;
            &            &amp;
    (2)使用<![CDATA[]]>来包裹特殊字符

缓存

        由于mysql数据存储在硬盘上,访问量(I/O)过大可能会导致数据库崩溃,
因此可以将一些经常被访问的数据放在内存中,以此来提高查询效率。
        MyBatis有一级和二级缓存,一级缓存是在同一个sqlSession中,如果有多次相同的查询,只执行一次sql,缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中,
        当再次需要获取该对象时,直接从内存(缓存)中直接获取,MyBatis默认开启一级缓存。
        一级缓存消失的情况:
                        sqlSession.clearCache();
                        sqlSession.close();
                        中间执行了新增,修改,删除操作
       二级缓存作用域是同一个namespace中,是SqlSessionFactory级别的
只要SqlSessionFactory未销毁,通过该SqlSessionFactory创建的不同SqlSession即使销毁,
只要有相同的操作,可以直接从内存中获取。
    二级缓存消失的情况:
                        中间执行了新增,修改,删除操作


    配置二级缓存

第一步:启用二级缓存

        在 SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。

<setting name="cacheEnabled" value="true"/>
第二步:对象序列化

        将所有的 POJO 类实现序列化接口 Java.io. Serializable。

第三步:配置映射文件
        在 Mapper 映射文件中添加<cache />,表示此 mapper 开启二级缓存。
        当 SqlSeesion 关闭时,会将数据存入到二级缓存.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值