mybatis快速入门

mybatis快速入门

数据准备

-- 创建db10数据库
CREATE DATABASE db10;

-- 使用db10数据库
USE db10;

-- 创建student表
CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	age INT,
	score INT
);

-- 添加数据
INSERT INTO student VALUES (NULL,'张三',23,99),(NULL,'李四',24,95),
(NULL,'王五',25,98),(NULL,'赵六',26,97);

在这里插入图片描述

idea准备

在这里插入图片描述

导包

在这里插入图片描述

配置文件

  • 建议放在类路径下
数据库基本信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db10
username=root
password=root
log4j配置文件
log4j.rootLogger=debug,A2

log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d [%t] %-5p %l - %m%n

#for file
log4j.appender.files.layout=org.apache.log4j.PatternLayout
log4j.appender.files.layout.ConversionPattern=%d [%t] %-5p %l - %m%n
log4j.appender.files=org.apache.log4j.RollingFileAppender
log4j.appender.files.File=D:/example.log
log4j.appender.files.MaxFileSize=1KB


#for database
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.URL=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.user=root
log4j.appender.db.password=2143
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%d [%t] %-5p %l - %m%n
log4j.appender.db.sql=INSERT INTO tbl_log (level,datetime,infomessage)  VALUES ('%-5p','%d','%m')
  • 在核心配置文件中引入
    <properties resource="jdbc.properties"/>
  • 使用${}
    在这里插入图片描述
核心配置文件
<?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 核心根标签-->
<configuration>

    <!--引入数据库连接的配置文件-->
    <properties resource="jdbc.properties"/>

    <!--配置log4j-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <!--<typeAlias type="imbrian.domainin.Student" alias="student"/>-->
        <package name="imbrian.domain"/>
    </typeAliases>

    <!--环境-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>
映射配置文件
<!-- <?xml version="1.0" encoding="UTF-8" ?> -->
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    mapper:核心跟标签
    namespace属性:名称空间
