mybatis学习笔记
一、理解什么是MyBatis?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录.
ORM简介 :对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
<!--conf.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>
<environments default="development">
<environment id="development">
<!-- 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<!-- ${jdbc.driver}代表配置文件中的某一项的key -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/course"/>
<property name="username" value="root"/>
<property name="password" value="canada"/>
</dataSource>
</environment>
</environments>
<!-- 为mybatis的映射文件mapper.xml设置路径 -->
<mappers>
<mapper resource="entity/personMapper.xml"></mapper>
<mapper resource="entity/studentMapper.xml"></mapper>
</mappers>
</configuration>
package entity;
import org.apache.commons.lang3.builder.ToStringBuilder;
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;
}
}
<!--studentMapper.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">
<mapper namespace="entity.StudentMapper">
<!--根据学号查询-->
<select id="queryStudentBystuno" resultType="entity.Student" parameterType="int">
select * from student where stuno=#{stuno}
</select>
<!--添加学生-->
<select id="addStudent" parameterType="entity.Student">
insert into student VALUES(#{stuNo},#{stuName},#{stuAge},#{graName});
</select>
<!--根据学号删除学生-->
<select id="deleteStudentByStuno" parameterType="int">
delete from student where stuno=#{stuno}
</select>
<!--根据学号更改-->
<select id="updateStudentBystuno" parameterType="entity.Student">
update student set stuName=#{stuName},stuAge=#{stuAge},graName=#{graName} where stuNo=#{stuNo}
</select>
<!--查询所有-->
<select id="queryAllStudent" resultType="entity.Student">
select * from student
</select>
</mapper>
package entity;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import static org.junit.Assert.*;
public class PersonTest {
@Test
public void testMybatis(){
try {
Reader reader= Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=sessionFactory.openSession();
String statement1="entity.StudentMapper.queryStudentBystuno";//根据学号查询
String statement2="entity.StudentMapper.queryAllStudent";//查询所有
String statement3="entity.StudentMapper.addStudent";//添加学生
String statement4="entity.StudentMapper.updateStudentBystuno";//根据学号更改
String statement5="entity.StudentMapper.deleteStudentByStuno";//根据学号删除学生
Student student=session.selectOne(statement1,1);//单个查询,返回值只能是单个或者NULL
Student t=new Student(3,"zzs",25,"g1");
int count=session.insert(statement3,t);//插入,返回为改变的行数
System.out.println(count);
count=session.delete(statement5,1);//删除,返回删除行数
session.commit();//事务方式为JDBC时,需要手工session.commit提交
Student c=new Student(2,"www",22,"g1");
count=session.update(statement4,c);//更新,返回更新行数
System.out.println(count);
System.out.println(count);
List<Student> students=session.selectList(statement2);
// System.out.println(student);
for (Student s:students){
System.out.println(s);
}
session.close();//关闭事务
} catch (IOException e) {
e.printStackTrace();
}
}
}
package mapper;
import entity.Student;
import java.util.List;
public interface StudentMapper {
Student queryStudentBystuno(int stuno);//查特定
void addStudent(Student student);//增
void deleteStudentByStuno(int stuno);//删
void updateStudentBystuno(Student student);//改;
List<Student> queryAllStudent();
}
package entity;
import mapper.StudentMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import static org.junit.Assert.*;
public class PersonTest {
@Test
public void testMybatis(){
try {
Reader reader= Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=sessionFactory.openSession();
StudentMapper studentMapper=session.getMapper(StudentMapper.class);
Student student=studentMapper.queryStudentBystuno(2);
System.out.println(student);
Student t=new Student(6,"ewe",2,"g1");
Student c=new Student(5,"www",22,"g1");
studentMapper.addStudent(t);
studentMapper.deleteStudentByStuno(3);
studentMapper.updateStudentBystuno(c);
session.commit();
List<Student> students=studentMapper.queryAllStudent();
for (Student s:students){
System.out.println(s);
}
session.close();//关闭事务
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.自定义MyBatis类型处理器
//先创建BooleanAndIntConverter
package converter;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean> {
//java->DB
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException {
if(aBoolean){//若java中是true则在DB中转为1否则为0
preparedStatement.setInt(i,1);
}else{
preparedStatement.setInt(i,0);
}
}
@Override
public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException {
int sexNUm= resultSet.getInt(s);
return sexNUm==1?true:false;
}
//DB->java,DB中为0时在java转为false,否则为true
@Override
public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException {
int sexNUm= resultSet.getInt(i);
return sexNUm==1?true:false;
}
@Override
public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
int sexNUm= callableStatement.getInt(i);
return sexNUm==1?true:false;
}
}
<!--将创建BooleanAndIntConverter转换器声明到conf.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"></properties>
<typeAliases>
<!--单个别名是,忽略大小写-->
<typeAlias type="entity.Student" alias="student"></typeAlias>
<!--批量定义别名同样忽略大小写-->
<!--<package name="entity" />-->
</typeAliases>
<typeHandlers>
<typeHandler handler="converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"></typeHandler>
</typeHandlers>
<environments default="development">
<environment id="development">
<!-- 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<!-- ${jdbc.driver}代表配置文件中的某一项的key -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 为mybatis的映射文件mapper.xml设置路径 -->
<mappers>
<mapper resource="entity/personMapper.xml"></mapper>
<mapper resource="mapper/studentMapper.xml"></mapper>
</mappers>
</configuration>
<?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">
<mapper namespace="mapper.StudentMapper">
<!--根据学号查询,并且使用别名student,忽略大小写-->
<!--带选择器的查询,DB->JAVA时需用resultMap转换-->
<select id="queryStudentBystunoWithConverter" resultMap="studentResult" parameterType="INTEGER">
select * from student where stuno=#{stuno}
</select>
<resultMap id="studentResult" type="student">
<!--分为主键Id,和非主键result-->
<id property="stuNo" column="stuno"></id>
<result property="stuName" column="stuname"></result>
<result property="stuAge" column="stuage"></result>
<result property="graName" column="graname"></result>
<result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER" ></result>
</resultMap>
<!--带选择器的增加,JAVA->DB添加时课在sql语句直接转换-->
<select id="addStudentWithConverter" parameterType="entity.Student">
insert into student VALUES(#{stuNo},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER});
</select>
</mapper>
package mapper;
import entity.Student;
import java.util.List;
public interface StudentMapper {
Student queryStudentBystunoWithConverter(int stuno);//查特定
void addStudentWithConverter(Student student);//增
}
package entity;
import mapper.StudentMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import static org.junit.Assert.*;
public class PersonTest {
@Test
public void testMybatis(){
try {
Reader reader= Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=sessionFactory.openSession();
StudentMapper studentMapper=session.getMapper(StudentMapper.class);
Student student=studentMapper.queryStudentBystunoWithConverter(2);
System.out.println(student);
Student t=new Student(7,"ewe",2,"g1");
studentMapper.addStudentWithConverter(t);
session.commit();
session.close();//关闭事务
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:DB中的int在java中转换为boolean值:
输入参数parameterType的类型可以为: