MyBatis_2

摘要:
xmlversion=“1.0”encoding=“UTF-8”?˃˂!

目录

使用接口结合xml文件

数据库表与实体类创建


create database mybatis;
use mybatis;
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME
VARCHAR(20), age INT);
INSERT INTO users(NAME, age) VALUES('Tom', 12);
INSERT INTO users(NAME, age) VALUES('Jack', 11);


public class User {
    private int id;
    private String name;
    private int age;
    //get,set 方法 无参与有参的构造方法创建
}

Users的操作类

public interface UsersDao{
    public Users getUser(int id)
}

Users映射文件

新建映射文件UsersMapper

<?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">
//com.huangwei.lb包名
<mapper namespace="com.huangwei.lb.dao.UsersDao">
    <select   paramterType="int" resultType="com.huangwei.lb.bean.Users">
        select * from users where id = #{id}
    </select>
</mapper>

测试

新建一个测试类

//com.huangwei.lb包名
class UsersTest{
    static SqlSession session = null;
    final String str = "com.huangwei.lb.mapper.UsersMapper.";
    static UsersDao usesDao = null;
    @BeforeAll
    static void setUpBeforeClass() throws Exception {
          Reader reader = Resources.getResourceAsReader("config.xml");
          SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
          session = sessionFactory.openSession();
          usersDao = session.getMapper(UsersDao.class);
     }
    @Test
    void testFindAll(){
        Users users = usersDao.getUser(1);
    }
}

解决字段与属性不匹配(以Order表为例)

数据库表与实体类创建


CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);
INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);
INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);


public class Order {
    private int id;
    private String orderNo;
    private float price;
   //get,set 方法 无参与有参的构造方法创建
}

通过给查询字段起别名,要求别名与属性名一致


<select   parameterType="int" resultType="_Order">
    select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
</select>

使用resultMap标签来定义实体类与字段之间的关系


<select   parameterType="int" resultMap="orderResultMap">
    select * from orders where order_id=#{id}
</select>
<resultMap type="_Order" id="orderResultMap">
    <id property="id" column="order_id"/>
    <result property="orderNo" column="order_no"/>
    <result property="price" column="order_price"/>
</resultMap>

实现链表查询【根据班级ID查询班级信息(带有老师信息)】

数据库表与实体类创建


CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(20)
);
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id)
REFERENCES teacher(t_id);
INSERT INTO teacher(t_name) VALUES('LS1');
INSERT INTO teacher(t_name) VALUES('LS2');
INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);


public class Teacher {
    private int id;
    private String name;
//get,set 方法 无参与有参的构造方法创建
}
public class Classes {
    private int id;
    private String name;
    private Teacher teacher;
//get,set 方法 无参与有参的构造方法创建
}

定义 sql 映射文件 ClassMapper.xml

方法一:通过联表查询


<select   parameterType="int" resultMap="ClassResultMap">
    select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
</select>
<resultMap type="_Classes" id="ClassResultMap">
    <id property="id" column="c_id"/>
    <result property="name" column="c_name"/>
    <association property="teacher" column="teacher_id" javaType="_Teacher">
        <id property="id" column="t_id"/>
        <result property="name" column="t_name"/>
    </association>
</resultMap>

方法二:通过嵌套查询


<select   parameterType="int" resultMap="ClassResultMap2">
    select * from class where c_id=#{id}
</select>
<resultMap type="_Classes" id="ClassResultMap2">
    <id property="id" column="c_id"/>
    <result property="name" column="c_name"/>
    <association property="teacher" column="teacher_id" javaType="_Teacher" select="getTeacher"></association>
</resultMap>
<select   parameterType="int" resultType="_Teacher">
    SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
</select>

19c2837969000cb1398c3947d7b74313.png

测试

@Test
public void testOO() {
SqlSession sqlSession = factory.openSession();
Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass",1);
System.out.println(c);
}
@Test
public void testOO2() {
SqlSession sqlSession = factory.openSession();
Classes c =
sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass2", 1);
System.out.println(c);
}

实现一对多关联【根据 classId 查询对应的班级信息,包括学生,老师】

数据库表与实体类创建


CREATE TABLE student(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(20),
class_id INT
);
INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);


