MyBatis基础--1

2023-03-28 15:59:29

概述

1、简述

1、SSM整体架构
1、mybatis ----- 持久层:简化工作、灵活
2、Spring ----- 粘合剂:整合框架、AOP、IOC、DI
3、SpringMVC ----- 表现层:方便前后端数据的传输
2、什么是MyBatis
1、MyBatis是对jdbc的封装
2、将sql语句放入映射文件中(xml)
3、自动将输入参数映射到sql语句的动态参数上
4、将sql语句执行的结果映射成java对象
3、MyBtias步骤理解
结合jdbc将数据以对象的形式展现出来,并且通过配置文件形式将各种需要集中起来。因此mybatis-config.xml就是总的配置文件,其次jdbc连接需要db.properties文件。想要以对象的形式来展现则需要使用pojo–Blog.java,sql语句操作则需要使用相应的接口BlogMapper.java和BlogMapper.xml配置来实现接口。工具类则用于操作。需要使用Stream的形式来解析配置文件,通过SqlSessionFactory类最终以SqlSession的形式返回,SqlSession再通过getMapper方法将所指向的表以Mapper形式返回,再通过mapper自定的sql来获取数据。

2、示例

pom依赖

<dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>2.1.0</version>
</dependency>
<dependency>
	 <groupId>mysql</groupId>
	 <artifactId>mysql-connector-java</artifactId>
</dependency>

主配置文件

<?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>

	<!-- 引入数据库链接配置 -->
	<properties resource="db.properties"></properties>
	
	<!-- 定义返回值类型别名BlogMapper.xml中的resultType 类型是pojo类-->
	<typeAliases>
		<typeAlias type="com.my.test.MyTest" alias="MyTest"/>
		<!-- 也可以使用
				<package name="包" />
				会自动扫描此包下的所有类并使其类名为别名
		 -->
	</typeAliases>
	
	<!-- 引入数据源 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"></property>
				<property name="url" value="${jdbc.url}"></property>
				<property name="username" value="${jdbc.username}"></property>
				<property name="password" value="${jdbc.password}"></property>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 定义映射文件(将sql语句放入映射文件中) -->
	<mappers>
		<!--
			此处配置一个配置文件
           使用xml方式来配置时使用如下形式:
			<mapper resource="com/my/mybatis/mapper/BlogMapper.xml"/>
    		使用注解方式来配置时使用如下形式:
            <mapper class="com/my/.../dao类"
         -->
		<!-- 可直接配置一个包 如下
		 <package name="com.my.mybatis.mapper"/> -->
		 <mapper resource="mapper/TestMapper.xml"/>
	</mappers>
</configuration>

properties数据库配置

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/my_test?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=666666

主程序

public class TestMain {
	public static void main(String[] args) {
		SqlSession session = MyBatisUtil.getSqlSession();
		TestMapper testMapper = session.getMapper(TestMapper.class);
		MyTest myTest = testMapper.selectTest();
		session.close();
		System.out.println(myTest.toString());
	}
}

//mapper接口
interface TestMapper{
	MyTest selectTest();
}

//pojo
class MyTest{
	private String id;
	private String name;
	private int age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "MyTest [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	
}

