MyBatis个人笔记(1.2版本)
Posted 霏ིྀ宇ིྀ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis个人笔记(1.2版本)相关的知识,希望对你有一定的参考价值。
MyBatis个人笔记
- MyBatis
MyBatis
- mybatis优势
mybatis与jdbc、hibernate的对⽐:
jdbc:代码⽐较多,开发效率低,重复代码多,业务代码和数据库操作混杂⼀起。在代码块中对象要创建和销毁,查询的结果要封装 list。
hibernate:全⾃动
mybatis:提供访问数据库基本功能,半⾃动,sql与java编码分离,轻量级的框架
一、Mybatis介绍
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
二、mybatis快速入门
1.1 准备开发环境
-
创建普通java项目或者是JavaWeb项目
-
添加相应的jar包
- 创建数据库
- 配置 MyBatis
配置 MyBatis 有多种方式,使用最基础最常用的 XML 形式进行配置
使用 XML 形式进行配置,首先在 src/main/resourc es 下面创建 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 >
<!-- log4j日志组件的使用-->
<properties resource="db.properties">
</properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
<setting name="logImpl" value="STDOUT_LOGGING" />
<setting name="useGeneratedKeys" value="true"/>
</settings>
<typeAliases>
<!-- <typeAlias type="com.qq.model.Book" alias="Book"/> -->
<package name="com.qq.model"/>
</typeAliases>
<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/shop?serverTimezone=Hongkong&useSSL=false&characterEncoding=utf-8&useUnicode=true" />
<property name="username" value="$username"/>
<property name="password" value="$password"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="com/qq/mapper/BookMapper.xml"></mapper>-->
<!--<mapper class="com.qq.mapper.BookMapper"></mapper>-->
<!--<mapper url="file:///E:\\HQYJ\\studyMybatis\\src\\com\\qq\\mapper\\BookMapper.xml"></mapper>-->
<package name="com.qq.mapper"/>
</mappers>
</configuration>
Mybatis 核心配置文件解析
<?xml version="1.0" encoding="UTF-8" ?>
<?xml ?>:报文头格式,报文头内容放在xml和?符号中间
version="1.0":声明使用的xml版本
encoding="utf-8":声明用xml传输数据时候用的字符编码(字符集)
验证文档:<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
在全集配置文件中引入dtd约束“http://mybatis.org/dtd/mybatis-3-config.dtd”
根节点是<configuration>:
Configuration类的位置org.apache.ibatis.session.Configuration
Configuration类保存了所有Mybatis的配置信息。
一般情况下Mybatis在运行过程中只会创建一个Configration对象,并且配置信息不能再被修改。
Configuration的属性
configuration的属性主要分为两大部分:
1. 从mybatis-config.xml中读取的配置
2. 从mapper配置文件或Mapper注解读取的配置
可选的properties节点:
properties属性----引入外部properties配置文件
可以使用properties节点来指定.properties文件,那么后面在很多需要的地方,就可以用$xxx的形式从.properties文件中取值。这样的好处是可以把重要、独立、机密的一些值统一放到.properties文件中,便于管理。
我们把配置文件中基础信息单独写在db.properties文件中
<properties resource="db.properties"> //指定文件
<property name="db.username" value="root"/> //也可以在这里传值
<property name="db.password" value="123456"/>
</properties>
注意一个问题:
在配置文件中,url 路径中有 & 符号,会使用 & 来代替,当我们把url抽离出来,放到xxx.properties 文件中时,需要把 &; 改成 & 。
<settings> 中的 ogimp 属性配置指定使用 LOG4J 输出日志
cacheEnabled
lazyLoadingEnabled
logImpl
类名别名(typeAliases)
如果嫌有时写类型名太长,比如上面的查询结果类型resultType="com.qq.model.Book"的名写着太长,可以使用类型别名方式,这要在基本配置文件中使用<typeAliases>指定。
<typeAliases>
以使用类型别名方式,这要在基本配置文件中使用<typeAliases>指定。
方式一:<!--<typeAlias type="com.qq.model.Book" alias="Book"/> -->
这样我们后面在映射文件中就可以写成resultType="Book"了
方式二:也可以使用一个包名
<package name="com.qq.model"/>
</typeAliases>
<environments>环境 配置中 主要 配置了数据库连接,数据库的 url
jdbc:mysql://localhost:3306/mybatis ,使用的是本机 MySQL 中的 mybatis
数据库,后面的 username password 分别是数据库的用户名和密码(如果你的数据库用户名及密码和这里的不 样,请修改为自己数据库可用的用户名和密码〉
<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/lib?characterEncoding=utf-8" />
<property name="username" value="root"/>
或<property name="username" value="$db.username"/>
<property name="password" value="123456" />
或<property name="password" value="$db.password" />
</dataSource>
</environment>
</environments>
<mappers></mappers>中配置了 个包含完整类路径的 CountryMapper.xml ,这是 MyBatis
SQL 语句和映射配置文件
最常用的配置:
<!--每一个Mapper.xml(sql映射文件)都需要在Mybatis核心文件中注册!-->
<mappers>
<mapper resource="com/lxc/dao/UserMapper.xml"></mapper>
</mappers>
Mybatis中mappers的映射配置:
一、通过resource加载单个映射文件:
1.通过<mapper resource=""/>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
2.通过<mapper url=""/>
<mappers>
<mapper url="D:\\myeclipse\\word\\mybatis\\config\\mapper\\UserMapper.xml"/>
</mappers>
3.通过mapper接口加载
<!-- 需要将mapper接口类名和mapper.xml映射文件名称保持一致且在同一个目录中,
注意:要使用的是mapper代理。两个文件要在同一个目录 -->
<mappers>
<mapper class="dancheng.mybatis.mapper.UserMapper"/>
</mappers>
二、批量加载
指定mapper接口包名
<!-- 需要将mapper接口类名和mapper.xml映射文件名称保持一致且在同一个目录中,
注意:要使用的是mapper代理。两个文件要在同一个目录 -->
<mappers>
<package name="dancheng.mybatis.mapper"/>
</mappers>
在数据库中,由于大多数数据库设置不区分大小写 ,因此下画线方式的命名很常见,如
user name user email 。在 Java 中, 般都使用驼峰式命名,如 userName userEmail
因为数据库和 Java 中的这两种命名方式很常见,因此 MyBatis 还提供 个全局属性
mapUnderscoreToCamelCase ,通过配置这个属性为 true 可以自动将以下画线方式命名的
数据库列映射到 Java 对象的驼峰式命名属性中。这个属性默认为 false ,如果想要使用该功能,
需要在 MyBatis 的配置文件(mybatis-config.xml 文件)中增加如下配置。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
如果使用了这个驼峰转换,在查询select数据时可以进行智能的匹配(以便得到的字段值填入实体类对象成员),但是在插入insert和修改update数据时不能智能匹配(此时必须给出类中成员的真名)
根节点内的子节点的顺序是固定的:
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
2.2 用mybatis去访问数据库的三种编码方式
(一)xml映射文件 + sqlSession调用相应的方法
框架已经设计了多个方法供使用,如selectOne(statement,id),该statement是“命名空间与映射文件中的id组成的字符串”,则就运行起sql语句了(此方式已过时,但常作为入门写法学习)。(这是直接执行id号的感觉,也可以往里面传输丰富的参数值,得到的对象也是指定了类型)
-
定义操作Book表的sql映射文件BookMapper.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="com.qq.mapper.BookMapper"> <select id="selectOne" parameterType="int" resultType="com.qq.model.Book" > select * from book where id=#id </select> <select id="selectAll" resultType="Book" > select * from book </select> <insert id="insertOne" keyProperty="id" parameterType="com.qq.model.Book"> <!-- <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">--> <!-- SELECT LAST_INSERT_ID()--> <!-- </selectKey>--> insert into book (name,author,price) values (#name,#author,#price) </insert> <insert id="insertOne2"> insert into book (name,author,price) values (#name,#author,#price) </insert> <insert id="insertOne3" > insert into book (name,author,price) values (#name,#author,#price) </insert> <update id="modify" parameterType="com.qq.model.Book"> update book set name=#name, <if test="author!=null and author!=''"> author=#author, </if> price=#price where id=#id </update> <delete id="deleteById" > delete from book where id=#id </delete> <select id="selectByName" parameterType="String" resultType="com.qq.model.Book" > select * from book where name like #name </select> <select id="selectByName2" parameterType="String" resultType="com.qq.model.Book" > select * from book where name like '%#name%' </select> <select id="selectByName3" parameterType="String" resultType="com.qq.model.Book" > select * from book where name like concat( '%',#name , '%') </select> <select id="selectByName4" parameterType="String" resultType="com.qq.model.Book" > select * from book where name like '%$value%' </select> <select id="queryOrder" parameterType="string" resultType="com.qq.model.Book"> select * from book order by CONVERT($value USING gbk) </select> <select id='queryOrder1' parameterType='string' resultType='com.qq.model.Book'> select * from book where lower(name) LIKE lower('%$value%') </select> </mapper>
MySQL 定义在 BookMapper.xml 文件中,里面的配置作用如下:
-
XML 的根元素 属性 ηamespace 定义了当 XML 的命名 空间。
-
<select >元素 :我们所定义的一个 SELECT 查询。
-
id 属性:定义了当前 SELECT 查询的唯一一个id
-
resultType :定义了当前查询的返回值类型
-
select id, …: 查询 SQL 语句。
-
parameterType:该参数只表示一个参数类型,其中@Param和parameterType 二者存其一即可
-
-
编写测试
package com.qq;
import com.qq.model.Book;
import com.qq.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
/**
* @description:com.qq_studyMybatis
* @author: 霏宇
* @time: 2022/7/24,15:48
* (一)xml映射文件 + sqlSession调用相应的方法
*/
public class MyTest1
public static void main(String[] args)
SqlSession session = MybatisUtil.getSqlSession();
List<Book> books= session.selectList("com.qq.mapper.BookMapper.selectAll");
for (Book one : books)
System.out.println(one.toString());
String statement1 = "com.qq.mapper.BookMapper.selectOne";
Book book = session.selectOne(statement1, 1); // 隐式强转
System.out.println(book.toString());
String statement="com.qq.mapper.BookMapper.insertOne";
Book book1 =new Book();
book1.setName("最丑的男人");
book1.setAuthor("2");
book1.setPrice(5.0);
int num = session.insert(statement,book1);
System.out.println("受影响的行数=" + num);
session.commit();//一定要有这句
session.close();
for (Book one : books)
System.out.println(one.toString());
(二)xml映射文件 + java接口方式
Xml文件中的sql语句,和java接口中的方法相对应。
sqlSession可以获取接口对象,(接口能被框架实例化出类对象),然后利用这个对象调其中的方法。
这种方式要多写一个接口Interface以及其中的抽象方法。此方式整体功能强大,是目前最多使用的方式。
这种方式的有个必须满足的要求就是Mapper.xml文件的根标签的namespace属性的值需要写成接口的全限定名。虽然,XxxxMapper.xml与XxxxMapper.java是可以放置在不同的文件夹下面,不过呢,笔者一般是把.java接口文件和xml文件并列放在挨在一起的,这行都这样做。
BookMapper接口文件代码:
package com.qq.mapper;
import com.qq.model.Book;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @description:com.qq.mapper_studyMybatis
* @author: 霏宇
* @time: 2022/7/25,9:17
*
*/
public interface BookMapper
List<Book>selectAll();
Book selectOne以上是关于MyBatis个人笔记(1.2版本)的主要内容,如果未能解决你的问题,请参考以下文章