MyBatis学习一
MyBatis
概念:
-
Myabtis是一款优秀的持久层框架,它支持自定义SQL、存储过程、以及高级映射。MyBatis几乎除去了所有JDBC的代码以及设置参数和获取结果集的工作。
-
MyBatis可以通过简单的XML或注解来映射原始数据类型、接口和JavaPOJO(Plain Old Java Object,普通老式Java对象)为数据库中的记录。
-
MyBatis 本是的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
-
2013年11月迁移到Github。
如何获得Mybatis?
1、maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
2、Github : https://github.com/mybatis/mybatis-3/releases
3、中文官网:https://mybatis.org/mybatis-3/zh/index.html
4、官网:https://mybatis.org/mybatis-3/
持久化
数据持久化
1、持久化就是将程序在持久状态和瞬时状态转换的过程
2、内存:断电即失
3、数据库(JDBC)、IO持久化
为什么需要持久化?
-
有一些东西太重要了,不能让它保存在内存中
-
内存太贵了
持久层
Dao层、Service层、Controller层....
-
完成持久化工作的代码块
-
层界十分明显
为什么需要使用MyBatis?
-
帮助开发者将数据存入数据库中
-
传统的JDBC代码台复杂,有冗余、mybatis具有简单、自动化的操作
-
方便,简洁
优点
-
简单易学
-
灵活
-
SQL语句和代码块的分离,提高了可维护性
-
提供映射标签,支持对象与数据库的ORM字段关系映射
-
提供对象映射标签,支持对象关系组建维护
-
提过xml标签,支持编写动态SQL
最重要的一点:使用的人多!
Spring SpringMVC SpringBoot
开发Mybatis
本程序是Java程序,没有涉及到Web模块
jar包 与数据库连接的jar包 mybatis.jar包
1、配置MyBatis
-
confi.xml 配置数据库信息 和 需要加载的映射文件
-
写一个表 -----> 类
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="1234" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件 -->
<mapper resource="com/xingwei/entity/personMapper.xml" />
</mappers>
2、写一个映射文件(XXXMapper.xml) 增删改查标签
<select id="queryPersonById" resultType="com.xingwei.entity.Person" parameterType="int">
select * from person where id=#{id}
</select>
3、写测试类 (session.selectOne("需要查询的namespace.id","SQL的参数值"))
public static void main(String[] args) throws IOException {
//加载MyBatis配置文件(为了访问数据库)
Reader reader = Resources.getResourceAsReader("conf.xml");
//SqlSessionFactory - connection
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//session -connection
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.personMapper.queryPersonById";
Person person = session.selectOne(statement,1);
System.out.println(person);
session.close();
}
CRUD
1、namespace
namespace中的包名要和 Dao/mapper 接口的包名一致!
2、select
选择,查询语句;
-
id : 就是对应的namespace中的方法名;
-
resultType:Sql语句执行的返回值!
-
parameterType : 参数类型!
基础方式的增删改查
MyBatis约定:输入参数 parameterType和 输出参数 resultType 在形式都只能有一个
如果输入参数:
-
是简单类型(8个基本类型+String)是可以使用任何占位符,#
-
如果是对象类型 则必须是对象的属性 #
-
输出参数:如果返回值类型只是一个对象(如Student),则无论返回一个还是多个
resultType="com.xingwei.entity.Student"
注意事项
1、如果使用的视为为JBDC,则需要手工提交事务 session.commit()
2、所有的标签select update等,都必须有SQL语句 但是SQL参数可选
-
SQL有参数 session.insert(statement, 参数值);
-
SQL无参数 session.insert(statement);
具体实现
1、conf
<?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>
<!-- 通过environments的default值和 environment的id值 来指定运行时的数据库环境-->
<environments default="development">
<environment id="development">
<!-- 事务的提交方式
JDBC:利用JDBC方式处理事务
MANAGED:将事务交由 其他组件托管(spring jobss),默认会关闭连接
<dataSource type="MANAGED">
<property name="closeConnection" value="false"/>
-->
<transactionManager type="JDBC" />
<!--
数据源类型:
UNPOOLED:传统的JDBC模式(每次访问均需要打开、关闭等数据库操作,但是打开、关闭数据库是比较消耗性能)
POOLED:使用数据库连接池
JNDI:从tomcat中获取一个内置的数据库连接池(数据库连接池->数据源)
-->
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="1234" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件 -->
<mapper resource="com/xingwei/entity/studentMapper.xml" />
</mappers>
</configuration>
2、实体类
package com.xingwei.entity;
public class Student {
private int stuNo;
private String stuName;
private int stuAge;
private String graName;
public Student() {
}
public Student(int stuNo, String stuName, int stuAge, String graName) {
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.graName = graName;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getGraName() {
return graName;
}
public void setGraName(String graName) {
this.graName = graName;
}
@Override
public String toString() {
return this.stuNo+"-"+this.stuName+"-"+this.stuAge+"-"+this.graName;
}
}
3、映射文件XXX.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">
<!-- namespace:该mapper.xml映射文件的唯一标识符 -->
<mapper namespace="com.xingwei.entity.studentMapper">
<!-- 后续通过namespace.id -->
<!--parameterType:输入参数类型 resultType:查询返回结果类型 -->
<select id="queryStudentByStuno" parameterType="int" resultType="com.xingwei.entity.Student">
select * from student where stuno = #{stuno}
</select>
<insert id="addStudent" parameterType="com.xingwei.entity.Student">
insert into student(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})
</insert>
<update id="updateStudentByStuno" parameterType="com.xingwei.entity.Student">
update student set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
</update>
<delete id="deleteStudentByStuno" parameterType="int">
delete from student where stuno=#{stuno}
</delete>
<select id="queryAllStudents" resultType="com.xingwei.entity.Student">
select * from student
</select>
</mapper>
4、接口: 操作mybatis接口
接口中的方法名就是xml中的id值
1.方法名和mapper.xml文件中标签的id值相同
2.该方法的输入参数和mapper.xml文件中标签的paramterType类型 一致
3.方法的返回值 和mapper.xml文件标签的resultType一致
package com.xingwei.mapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.xingwei.entity.Grade;
import com.xingwei.entity.Student;
import com.xingwei.entity.StudentBusiness;
import com.xingwei.entity.StudentClass;
//操作mybatis接口
public interface StudentMapper {
/*
* 1.方法名和mapper.xml文件中标签的id值相同
* 2.该方法的输入参数和mapper.xml文件中标签的paramterType类型 一致
* 3.方法的返回值 和mapper.xml文件标签的resultType一致
*/
//public abstract Student queryStudentByStuno(int stuno);
//查询单个
Student queryStudentByStuno(int stuno);
//查询全部
List<Student> queryAllStudents();
void addStudentWithConverter(Student student);
//增加
void addStudent(Student student);
//删除
void deleteStudentByStuno(int stuno);
//修改
void updateStudentByStuno(Student student);
}
5、测试类
package com.xingwei.entity;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
// 查询单个学生
public static void queryStudentByStuno() throws IOException {
// Connection
// 加载配置文件 conf.xml ->reader
Reader reader = Resources.getResourceAsReader("conf.xml");
// reader -> SqlSession操作MyBatis
// 可以通过build第二参数来指定 数据库环境 建议默认值写死
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.studentMapper.queryStudentByStuno";
Student student = session.selectOne(statement, 1);
System.out.println(student);
session.close();
}
// 查询全部学生
public static void queryAllStudents() throws IOException {
// Connection
// 加载配置文件 conf.xml ->reader
Reader reader = Resources.getResourceAsReader("conf.xml");
// reader -> SqlSession操作MyBatis
// 可以通过build第二参数来指定 数据库环境 建议默认值写死
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.studentMapper." + "queryAllStudents";
List<Student> students = session.selectList(statement);
System.out.println(students);
session.close();
}
// 增加学生
public static void addStudents() throws IOException {
// Connection
// 加载配置文件 conf.xml ->reader
Reader reader = Resources.getResourceAsReader("conf.xml");
// reader -> SqlSession操作MyBatis
// 可以通过build第二参数来指定 数据库环境 建议默认值写死
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.studentMapper." + "addStudent";
Student student = new Student(4, "xw", 25, "a1");
int count = session.insert(statement, student); // statement:指定执行的SQL student SQL中需要的参数
session.commit(); // 提交事务 DML语句需要提交事务
System.out.println("增加" + count + "个学生");
session.close();
}
// 删除学生
public static void deleteStudents() throws IOException {
// Connection
// 加载配置文件 conf.xml ->reader
Reader reader = Resources.getResourceAsReader("conf.xml");
// reader -> SqlSession操作MyBatis
// 可以通过build第二参数来指定 数据库环境 建议默认值写死
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.studentMapper." + "deleteStudentByStuno";
int count = session.delete(statement, 3);
session.commit(); // 提交事务
System.out.println("删除" + count + "个学生");
session.close();
}
// 根据学号修改学生
public static void updateStudentByStuno() throws IOException {
// Connection
// 加载配置文件 conf.xml ->reader
Reader reader = Resources.getResourceAsReader("conf.xml");
// reader -> SqlSession操作MyBatis
// 可以通过build第二参数来指定 数据库环境 建议默认值写死
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
String statement = "com.xingwei.entity.studentMapper." + "updateStudentByStuno";
// 修改的参数
Student student = new Student();
// 修改那个人 where stuno=?
student.setStuNo(2);
// 修改成什么样子
student.setStuName("lxs");
student.setStuAge(22);
student.setGraName("c1");
int count = session.update(statement, student);
session.commit(); // 提交事务
System.out.println("删除" + count + "个学生");
session.close();
}
public static void main(String[] args) throws IOException {
queryAllStudents();
// addStudents();
// deleteStudents();
updateStudentByStuno();
queryAllStudents();
}
}
注意:如果mybatis的transactionManager使用的JDBC,则需要手工提交事务。 ===>session.commit();