目录
一、动态代理实现规范:
接口的实现类由mybatis动态生成:
1.动态代理 2.javassist动态代理
- UsersMapper.xml文件与UsersMapper.java的接口必须同一个目录下。
- UsersMapper.xml文件与UsersMapper.java的接口的文件名必须一致。
- UserMapper.xml文件中标签的id值与UserMapper.java的接口中方法名完全一致。
- UserMapper.xml文件中标签的parameterType属性值与与UserMapper.java的接口中方法的参数类型完全一致。
- UserMapper.xml文件中标签的resultType值与与UserMapper.java的接口中方法的返回值类型完全一致。
- UserMapper.xml文件中namespace属性必须是接口的完全限定类名 。
- 在SqlMapConfig.xml文件中注册mapper文件时,使用class=接口的完全限定类名 。
二、具体步骤:
- 新建库建表。
- 新建maven项目,选quickstart模板。
- 修改目录,添加缺失的目录。
- 修改pom.xml文件,添加MyBatis的依赖,添加mysql的依赖。
- 修改pom.xml文件,添加资源文件指定。
- 添加jdbc.properties属性文件(数据库的配置)。
- 添加SqlMapConfig.xml文件,MyBatis的核心配置文件。
- 创建实体类User,用来封装数据。
- 添加完成学生表的增删改查的功能的UsersMapper.xml文件,新建UsersMapper接口,两个文件必须在同一文件夹下。
- 创建测试类,进行功能测试。
三、项目结构:Maven项目
四、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>com.user</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>
<!--添加mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<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.6</version>
</dependency>
</dependencies>
<!--添加资源文件的指定-->
<!--如果不添加资源文件指定,默认只编译src/main/resources下的资源文件-->
<build>
<resources>
<!--src/main/java下的xml和properties文件在编译时都会被加到编译目录下-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<!--src/main/resources下的xml和properties文件在编译时都会被加到编译目录下-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
五、SqlMapConfig.xml文件:
- 此文件是MyBatis的核心配置文件,必须有,且只能有一个。
- 此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
<!--前四行格式固定,直接复制粘贴-->
<?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属性文件
属性:
resources:从resources目录下找指定名称的文件加载
url:使用绝对路径加载属性文件
-->
<properties resource="jdbc.properties"></properties>
<!--设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--注册实体类别名
标签:
package:为该包下所有类注册别名
typeAlias:为单个类注册别名
-->
<typeAliases>
<package name="com.user.pojo"/>
</typeAliases>
<!--配置数据库的环境变量(数据库连接配置)
属性:
default:使用下面的environment标签的id属性进行指定配置
-->
<environments default="development">
<!--
<environment>标签可以有多个,使用哪个就将default设成哪个id的值。
一个<environment>对应一个SqlSessionFactory对象,一个SqlSessionFactory对象对应一个数据库。
-->
<environment id="development">
<!--配置事务管理器
属性:
type:指定事务管理的方式{
"JDBC":事务的控制交给程序员处理
"MANAGED":事务的控制由容器(Spring)来管理
}
-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,为程序提供Connection对象。
数据源在JDK中实际上是一套规范,,我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。
常见数据源组件:druid德鲁伊连接池。
type:指定不同的配置方式{
"JNID":java命名目录接口,在服务器端进行数据库连接池管理
"POOLED":使用数据库连接池
"UNPOOLED":不使用数据库连接池
}
-->
<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文件,使Mybatis能找到这些文件
属性:
resources:从resources目录下找指定名称的文件注册
url:使用绝对路径注册文件
class:动态代理方式下的注册,接口的全限定类名
-->
<mappers>
<!--使用动态代理,这里属性需要class=业务接口,不使用动态代理这里属性需要指定resource=xml文件-->
<!--使用批量注册这里使用package标签,表示包内的所有xml文件都被注册-->
<mapper class="com.user.mapper.UsersMapper"></mapper>
<!--这里是批量注册,表示com.user.mapper包下的所有文件都被注册-->
<package name="com.user.mapper"></package>
</mappers>
</configuration>
六、UsersMapper.xml文件:
- sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
- 可以有多个Mapper.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:指定命名空间(相当于包名),用来区分不同mapper.xml文件
-->
<!--标签中写具体语句,非动态代理这里的namespace可随便写,动态代理下必须写业务接口的全限定类名-->
<mapper namespace="com.user.mapper.UsersMapper">
<!--完成查询全部学生的功能
List<Student> getAll();
属性:
id:方法名,后续通过这个id调用sql语句
resultType:指定查询返回的结果集的类型,必须是全限定类名,因为要通过反射创建类对象。如果是集合,则必须是泛型,注意!!!。
parameterType:指定传入参数的类型
-->
<select id="getAll" resultType="user">
select id,username,birthday,sex,address
from users;
</select>
<!--按主键id查询学生信息
Student getById(Integer id);
-->
<select id="getById" parameterType="Integer" resultType="user">
select id,username,birthday,sex,address
from users
where id = #{id};
</select>
<!--按学生名模糊查询学生信息
List<Student> getByName(String name);
-->
<select id="getByName" parameterType="String" resultType="user">
select id,username,birthday,sex,address
from users
where username like "%${name}%";
</select>
<!--更新学生信息
int update(Student stu);
增删改不需要写resultType,mybatis内部自己写了
-->
<update id="update" parameterType="user">
/*这里的参数是user类中的属性*/
update users set username = #{userName},birthday = #{birthday},sex = #{sex},address = #{address}
where id = #{id};
</update>
<!--增加学生
int insert(Student stu);
增删改不需要写resultType,mybatis内部自己写了
-->
<insert id="insert" parameterType="user">
/*这里的参数是user类中的属性*/
insert into users(id,username,birthday,sex,address) value(#{id},#{userName},#{birthday},#{sex},#{address});
</insert>
<!--按主键删除学生
int delete(Integer id);
增删改不需要写resultType,mybatis内部自己写了
-->
<delete id="delete" parameterType="Integer">
delete from users where id = #{id};
</delete>
</mapper>
七、UsersMapper.java接口:
- 业务接口,与UsersMapper.xml文件绑定。
- 可以通过接口中的方法动态代理获取UsersMapper.xml文件中的标签。
package com.user.mapper;
import com.user.pojo.User;
import java.util.List;
/*数据访问层的接口,规定了数据库中可进行的各种操作*/
public interface UsersMapper {
//查询全部用户信息
List<User> getAll();
//根据用户主键查用户
User getById(int id);
//根据用户名模糊查询
List<User> getByName(String name);
//更新用户信息
int update(User user);
//增加用户
int insert(User user);
//根据主键删除用户
int delete(int id);
}
八、User类:
- 作为JavaBean类。
- 用来封装数据。
package com.user.pojo;
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 + '\'' +
'}';
}
}
九、MyTest类:
- 测试类,动态代理方式通过UsersMapper接口执行我们在UsersMapper.xml中写的sql语句。
- 其中查询语句固定格式五步,增删改固定格式六步。
- 使用@Before和@After降低程序耦合度
package com.user;
import com.user.mapper.UsersMapper;
import com.user.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/*
*代码格式固定
*/
public class MyTest {
SqlSession sqlSession;
@Before
public void openSqlSession() throws IOException {
//第一步:使用IO流读取核心配置文件SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//第二步:创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//第三步:取出SqlSession的对象
sqlSession = factory.openSession();
}
@After
public void closeSqlSession(){
//第五步:关闭SqlSession对象(还回到数据库连接池)
sqlSession.close();
}
@Test
public void testGetAll(){
/*
不使用动态代理:通过xml文件属性名为getAll的标签获取执行sql语句
List<Student> list = sqlSession.selectList("clh.getAll");
list.forEach(user -> System.out.println(user));
*/
//取出动态代理对象
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
//调用接口的方法执行sql语句
List<User> list = usersMapper.getAll();
list.forEach(user -> System.out.println(user));
}
@Test
public void testgetById(){
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
User user = usersMapper.getById(1);
System.out.println(user.toString());
}
@Test
public void testgetByName(){
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
List<User> list = usersMapper.getByName("张");
list.forEach(user -> System.out.println(user));
}
@Test
public void testupdate() throws ParseException {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
User user = new User(7,"王五",new SimpleDateFormat("yyyy-MM-dd").parse("2001-11-02"),"2","北京");
usersMapper.update(user);
sqlSession.commit();
}
@Test
public void testinsert() throws ParseException {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
User user = new User(8,"李根儿",new SimpleDateFormat("yyyy-MM-dd").parse("1995-11-02"),"1","北京");
usersMapper.insert(user);
sqlSession.commit();
}
@Test
public void testdelete() throws ParseException {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
usersMapper.delete(1);
sqlSession.commit();
}
}
十、jdbc.properties属性文件:
- 属性配置文件,封装了连接数据库的信息。
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=*******
jdbc.password=*******