-->
<mapper namespace="StudentMapper">
    <!--
        select: 查询功能的标签
        id属性: 唯一标识
        resultType属性:指定结果映射对象类型
        parameterType属性:指定参数映射对象类型
    -->
    <select id="selectAll" resultType="student">
        SELECT * FROM student
    </select>

    <select id="selectById" resultType="student" parameterType="int">
        select * from student where id = #{id}
    </select>

    <insert id="insert" parameterType="student">
        insert into student values (#{id}, #{name}, #{age}, #{score})
    </insert>

    <update id="update" parameterType="student">
        update student set name = #{name}, age = #{age}, score = #{score} where id = #{id}
    </update>

    <delete id="delete" parameterType="int">
        delete from student where id = #{id}
    </delete>
</mapper>

编写代码

MyBatiesUtils
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.InputStream;

public class MyBatiesUtils {
    //私有构造方法
    private MyBatiesUtils(){}

    //声明变量
    private static SqlSessionFactory factory;

    //静态代码块中创建工厂对象
    static {
        try {
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //创建工厂对象
            factory = new SqlSessionFactoryBuilder().build(is);
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //提供方法
    public static SqlSession getSqlSession(boolean autoCommit){
        return factory.openSession(autoCommit);
    }
}
Student
public class Student {
    private int id;
    private String name;
    private int age;
    private int score;

    public Student() {
    }

    public Student(int id, String name, int age, int score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

StudentMapper
import imbrian.domain.Student;

import java.util.List;

/*
    持久层接口
 */
public interface StudentMapper {
    //查询全部
    public abstract List<Student> selectAll();

    //根据id查询
    public abstract Student selectById(Integer id);

    //新增数据
    public  abstract Integer insert(Student stu);

    //修改数据
    public abstract Integer update(Student stu);

    //删除数据
    public abstract Integer delete(Integer id);
}
StudentMapperImpl
import imbrian.domain.Student;
import imbrian.dao.mapper.StudentMapper;
import imbrian.utils.MyBatiesUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class StudentMapperImpl implements StudentMapper {
    /*
        查询全部
     */
    @Override
    public List<Student> selectAll() {
        //获取sqlSession对象
        SqlSession sqlSession = MyBatiesUtils.getSqlSession(true);

        //调用查询所有方法
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

        //释放资源
        if (sqlSession != null) {
            sqlSession.close();
        }
        return list;
    }

    @Override
    public Student selectById(Integer id) {
        //获取sqlSession对象
        SqlSession sqlSession = MyBatiesUtils.getSqlSession(true);

        //调用根据id查询方法
        Student stu = sqlSession.selectOne("StudentMapper.selectById", id);

        //释放资源
        if (sqlSession != null) {
            sqlSession.close();
        }
        return stu;
    }

    @Override
    public Integer insert(Student stu) {
        SqlSession sqlSession = MyBatiesUtils.getSqlSession(true);

        //调用添加方法
        int result = sqlSession.insert("StudentMapper.insert", stu);

        //释放资源
        if (sqlSession != null) {
            sqlSession.close();
        }
        return result;
    }

    @Override
    public Integer update(Student stu) {
        SqlSession sqlSession = MyBatiesUtils.getSqlSession(true);

        //调用修改方法
        int result = sqlSession.update("StudentMapper.update", stu);

        //释放资源,返回结果
        if (sqlSession != null) {
            sqlSession.close();
        }
        return result;
    }

    @Override
    public Integer delete(Integer id) {
        SqlSession sqlSession = MyBatiesUtils.getSqlSession(true);

        //调用删除方法
        int result = sqlSession.delete("StudentMapper.delete", id);

        //释放资源返回结果
        if (sqlSession != null) {
            sqlSession.close();
        }
        return result;
    }
}

StudentService
import imbrian.domain.Student;

import java.util.List;

public interface StudentService {
    //查询全部
    public abstract List<Student> selectAll();

    //根据id查询
    public abstract Student selectById(Integer id);

    //新增数据
    public abstract Integer insert(Student stu);

    //修改数据
    public abstract Integer update(Student stu);

    //删除数据
    public abstract Integer delete(Integer id);
}

StudentServiceImpl
import imbrian.domain.Student;
import imbrian.dao.mapper.StudentMapper;
import imbrian.dao.mapper.impl.StudentMapperImpl;
import imbrian.service.StudentService;

import java.util.List;

/*
    业务层实现类
 */
public class StudentServiceImpl implements StudentService {

    //创建持久层对象
    private StudentMapper mapper = new StudentMapperImpl();
    @Override
    public List<Student> selectAll() {
        return mapper.selectAll();
    }

    @Override
    public Student selectById(Integer id) {
        return mapper.selectById(id);
    }

    @Override
    public Integer insert(Student stu) {
        return mapper.insert(stu);
    }

    @Override
    public Integer update(Student stu) {
        return mapper.update(stu);
    }

    @Override
    public Integer delete(Integer id) {
        return mapper.delete(id);
    }
}

StudentController
import imbrian.domain.Student;
import imbrian.service.StudentService;
import imbrian.service.impl.StudentServiceImpl;
import org.junit.Test;

import java.util.List;

/*
    控制层测试类
 */
public class StudentController {
    //创建业务层对象
    private StudentService service = new StudentServiceImpl();

    //查询全部功能测试
    @Test
    public void selectAll(){
        List<Student> students = service.selectAll();
        for (Student student : students) {
            System.out.println(student);
        }
    }

    //根据id查询功能测试
    @Test
    public void selectById(){
        Student stu = service.selectById(3);
        System.out.println(stu);
    }

    //新增功能测试
    @Test
    public void insert() {
        Student student = new Student(5, "钱七", 26, 88);
        Integer result = service.insert(student);
        System.out.println(result);
    }

    //修改功能测试
    @Test
    public void update(){
        Student student = new Student(5, "钱七", 23, 90);
        Integer result = service.update(student);
        System.out.println(result);
    }

    //删除功能测试
    @Test
    public void delete() {
        Integer result = service.delete(5);
        System.out.println(result);
    }
}

注意: mybatis是一个半ORM框架。

1.映射配置文件

1.1 mapper标签

mapper是根标签,上面有namespace(命名空间)属性,namespace的作用是多个映射配置文件的唯一标识。

1.2 select子标签

用来进行编写查询的sql语句的。

属性:

  • id : 唯一标识
  • resultType : 定义返回结果的要封装的数据类型
    • 如果返回值是集合,resultType书写的是集合中元素的类型
    • 如果返回值不是集合,resultType书写的是返回值的类型
  • parmaterType : 定义参数的数据类型
    • 如果参数类型是普通类型(基本类型,基本类型包装类型,字符串类型),#{}里面的变量名可以随便写,建议见名知意
    • 如果参数类型是对象类型,#{}里面的变量名必须是属性名
      • 属性不是成员变量。属性是get方法名或者set方法名去掉get或者set,再将首字母变小写
        • getId —> Id --> id

如果有参数,需要使用#{}进行占位。

注意:
#{} 底层使用的是PreparedStatement对象,不会出现sql注入漏洞问题
${} 底层使用的是Statement对象,会出现sql注入漏洞问题(不建议使用)

<select id="selectById" resultType="student" parameterType="int">
     SELECT * FROM student WHERE id = #{id}
</select>

2. 核心配置文件

2.1 dataSource标签的type取值:

  • POOLED对应的是一个连接池类 PooledDataSource
  • UNPOOLED对应的是一个连接池类 UnpooledDataSource

2.2 properties标签

读取外部的properties配置文件。

  • 抽象数据库连接的四个基本信息
 driver=com.mysql.jdbc.Driver
 url=jdbc:mysql://localhost:3306/mybatis_day01
 username=root
 password=root
  • 在核心配置文件中引入
 <properties resource="jdbc.properties"/>

2.3 起别名

在核心配置文件中添加对应的配置

<typeAliases>
    <!--<typeAlias type="com.itheima.bean.Student" alias="student"/>-->
    <package name="com.itheima.bean"/>
</typeAliases>

注意: 别名就是类名首字母小写

工具类

public class MybatisUtils {
    //1,私有构造方法
    private MybatisUtils() {}

    //2,声明变量
    private static SqlSessionFactory factory;

    //3,在静态代码块中创建工厂对象
    static {
        try {
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //创建工厂对象
            factory = new SqlSessionFactoryBuilder().build(is);

            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //4,对外提供方法
    public static SqlSession getSqlSession(boolean autoCommit) {
        return factory.openSession(autoCommit);
    }
}

工具类的使用

@Override
public List<Student> selectAll() {
    //1,获取sqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession(true);
    //2,调用查询所有的方法
    List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

    //3,释放资源
    sqlSession.close();
    return list;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值