结构:

dao类:底层接口定义方法
entity类:实体类对应数据库表
test类:测试类
resources:配置文件
UserMapper.xml:配置数据源和xml映射文件等
db.properties:配置数据库的驱动,url,账号,密码等
mybatis.xml:映射实体类和数据表,定义查询语句
架包:
<dependencies><!--mybatis架包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--MySQL架包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--该架包能将任何键值对转换为JSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><!--引用该架包能使用注解--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><!--分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.8</version></dependency>
mybatis.xml
<!--头部写死--><?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--引入数据库配置文件--><properties resource="db.properties"/><!--配置输出日志--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置数据源--><environments default="dev"><!--default:指定生效的数据源--><environment id="dev"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${deiverClass}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--xml映射文件--><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers></configuration>
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">
<mapper namespace="dao.UserDao">
<!--手动映射实体类和数据库表-->
<resultMap id="resultmap" type="entity.User">
<result property="name" column="username"></result>
</resultMap>
<!--id:接口里面定义的方法 resultType:结果的类型-->
<!--resultMap:自定义 resultType:默认-->
<!--全查询-->
<select id="findAll" resultMap="resultmap">
select * from users
</select>
<!--根据id查询-->
<select id="findByid" resultMap="resultmap">
select * from users where id=#{一个参数随便写}
</select>
<!--添加-->
<insert id="add">
insert into users values (#{id},#{name},#{age},#{address})
</insert>
<!--修改-->
<update id="update">
update users set username=#{name} where id=#{id}
</update>
<!--删除-->
<delete id="delete">
delete from users where id=#{一个参数随便写}
</delete>
</mapper>
db.properties
deiverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
user=root
password=root
UserDao接口
public interface UserDao {
List<User> findAll();
User findByid (Integer id );
void add (User user);
void delete(Integer id);
void update(User user);
}
测试类
package test;
import com.alibaba.fastjson.JSON;
import dao.UserDao;
import entity.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyTest {
SqlSessionFactory factory=null;
//使用注解前必须先引入架包
@Before
public void init(){
try {
InputStream is= Resources.getResourceAsStream("mybatis.xml");
//创建SqlSessionFactory
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test1() {
//获取sqlsession
SqlSession session=factory.openSession();
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
List<User> all = userDao.findAll();
System.out.println(JSON.toJSONString(all));
}
@Test
public void test2() {
//获取sqlsession
SqlSession session=factory.openSession();
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
User byid = userDao.findByid(4);
System.out.println(JSON.toJSONString(byid));
}
@Test
public void test3() {
//获取sqlsession
SqlSession session=factory.openSession(true);
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
User user=new User(4,"小名",23,"北京");
userDao.add(user);
//手动提交事务,如果factory.openSession(true)则不用手动提交
/*session.commit();*/
}
@Test
public void test4() {
//获取sqlsession
SqlSession session=factory.openSession(true);
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
User user=new User();
user.setName("lis");
user.setId(1);
userDao.update(user);
//手动提交事务,如果factory.openSession(true)则不用手动提交
/*session.commit();*/
}
@Test
public void test5() {
//获取sqlsession
SqlSession session=factory.openSession(true);
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
userDao.delete(3);
//手动提交事务,如果factory.openSession(true)则不用手动提交
/*session.commit();*/
}
}
user实体类
package entity;
public class User {
private Integer id;
private String name;
private Integer age;
private String address;
public User() {
}
public User(Integer id, String name, Integer age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
自定义工厂对象
如果项目中有属性在数据库中没有对应的实体,则需要手动映射
1.新建自定义工厂对象
2.配置自定义工厂对象mybatis.xml
factory.MyFactory
package factory;
import entity.User;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
/**
* @author Huang_X 2021/10/29 10:02
* @version v1.0
* 自定义工厂对象
*/
public class MyFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
System.out.println("进入了自定义的工厂对象");
if (type.equals(User.class)){
//super.cerate(type):表示调用User类的无参构造创建对象
User user= (User) super.create(type);
user.setPassword("1234");
return (T) user;
}
return super.create(type);
}
}
mybatis.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>
<!--引入数据库配置文件-->
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases >
<typeAlias type="entity.User" alias="user"/>
</typeAliases>
<!--=========================================================-->
<!--配置自定义工厂对象-->
<objectFactory type="factory.MyFactory"></objectFactory>
<!--=========================================================-->
<!--拦截器插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="page" value="mysql"/>
</plugin>
</plugins>
<!--配置数据源-->
<environments default="dev">
<!--default:指定生效的数据源-->
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${deiverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--xml映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
分页插件
拦截器插件mybatis.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>
<!--引入数据库配置文件-->
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases >
<typeAlias type="entity.User" alias="user"/>
</typeAliases>
<!--配置自定义工厂对象-->
<objectFactory type="factory.MyFactory"></objectFactory>
<!--========================================================================================-->
<!--拦截器插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="page" value="mysql"/>
</plugin>
</plugins>
<!--========================================================================================-->
<!--配置数据源-->
<environments default="dev">
<!--default:指定生效的数据源-->
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${deiverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--xml映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
test测试类
@Test
public void test1() {
//获取sqlsession
SqlSession session=factory.openSession();
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
PageHelper.startPage(1,3);//设置查看页数和每页记录条数
Page<User> all = userDao.findAll();
System.out.println(JSON.toJSONString(all));
}
带条件分页
修改SQL语句
<!--全查询-->
<select id="findAll" resultMap="resultmap">
select * from users where username like concat("%",#{name},"%")
</select>
传值
@Test
public void test1() {
//获取sqlsession
SqlSession session=factory.openSession();
//获取接口实例
UserDao userDao=session.getMapper(UserDao.class);
PageHelper.startPage(1,2);
Page<User> all = userDao.findAll("小名");
System.out.println(JSON.toJSONString(all));
}