public class Student {
    private int id;
    private String name;
    //get,set 方法 无参与有参的构造方法创建
}
public class Classes {
    private int id;
    private String name;
    private Teacher teacher;
    private List<Student> students;
    //get,set 方法 无参与有参的构造方法创建
}

定义 sql 映射文件 ClassMapper.xml

**方法一:联表查询


<select   parameterType="int" resultMap="ClassResultMap3">
    select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="_Classes" id="ClassResultMap3">
    <id property="id" column="c_id"/>
    <result property="name" column="c_name"/>
    <association property="teacher" column="teacher_id" javaType="_Teacher">
        <id property="id" column="t_id"/>
        <result property="name" column="t_name"/>
    </association>
<!-- ofType 指定 students 集合中的对象类型 -->
    <collection property="students" ofType="_Student">
        <id property="id" column="s_id"/>
        <result property="name" column="s_name"/>
    </collection>
</resultMap>

**方法二:嵌套查询


<select   parameterType="int" resultMap="ClassResultMap4">
    select * from class where c_id=#{id}
</select>
<resultMap type="_Classes" id="ClassResultMap4">
    <id property="id" column="c_id"/>
    <result property="name" column="c_name"/>
    <association property="teacher" column="teacher_id" javaType="_Teacher" select="getTeacher2"></association>
    <collection property="students" ofType="_Student" column="c_id" select="getStudent"></collection>
</resultMap>
<select   parameterType="int" resultType="_Teacher">
    SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
</select>
<select   parameterType="int" resultType="_Student">
    SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
</select>

测试


@Test
public void testOM() {
    SqlSession sqlSession = factory.openSession();
    Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass3",1);
    System.out.println(c);
}
@Test
public void testOM2() {
    SqlSession sqlSession = factory.openSession();
    Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass4",1);
    System.out.println(c);
}

462ed527a44571647a5159280a4936e8.png

$与#的区别

"$"中的变量就是直接替换成值的,实际用于字符串拼接。
一般用于传入数据库对象
"#" 则是根据变量的类型来替换
一般用于传入增删改查的where条件

在同时可用#和$是,建议使用#

免责声明:文章转载自《MyBatis_2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php变量和字符串连接符——点MAMP、wordpress安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

thinkphp5.0学习笔记(三)

1、thinkphp5的数据库操作 连接数据库库的方式   a、配置文件定义:配置文件位于applicationdatabase.php, 访问:$db::table('user')->select();   b、方法配置 Db::connect([ // 数据库类型 'type' => 'mysql',...

PostgreSQL和Oracle的sql差异

PostgreSQL和Oracle的sql差异   1.rownum (1)Oracle分页查询使用rownum,PostgreSQL使用limit offset ORACLE POSTGRESQL select * from (select rownum r,e.* from emp e where rownum <=5) t where...

MySQL查询大小写是否敏感问题分析

mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的。  1. 什么是字符集和校验规则? 字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则。要想列出一个字符集的校对规则,使用...

Oracle查询用户权限角色(dba_sys_privs) (转)

Oracle查询用户权限 (转自:CSDN) 数据字典 1、动态数据字典是以v$xxx开始的数据字典,在数据库中约有150个左右,这些数据字典反映数据库动态运行状况,在不同时间查询会得到不同的结果。 2、DBA数据字典是以DBA_xxx表示,该数据字典存储数据库结构,查询DBA数据字典可以反映数据库结构设置,管理磁盘空间和表空间、事务与回退段、用户与表空间...

【转贴收藏】SQL常用语句,含查看数据库日志

--//清空日志checkpoint--//查看数据库日志select * from ::fn_dblog(null,null)select * from ::fn_dblog(null,null) where [current lsn]>='000001ae:00000074:0001' and [current lsn]<= '00000...

Mysql运维管理-Mysql增量备份及分库分表备份数据恢复实战12

1. MySQL数据库的备份与恢复 1.1 Mysqldump的工作原理? 利用mysqldump命令备份的过程,实际上就是把数据从mysql库里以逻辑的sql语句的形式直接输出或者生成备份的文件的过程。 备份的数据过滤注释都是sql语句,结果如下: [root@localhost opt]# egrep -v "#|*|--|^$" /opt/mysql...