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
- 属性不是成员变量。属性是get方法名或者set方法名去掉get或者set,再将首字母变小写
如果有参数,需要使用#{}进行占位。
注意:
#{} 底层使用的是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;
}