【SSM框架】Mybatis笔记 --- MyBatis 中应用动态代理;#{}占位符与${}占位符;执行DML后返回主键值;UUID
讲义:
一、动态代理:
1、动态代理存在的意义:
在三层架构中,业务逻辑层要通过接口访问数据访问层的功能,动态代理可以实现。
2、动态代理的实现规范:
1)UsersMapper.xml 文件与 UsersMapper.java 接口必须在同一个目录下。
2)UsersMapper.xml 文件与 UsersMapper.java 的接口的文件名必须一致,后缀不管。
3)UsersMapper.xml 文件中标签的 id 值与 UsersMapper.java 的接口中方法的名称完全一致。
4)UsersMapper.xml 文件中标签的 parameterType 属性值与 UsersMapper.java 的接口中方法的参数类型完全一致。
5)UsersMapper.xml 文件中标签的 resultType 值与 UsersMapper.java 的接口中方法的返回值类型完全一致。
6)UsersMapper.xml 文件中 namespace 属性必须是接口的完全限定名称 com.baidu.mapper.UsersMapper(例子)。
7)SqlMapConfig.xml 文件中注册 mapper 文件时,使用 class 属性等于接口的完全限定名称 com.baiud.mapper.UsersMapper(例子)。或者直接批量注册 mapper.xml文件。
3、动态代理访问的步骤(举栗子):
1)建表 Users
2)新建 maven工程,刷新数据库可视化
3)修改目录
4)修改pom.xml文件,添加依赖
5)添加jdbc.propertis文件到resources目录下
6)添加SqlMapConfig.xml文件
7)添加实体类
8)新建mapper文件夹,在其下新建UsersMapper接口
9)在mapper文件夹下,新建UsersMapper.xml文件,完成增删改查功能
10)添加测试类,测试功能
二、占位符:
1、#{}占位符:
1)传参大部分使用 #{} ,它的底层使用的是 PreparedStatement 对象,是安全的数据库访问 ,可以防止sql注入。
2)#{}里如何写,看parameterType参数的类型:
- 如果 parameterType 的类型是简单类型(8种基本【封装】+ String),则#{}里随便写。
- 如果 parameterType 的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写.。
2、${}字符串:
1)${}字符串可以用于字符串拼接,一般用于模糊查询中(因为有sql注入的风险,很少用)。
2)${}里如何写,也分两种情况,同样看 parameterType 的类型:
- 如果 parameterType 的类型是简单类型,则${}里随便写,但是分版本,如果是 3.5.1 及以下的版本,只以写value。
- 如果 parameterType 的类型是实体类的类型,则${}里只能是类中成员变量的名称(很少用)。
3)字符串替换:
- 需求:根据用户名或者地址查询 user 信息:
预想执行的sql语句1或者语句2:
select * from users where username like '%小%';
select * from users where address like '%市%';
UsersMapper 接口中的方法(通过@Param 可以使UsersMapper.xml 文件取出对应的 columName 和 columnValue):
//模糊用户名和地址查询
List<User> selectByNameOrAddress(
@Param("columnName")
String columnName,
@Param("columnValue")
String columnValue);
UsersMapper.xml 中对应的select:
<!--如果参数超过一个,则parameterType不写-->
<select id="selectByNameOrAddress" resultType="user">
select id,username,birthday,sex,address
from users
where ${columnName} like concat('%',#{columnValue},'%')
</select>
这样就可以调用一个方法,通过输入不同的字段名称,来进行不同的字段模糊查询。
@Test
public void testSelectByNameOrAddress() {
List<User> userList1 = usersMapper.selectByNameOrAddress(
"username","小");
List<User> userList2 = usersMapper.selectByNameOrAddress(
"address","上");
userList1.forEach(user -> System.out.println(user));
userList2.forEach(user -> System.out.println(user));
}
三、执行增删改语句后返回主键值:
- 在插入语句结束后,返回自增的主键值到入参的user象的id属性中(之后就可以通过#{id}来获取属性id了)。
1、UsersMapper.xml 文件中的栗子:
<insert id="insertPro" parameterType="user">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into users (username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
</insert>
2、<selectKey>标签中的参数详解:
keyProperty:user 对象的哪个属性来接返回的主键值。
resultType:返回的主键的类型。
order:在插入语句执行前(BEFORE),还是执行后(AFTER)返回主键的值。
四、UUID:
- 这是一个全球唯一随机字符串,由36个字母数字中划线组成。Java 中有UUID类,mysql 中也有相应的函数。
java 栗子:
@Test
public void testUUID() {
UUID uuid = UUID.randomUUID();
//36位带横线
System.out.println(uuid);
//32位不带横线
System.out.println(uuid.toString().replace("-",""));
//12位不带横线
System.out.println(uuid.toString().replace("-","").substring(20));
}
sql 栗子:
select UUID();
一堆栗子:
1、module 目录结构:
2、建表语句:
use ssm;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`userName` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
`userIdentity` tinyint(1) NOT NULL,
`balance` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin
3、pom.xml:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.burning</groupId>
<artifactId>mybatis_002_users</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--添加mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<!--指定资源文件位置-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
4、jdbc.properties:
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=888
5、SqlMapConfig.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>
<!--读取jdbc.properties属性-->
<properties resource="jdbc.properties"></properties>
<!--设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--注册实体类别名-->
<typeAliases>
<package name="org.burning.entity"/>
</typeAliases>
<!--配置环境变量-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--注册mapper.xml文件-->
<mappers>
<!--单个注册-->
<!--<mapper class="org.burning.mapper.UsersMapper"></mapper>-->
<!--批量注册-->
<package name="org.burning.mapper"/>
</mappers>
</configuration>
6、User.java:
package org.burning.entity;
import java.util.Date;
public class User {
private Integer id;
private String userName;
private Date birthday;
private String sex;
private String address;
public User() {
}
public User(Integer id, String userName, Date birthday, String sex, String address) {
this.id = id;
this.userName = userName;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
public User(String userName, Date birthday, String sex, String address) {
this.userName = userName;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
7、UsersMapper.java:
package org.burning.mapper;
import org.apache.ibatis.annotations.Param;
import org.burning.entity.User;
import java.util.List;
/**
* 数据访问层的接口,规定的数据库中可进行的各种操作
*/
public interface UsersMapper {
//查询用户全部信息
List<User> getAll();
//根据用户主键查用户
User selectById(Integer id);
//根据用户名模糊查询用户
List<User> selectByName(String userName);
//用户的更新
int updateById(User user);
//增加用户
int insert(User user);
//根据主键删除用户
int deleteById(Integer id);
//优化后的模糊查询
List<User> selectByNamePro(String userName);
//模糊用户名和地址查询
List<User> selectByNameOrAddress(
@Param("columnName")
String columnName,
@Param("columnValue")
String columnValue);
//增加用户,并获得新增用户的id到入参中
int insertPro(User user);
}
8、UsersMapper.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="org.burning.mapper.UsersMapper">
<select id="getAll" resultType="user">
select id,username,birthday,sex,address
from users
</select>
<select id="selectById" parameterType="int" resultType="user">
select id,username,birthday,sex,address
from users
where id=#{id}
</select>
<select id="selectByName" parameterType="string" resultType="user">
select id,username,birthday,sex,address
from users
where username like '%${userName}%'
</select>
<update id="updateById" parameterType="user">
update users set username=#{userName},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
<insert id="insert" parameterType="user">
insert into users (username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
</insert>
<delete id="deleteById" parameterType="int">
delete from users
where id=#{id}
</delete>
<select id="selectByNamePro" parameterType="string" resultType="user">
select id,username,birthday,sex,address
from users
where username like concat('%',#{userName},'%')
</select>
<select id="selectByNameOrAddress" resultType="user">
select id,username,birthday,sex,address
from users
where ${columnName} like concat('%',#{columnValue},'%')
</select>
<insert id="insertPro" parameterType="user">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into users (username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
</insert>
</mapper>