文章目录
1.mybatis依赖导入
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
2.db.properties数据库配置
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://你的数据库?useSSL=false&characterEnding=utf8&serverTimezone=Asia/Shanghai
mysql.username=用户名
mysql.password=密码
3.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"/>
<typeAliases>
<!--单个类取别名-->
<!-- <typeAlias type="model.User" alias="user"></typeAlias>-->
<!--包下的所有类取别名,别名全为类名,且不再区分大小写-->
<!--如果这里你没有配置上面一个或者下面一个时,name你的resultType和paramType则需要是你所需要返回的类的全类名;也就是完整包名+类名-->
<package name="model"/>
</typeAliases>
<!--这里是自定义的一个处理器,可忽略-->
<typeHandlers>
<typeHandler handler="handler.PhoneNumberHandler"/>
</typeHandlers>
<!-- 设置⼀个默认的连接环境信息 -->
<environments default="mysql_developer">
<!-- 连接环境信息,取⼀个任意唯⼀的名字 -->
<environment id="mysql_developer">
<!-- mybatis使⽤jdbc事务管理⽅式 -->
<transactionManager type="jdbc"/>
<!-- mybatis使⽤连接池⽅式来获取连接 -->
<dataSource type="pooled">
<!-- 配置与数据库交互的4个必要属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--这里需要对你所使用的接口对应的xml文件进行关联-->
<mapper resource="mapper/UserDao.xml"/>
<mapper resource="mapper/AddressDao.xml"/>
</mappers>
</configuration>
4.SQLSession工具类
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 java.io.IOException;
import java.io.Reader;
/**
* @Description:
* @Author one world
* @Date 2020/10/9 0009 15:59
*/
public final class MybatisUtil0 {
private static SqlSessionFactory sqlSessionFactory = null;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession==null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession!=null){
sqlSession.close();
//这里移除的是当前线程里的值,这里就是SqlSession
threadLocal.remove();
}
}
}
5.实体类创建
表结构:
CREATE TABLE `address` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '地址编号',
`user_id` int NOT NULL COMMENT '用户id',
`shipping` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货地址',
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货人姓名',
`phone` char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电话',
PRIMARY KEY (`id`) USING BTREE,
KEY `FK_address_id_user_id` (`user_id`) USING BTREE,
CONSTRAINT `FK_address_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='地址表';
import java.io.Serializable;
/**
* @Description:
* @Author one world
* @Date 2020/9/23 0023 10:04
*/
public class Address implements Serializable {
private int user_id;
private int id;
private String shipping;
private String name;
private String phone;
public Address(int id, int user_id, String shipping, String name, String phone) {
this.id = id;
this.user_id = user_id;
this.shipping = shipping;
this.name = name;
this.phone = phone;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getShipping() {
return shipping;
}
public void setShipping(String shipping) {
this.shipping = shipping;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Address{" +
"id=" + id +
", user_id=" + user_id +
", shipping='" + shipping + '\'' +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
public Address(int user_id, String shipping, String name, String phone) {
this.user_id = user_id;
this.shipping = shipping;
this.name = name;
this.phone = phone;
}
public Address() {
}
}
6.Mapper接口
import model.Address;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Description:
* @Author one world
* @Date 2020/9/23 0023 10:37
*/
public interface AddressDao {
/**
* 分页查询所有
* @param currentPage
* @param limit
* @return List
*/
public List<Address> findAll(@Param("page") Integer currentPage, @Param("limit") Integer limit);
/**
* 查询所有
* @return List
*/
public List<Address> findAll();
/**
* 根据主键查询实体
* @param id
* @return T
*/
public Address findByPK(int id);
/**
* 根据主键删除
* @param id
* @return true/false
*/
public boolean delByPK(int id);
/**
* 添加
* @param address
* @return true/false
*/
public boolean add(Address address);
/**
* 更新
* @param address
* @return true/false
*/
public boolean update(Address address);
/**
* 根据用户ID查找地址
* @param id
* @return List<Address>
*/
public List<Address> findByUserId(int id);
/**
* 通过订单编号查找地址
* @param order_no
* @return Address
*/
public Address findByOrderNo(String order_no);
}
7.创建AddressDao.xml配置文件,与接口名相同(本质相当于我们之前的UserDaoImpl实现类)
<?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="mapper.AddressDao">
<resultMap type="address" id="addressMap">
<!-- id标签:映射主键属性
result标签:映射⾮主键属性
property属性:实体的属性名
column属性:表的字段名
-->
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
<result property="shipping" column="shipping"/>
<result property="name" column="name"/>
<result property="phone" column="phone"/>
</resultMap>
<!--增删改查标签中的id对应接口中的方法名,注意:参数类型和返回值类型也要与接口的相同-->
<insert id="add" parameterType="address">
INSERT INTO address (user_id,shipping,name,phone) VALUES(#{user_id},#{shipping},#{name},#{phone});
</insert>
<delete id="delByPK" parameterType="int">
DELETE FROM address WHERE id=#{id};
</delete>
<update id="update" parameterType="address">
UPDATE address SET user_id=#{user_id},shipping=#{shipping},name=#{name},phone=#{phone} where id=#{id};
</update>
<select id="findByPK" parameterType="int" resultType="address">
SELECT * FROM address WHERE id = #{id};
</select>
<select id="findAll" parameterType="int" resultType="address">
SELECT * FROM address limit ${(page-1)*limit},#{limit};
</select>
<select id="findByUserId" parameterType="int" resultType="address">
SELECT * FROM address WHERE user_id=#{user_id};
</select>
<select id="findByOrderNo" parameterType="String" resultType="address">
SELECT address.* FROM address LEFT JOIN orders ON address.id=orders.address_id WHERE order_no=#{order_no}
</select>
</mapper>
8.测试
import mapper.AddressDao;
import model.Address;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisUtil;
/**
* @Description:
* @Author one world
* @Date 2020/10/10 0010 12:53
*/
public class TestAddressDao {
//通过Mapper接口,这里没有关闭sqlSession,在用完以后是需要关闭的
private static AddressDao dao = MybatisUtil.getSqlSession().getMapper(AddressDao.class);
public static void main(String[] args) {
testFindAll2(1);
}
//方式1:使用Mapper接口
public static void testFindAll(int id){
System.out.println(dao.findByPK(id));
}
//方式2.不使用Mapper接口,直接用sqlSession提供的接口
public static void testFindAll2(int id){
//这里的mapper.addressDao是AddressDao.xml文件顶部的namespace,而findByPk是select标签中的id值;其对应的SQL语句为通过id查询地址的语句
Address address =MybatisUtil.getSqlSession().selectOne("mapper.AddressDao.findByPK",id);
System.out.println(address);
}
//方式3:注解,不推荐使用,此处省略
}
9.需要注意的点:
建议java目录中的mapper和resources下的mapper位置相同;且java目录中的xxx.java接口与resources下的xxx.xml配置文件名相同
如图: