概述
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