文章目錄
- 一,Mybatis入門案例
- --0,匯入mybatis的jar包
- --1,核心組態檔
- --2,映射檔案
- --3,創建User類
- --4,測驗類
- 5,總結
- 二,Mybatis的練習
- --1,修改映射檔案UserMapper.xml
- --2,修改測驗類
- --3,總結
- 三,優化配置
- --1,別名
- 修改核心組態檔,加別名的代碼
- 修改映射檔案,使用別名
- 四,介面開發
- --1,概述
- --2,使用
- 需求:查詢id=1的部門資訊
- 創建Dept類
- 創建DeptMapper.xml
- 修改核心組態檔,加了別名和引入Mapper
- 測驗
- --3,改造
- 創建介面
- 改造映射檔案
- 改造測驗類
- 總結
- 五,練習介面開發
- --1,修改 介面檔案
- --2,修改 映射檔案
- --3,修改 測驗檔案
- 六,動態SQL
- --1,概述
- --2,修改映射檔案,實作動態SQL
一,Mybatis入門案例
–0,匯入mybatis的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cgb2106boot03</artifactId>
<groupId>cn.tedu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>day17</artifactId>
<dependencies>
<!--mybatis依賴包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--jdbc依賴包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>
</project>
–1,核心組態檔
<?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">
<!-- mybatis的核心組態檔,配置了事務管理,資料源 -->
<configuration>
<!--environments可以配置多個資料庫的連接資訊,default指定默認的環境-->
<environments default="test">
<environment id="test">
<!--使用的事務管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置了資料源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射檔案-->
<mappers>
<mapper resource="UserMapper.xml"></mapper>
</mappers>
</configuration>
–2,映射檔案
<?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">
<!--這個檔案是映射檔案,寫SQL的
namespace用來作為一個mapper.xml檔案的唯一標識
-->
<mapper namespace="userMapper">
<!-- 查id=1的用戶資訊
id是這條SQL的唯一標識
resultType的值用來封裝查到的結果,ORM
-->
<select id="getById" resultType="cn.tedu.pojo.User">
select * from user where id=1
</select>
</mapper>
–3,創建User類
package cn.tedu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
//注意:::屬性的名 和 表里的欄位名 必須一致,否則無法ORM
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
private Integer id;
private String name;
private String addr;
private Integer age;
}
–4,測驗類
package cn.tedu.test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class Test1 {
@Test
public void get() throws IOException {
InputStream in = Resources.getResourceAsStream(
"mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(in);
SqlSession session = factory.openSession();
Object o = session.selectOne("userMapper.getById");
//User(id=1, name=hanmeimei, addr=北京, age=28)
System.out.println(o);
}
}
5,總結

二,Mybatis的練習
–1,修改映射檔案UserMapper.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">
<!--這個檔案是映射檔案,寫SQL的
namespace用來作為一個mapper.xml檔案的唯一標識
-->
<mapper namespace="userMapper">
<!--
面試題:SQL動態獲取引數時,可以用#或者$
$ 底層用了低級傳輸器,可能發生SQL注入攻擊,低效,不拼串,可能發生SQL語法錯誤
# 底層用了高級傳輸器,安全,高效,會自動拼接字串 'xiongda'
-->
<!-- 查id=1的用戶資訊
id是這條SQL的唯一標識
resultType的值用來封裝查到的結果,ORM
-->
<select id="getById" resultType="cn.tedu.pojo.User">
select * from user where id=${id}
</select>
<!-- 查詢所有user -->
<select id="getAll" resultType="cn.tedu.pojo.User">
select * from user
</select>
<!-- 查詢hanmeimei的,固定語法#{??}用來決議SQL的引數-->
<select id="getByName" resultType="cn.tedu.pojo.User">
select * from user where name=#{name}
</select>
</mapper>
–2,修改測驗類
package cn.tedu.test;
import cn.tedu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test1 {
@Test
public void get() throws IOException {
//讀取組態檔
InputStream in = Resources.getResourceAsStream(
"mybatis-config.xml");
//創建會話工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(in);
//開啟會話,準備執行SQL
SqlSession session = factory.openSession();
//定位SQL(namespace的值.id的值),并執行
//selectOne執行查詢的SQL,并只會回傳一個結果
Object o = session.selectOne("userMapper.getById",2);
//User(id=1, name=hanmeimei, addr=北京, age=28)
System.out.println(o);
//定位SQL(namespace的值.id的值),并執行
//selectList執行查詢的SQL,并回傳多個結果
List<User> list = session.selectList("userMapper.getAll");
for(User u : list){
System.out.println(u);
}
//定位SQL(namespace的值.id的值),并執行,并給SQL傳入引數
User u = session.selectOne(
"userMapper.getByName","xiongda");
System.out.println(u);
}
}
–3,總結


三,優化配置
–1,別名
修改核心組態檔,加別名的代碼
<?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">
<!-- mybatis的核心組態檔,配置了事務管理,資料源 -->
<configuration>
<!--配置別名,給指定類起一個指定的別名-->
<typeAliases>
<typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias>
</typeAliases>
<!--environments可以配置多個資料庫的連接資訊,default指定默認的環境-->
<environments default="test">
<environment id="test">
<!--使用的事務管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置了資料源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb2?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射檔案-->
<mappers>
<mapper resource="UserMapper.xml"></mapper>
</mappers>
</configuration>
修改映射檔案,使用別名
<?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">
<!--這個檔案是映射檔案,寫SQL的
namespace用來作為一個mapper.xml檔案的唯一標識
-->
<mapper namespace="userMapper">
<!--
面試題:SQL動態獲取引數時,可以用#或者$
$ 底層用了低級傳輸器,可能發生SQL注入攻擊,低效,不拼串,可能發生SQL語法錯誤
# 底層用了高級傳輸器,安全,高效,會自動拼接字串 'xiongda'
-->
<!-- 查id=1的用戶資訊
id是這條SQL的唯一標識
resultType的值用來封裝查到的結果,ORM
-->
<select id="getById" resultType="User">
select * from user where id=${id}
</select>
<!-- 查詢所有user -->
<select id="getAll" resultType="User">
select * from user
</select>
<!-- 查詢hanmeimei的,固定語法#{??}用來決議SQL的引數-->
<select id="getByName" resultType="User">
select * from user where name=#{name}
</select>
</mapper>
四,介面開發
–1,概述
為了優化定位SQL的字串拼接程序, namespace的值.id的值
步驟:
0, 創建介面 創建方法
1, namespace的值 是介面的全路徑
2, id的值 是介面里的方法名
–2,使用
需求:查詢id=1的部門資訊
創建Dept類
package cn.tedu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
//完成ORM,屬性名 必須和欄位名 一致
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Dept {
private Integer id ;
private String dname ;
private String loc ;
}
創建DeptMapper.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="deptMapper">
<select id="getById" resultType="Dept">
select * from dept where id=1
</select>
</mapper>
修改核心組態檔,加了別名和引入Mapper
<?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">
<!-- mybatis的核心組態檔,配置了事務管理,資料源 -->
<configuration>
<!--配置別名,給指定類起一個指定的別名-->
<typeAliases>
<typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias>
<typeAlias type="cn.tedu.pojo.Dept" alias="Dept"></typeAlias>
</typeAliases>
<!--environments可以配置多個資料庫的連接資訊,default指定默認的環境-->
<environments default="test">
<environment id="test">
<!--使用的事務管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置了資料源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb2?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射檔案-->
<mappers>
<mapper resource="UserMapper.xml"></mapper>
<mapper resource="DeptMapper.xml"></mapper>
</mappers>
</configuration>
測驗
package cn.tedu.test;
import cn.tedu.pojo.Dept;
import cn.tedu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test1 {
@Test
public void get() throws IOException {
//讀取組態檔
InputStream in = Resources.getResourceAsStream(
"mybatis-config.xml");
//創建會話工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(in);
//開啟會話,準備執行SQL
SqlSession session = factory.openSession();
//定位SQL(namespace的值.id的值),并執行
//selectOne執行查詢的SQL,并只會回傳一個結果
Object o = session.selectOne("userMapper.getById",2);
//User(id=1, name=hanmeimei, addr=北京, age=28)
System.out.println(o);
//定位SQL(namespace的值.id的值),并執行
//selectList執行查詢的SQL,并回傳多個結果
List<User> list = session.selectList("userMapper.getAll");
for(User u : list){
System.out.println(u);
}
//定位SQL(namespace的值.id的值),并執行,并給SQL傳入引數
User u = session.selectOne(
"userMapper.getByName","xiongda");
System.out.println(u);
//定位SQL(namespace的值.id的值)
Dept d = session.selectOne("deptMapper.getById");
System.out.println(d);
}
}
–3,改造
創建介面
package cn.tedu.dao;
import cn.tedu.pojo.Dept;
//介面的全路徑=映射檔案中namespace的值
//介面的方法名=映射檔案中id的值
public interface DeptMapper {
Dept getById();
}
改造映射檔案
<?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=介面的全路徑 -->
<mapper namespace="cn.tedu.dao.DeptMapper">
<!--id=介面里的方法名-->
<select id="getById" resultType="Dept">
select * from dept where id=1
</select>
</mapper>
改造測驗類
package cn.tedu.test;
import cn.tedu.dao.DeptMapper;
import cn.tedu.pojo.Dept;
import cn.tedu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test1 {
@Test
public void get() throws IOException {
//讀取組態檔
InputStream in = Resources.getResourceAsStream(
"mybatis-config.xml");
//創建會話工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(in);
//開啟會話,準備執行SQL
SqlSession session = factory.openSession();
//定位SQL(namespace的值.id的值),并執行
//selectOne執行查詢的SQL,并只會回傳一個結果
Object o = session.selectOne("userMapper.getById",2);
//User(id=1, name=hanmeimei, addr=北京, age=28)
System.out.println(o);
//定位SQL(namespace的值.id的值),并執行
//selectList執行查詢的SQL,并回傳多個結果
List<User> list = session.selectList("userMapper.getAll");
for(User u : list){
System.out.println(u);
}
//定位SQL(namespace的值.id的值),并執行,并給SQL傳入引數
User u = session.selectOne(
"userMapper.getByName","xiongda");
System.out.println(u);
//定位SQL(namespace的值.id的值)
// Dept d = session.selectOne("deptMapper.getById");
// System.out.println(d);
//獲取了指定的介面
DeptMapper mapper = session.getMapper(DeptMapper.class);
//呼叫介面里的方法
Dept dd = mapper.getById();
System.out.println(dd);
}
}
總結

五,練習介面開發
–1,修改 介面檔案
package cn.tedu.dao;
import cn.tedu.pojo.Dept;
import java.util.List;
//介面的全路徑=映射檔案中namespace的值
//介面的方法名=映射檔案中id的值
public interface DeptMapper {
Dept getById(); //根據id查
List<Dept> getByName(String dname);//根據名字查
void save(Dept dept);//新增部門記錄
}
–2,修改 映射檔案
<?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=介面的全路徑 -->
<mapper namespace="cn.tedu.dao.DeptMapper">
<!--新增部門記錄-->
<insert id="save">
insert into dept values(#{id},#{dname},#{loc})
</insert>
<select id="getByName" resultType="Dept">
select * from dept where dname=#{dname};
</select>
<!--id=介面里的方法名-->
<select id="getById" resultType="Dept">
select * from dept where id=1
</select>
</mapper>
–3,修改 測驗檔案
package cn.tedu.test;
import cn.tedu.dao.DeptMapper;
import cn.tedu.pojo.Dept;
import cn.tedu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test1 {
@Test
public void get() throws IOException {
//讀取組態檔
InputStream in = Resources.getResourceAsStream(
"mybatis-config.xml");
//創建會話工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(in);
//開啟會話,準備執行SQL
SqlSession session = factory.openSession();
//定位SQL(namespace的值.id的值),并執行
//selectOne執行查詢的SQL,并只會回傳一個結果
Object o = session.selectOne("userMapper.getById",2);
//User(id=1, name=hanmeimei, addr=北京, age=28)
System.out.println(o);
//定位SQL(namespace的值.id的值),并執行
//selectList執行查詢的SQL,并回傳多個結果
List<User> list = session.selectList("userMapper.getAll");
for(User u : list){
System.out.println(u);
}
//定位SQL(namespace的值.id的值),并執行,并給SQL傳入引數
User u = session.selectOne(
"userMapper.getByName","xiongda");
System.out.println(u);
//定位SQL(namespace的值.id的值)
// Dept d = session.selectOne("deptMapper.getById");
// System.out.println(d);
//獲取了指定的介面
DeptMapper mapper = session.getMapper(DeptMapper.class);
//呼叫介面里的方法
Dept dd = mapper.getById();
System.out.println(dd);
List<Dept> ds = mapper.getByName("java教研部");
for (Dept d : ds) {
System.out.println(d);
}
Dept dept = new Dept();
dept.setId(100).setDname("ios開發部").setLoc("上海");
mapper.save(dept);
//mybatis不會自動提交事務,增刪改需要自己提交事務
session.commit();
}
}
六,動態SQL
–1,概述
利用mybatis框架提供一些標簽,完成SQL的拼接
常用標簽 :
sql : 提取SQL片段
include : 引入指定的SQL片段
if : 用來判斷,滿足條件才拼接SQL
–2,修改映射檔案,實作動態SQL
<?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=介面的全路徑 -->
<mapper namespace="cn.tedu.dao.DeptMapper">
<!-- 提取SQL片段,提高SQL片段復用性 -->
<sql id="cols">
id,dname,loc
</sql>
<!-- 參考SQL片段 -->
<select id="getByName" resultType="Dept">
select
<include refid="cols"></include>
from dept
<if test="dname != null">
where dname=#{dname}
</if>
</select>
<!--id=介面里的方法名-->
<select id="getById" resultType="Dept">
select
<include refid="cols"></include>
from dept where id=1
</select>
<!--新增部門記錄-->
<insert id="save">
insert into dept values(#{id},#{dname},#{loc})
</insert>
</mapper>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294760.html
標籤:其他