//工具类用于获取SqlSessionFactory
class MyBatisUtil{
	private static SqlSessionFactory sqlSessionFactory = null;
	static {
		 try {
			InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private MyBatisUtil(){}
	public static SqlSession getSqlSession() {
		return sqlSessionFactory.openSession();
	}
}

3、别名处理

方法一:

不写接口,则需通过session的各种方法来操作,要写全名,1是参数:
         SqlSession session = MyBatisUtil.getSqlSession();
         Blog blog = (Blog) session.selectOne("com.my.mybatis.mapper.BlogMapper.selectBlog",1)

方法二:

<resultMap type="Blog" id="blogResultMap">
    <id column="id" property="id" jdbcType="INTEGER"/>
    /*column中写表中的列名,property中写pojo中对应的属性名*/
    <result column="author_id" property="authorId" jdbcType="INTEGER"/>
</resultMap>

<select id="selectBlog2" parameterType="int" resultMap="blogResultMap">
    sql语句。。。
</select>

模糊查询及排序

1、不使用接口的方式
接口的意义:
在调用session的方法的时候,都会传入要调用的SQL的namespace+id名称,但是,namespace+id的使用方式很容易报错,因为是string类型的,没有检查。所以,mybatis提供了一种非常好的设计方式来避免这种问题,即Mapper接口。
接口开发的规范:namespace的值=接口的包名+接口的类名
注意:
  1、 包名 + 类名 = XXXMapper.xml中namespace的值
  2、 接口中方法名 = mapper.xml中 具体的SQL语句定义的id值
  3、 方法的返回值和参数要和映射文件中一致
mybatis为接口做了一个动态代理。在执行UserMapper接口上面的方法时,参考接口的全路径名,即可找到对应的UserMapper.xml,在执行接口上面的每一个方法的时候,实际上 就是在执行namespace+id,mybatis在根据定义的方法的元素,选择调用合适的session的方法来执行,并传入参数就可以。
DataMapper.xml

<select id="selectData" parameterType="int" resultType="dataSource">
	select * from mydata where id = #{id}
</select>

MyBatisTest.java

SqlSession session = MyBatisUtil.getSqlSession();
//直接使用session的操作方法
dataSource data = session.selectOne("com.my.mybatis.mapper.DataMapper.selectData",2);
session.close();
System.out.println(data);

2、列名和属性名不一致的情况
第一种方式
实体类

//pojo
class MyTest{
	private String id;
	private String testName;
	private int age;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTestName() {
		return testName;
	}
	public void setTestName(String testName) {
		this.testName = testName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "MyTest [id=" + id + ", testName=" + testName + ", age=" + age + "]";
	}
}

配置文件Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.my.test.TestMapper">
	<select id="selectTest" resultType="MyTest">
		select `name` as testName,`age` from test1;
	</select>
</mapper>

第二种方式
配置文件Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.my.test.TestMapper">
<!-- 在mybatis-config.xml中定义别名才可以直接赋值给type,否则需全名 -->
		<resultMap type="MyTest" id="TestResultMap">
        <!-- id 同理-->
        <id column="id" property="id" jdbcType="VARCHAR" />
        <!-- column是表中列名,property是pojo中属性 -->
        <result column="name" property="testName" jdbcType="VARCHAR" />
    </resultMap>

	<select id="selectTest" resultMap="TestResultMap">
		select `name`,`age` from test1;
	</select>
</mapper>

3、模糊查询之#和$
模糊查询
Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.my.test.TestMapper">
<!-- 在mybatis-config.xml中定义别名才可以直接赋值给type,否则需全名 -->
		<resultMap type="MyTest" id="TestResultMap">
        <!-- id 同理-->
        <id column="id" property="id" jdbcType="VARCHAR" />
        <!-- column是表中列名,property是pojo中属性 -->
        <result column="name" property="testName" jdbcType="VARCHAR" />
    </resultMap>

	<select id="selectTest" parameterType="string" resultMap="TestResultMap">
		select `name`,`age` from test1 where name like #{name};
	</select>
</mapper>

主程序

public static void main(String[] args) {
		SqlSession session = MyBatisUtil.getSqlSession();
		TestMapper testMapper = session.getMapper(TestMapper.class);
		List<MyTest> list = testMapper.selectTest("%b%");
		session.close();
		for(MyTest item : list) {
			System.out.println(item.toString());
		}
	}

**#{}和KaTeX parse error: Expected 'EOF', got '#' at position 42: …where xxx like #̲{xxx} select*fr…{value}‘ -----单列需使用value占位、加引号也可以使用’%KaTeX parse error: Expected 'EOF', got '#' at position 13: {value}%'形式 #̲和的区别:
1、#是占位符 是 字 符 串 拼 接 ( 是字符串拼接( 要加引号)
2、当参数是表名或列名时,只能使用$
如: select*from blog order by #{column}
4、sql中like和limit的使用
a、like:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。这个模式可以通过%通配符来定义
b、limit:
select * from Customer LIMIT 10;–检索前10行数据,显示1-10条数据
select * from Customer LIMIT 1,10;–检索从第2行开始,累加10条id记录,共显示id为2…11
select * from Customer limit 5,10;–检索从第6行开始向前加10条数据,共显示id为6,7…15
select * from Customer limit 6,10;–检索从第7行开始向前加10条记录,显示id为7,8…16
5、sql中的通配符
在mapper配置文件中:
%不能用于#{},因为#是一个对象,不能用于字符串拼接,模糊查询可在test中配置%%
%可以用于 , {}, ,是对字符串拼接,不需要在test中配置
在这里插入图片描述

6、resultType和resultMap区别
https://blog.csdn.net/u012702547/article/details/54599132
7、不区分大小写查询
select*from Blog where lower(title) like lower(’${title}’)
8、排序
Mysql 内置方法 之 convert(‘column’ USING 'gbk) 方法—对指定column进行转码
需求:按某一列排序
order by
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
9、多参数传递
方法一:使用索引的方式
配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.my.test.TestMapper">
<!-- 在mybatis-config.xml中定义别名才可以直接赋值给type,否则需全名 -->
		<resultMap type="MyTest" id="TestResultMap">
        <!-- id 同理-->
        <id column="id" property="id" jdbcType="VARCHAR" />
        <!-- column是表中列名,property是pojo中属性 -->
        <result column="name" property="testName" jdbcType="VARCHAR" />
    </resultMap>
	
	<select id="selectLimit" resultMap="TestResultMap">
		select `name`,`age` from test1 limit #{a},#{b};
	</select>
</mapper>

接口

List<MyTest> selectLimit(int a,int b);

方法二:使用注解方式
配置文件xml

<select id="selectAnnotation" resultMap="TestResultMap">
		select `name`,`age` from test1 limit #{offset},#{pagesize};
	</select>

接口

List<MyTest> selectAnnotation(
			@Param(value="offset") int offset,
			@Param(value="pagesize") int pagesize);

方法三:使用map
配置文件xml

<select id="selectMap" resultMap="TestResultMap">
		select `name`,`age` from test1 limit #{offset},#{pagesize};
	</select>

接口

List<MyTest> selectMap(Map<String,Object> map);

10、插入功能和获取刚刚插入的id(插入、更新、删除需要commit())
a、示例
配置文件mapper.xml

<insert id="insertTest" parameterType="MyTest">
		insert into `test1` (
			`id`,
			`name`,
			`age`
		) values (
			#{id},
			#{testName},
			#{age}
		)
	</insert>

接口及主程序

		SqlSession session = MyBatisUtil.getSqlSession();
		TestMapper testMapper = session.getMapper(TestMapper.class);
		MyTest myTest = new MyTest();
		myTest.setId("8");
		myTest.setTestName("bbbbb");
		myTest.setAge(11);
		testMapper.insertTest(myTest);
		session.commit();
		session.close();
int insertTest(MyTest myTest);

b、获取自增id:获取刚插入的自增主键id
方式一:给insert增加 useGeneratedKeys="true"和keyProperty="id"属性
方式二:
a、在全局配置,在myBatis-config.xml中配置
b、并且在insert中增加keyProperty="id"属性

<settings>
    <setting name="useGeneratedKeys" value="true"/>
</settings>

方式三:适用于没有自增主键的数据库

在insert中加
<selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id">
    select seq.nextval as id from dual 
</selectKey>

11、修改功能和修改部分字段应该注意的问题
配置文件mapper.xml

<update id="updateTest" parameterType="MyTest">
		update
			`test1`
		set
			`id`=#{id},
			`name`=#{testName},
			`age`=#{age}
		where
			id=#{id}
	</update>

接口

int updateTest(MyTest myTest);

12、删除
配置文件mapper.xml

	<delete id="deleteTest" parameterType="string">
		delete from test1 where id=#{id}
	</delete





							
  • 作者:T_Ghost
  • 原文链接:https://blog.csdn.net/T_Ghost/article/details/108021128
    更新时间:2023-03-28 15:59:29