MyBatis一个简单例子配置

核心部分
工具类(utils)
MyBatisUtils.java
package com.vvu2.utils;
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;
/*
* 工具类:创建SqlSession对象
* */
public class MyBatisUtils {
private static SqlSessionFactory factory = null;
static {
String config = "mybatis.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(config);
factory= new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建方法,获取SqlSession对象
public static SqlSession getSqlSession() {
SqlSession session = null;
if (factory != null) {
session = factory.openSession();
}
return session;
}
}
主配置文件(resources)
mybatis.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>
<!--设置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--声明别名-->
<typeAliases>
<!--
第一种语法格式
type:java类型的全限定名称(自定义类型)
alias:自定义别名
优点:别名可以 自定义
缺点:每个类型必须单独定义
-->
<!-- <typeAlias type="com.vvu2.entity.Student" alias="stu"/>-->
<!-- <typeAlias type="com.vvu2.vo.QueryParam" alias="qp"/>-->
<!--第二种方式
name:包名,mybaits会把这个包中的所有类名作为别名(不区分大小写)
优点:使用方便,一次性给多个类定义别名
缺点:别名不能自定义,必须是类名。而且当有相同的类名出现,程序运行会出现识别错误
-->
<package name="com.vvu2.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/springdb?userUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--
指定其他mapper程序文件的位置:
其他其他mapper程序文件目的是找到其他文件的sql语句
-->
<mappers>
<!--
使用mapper的resource属性指定mapper文件的路径。
这个路径是从target/classes路径开启的
使用注意:
resource=“mapper文件的路径,使用 / 分割路径”
一个mapper resource指定一个mapper文件
-->
<mapper resource="com/vvu2/dao/StudentDao.xml"/>
</mappers>
</configuration>
其他部分
实体类(entity、vo)
Student类
私有属性、get()set()方法、toString()方法
package com.vvu2.entity;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Student() {
}
public Student(Integer id, String name, String email, Integer age) {
this.id = id;
this.name = name;
this.email = email;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "学生实体{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
接口、mapper
StudentDao.java (student.java的接口类)
package com.vvu2.dao;
import com.vvu2.entity.Student;
import com.vvu2.vo.QueryParam;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentDao {
//重载方法
Student selectById(Integer id);
//dao接口的方法形参是一个简单类型的
//简单类型: java基本数据类型和String
Student selectByEmail(String email);
// 多个简单的参数
// 使用@Param命名参数,注解是mybatis提供的
// 位置:在形参定义的前面
// 属性:value 自定义的参数名称
List<Student> selectByNameOrAge(@Param("myname") String name, @Param("myage") Integer age);
// 一个Java对象作为参数(对象有属性,每个属性有set,get方法)
List<Student> selectByObject(Student student);
List<Student> selectByQueryParam(QueryParam param);
// 简单类型;使用位置,获取参数
List<Student> selectByPosition(String name,Integer age);
// 使用Map作为参数
List<Student> selectStudentByMap(Map<String,Object> map);
// 例子:更新
int updateStudent(Student student);
// ${}占位符的使用
List<Student> queryStudent(@Param("studentName") String name);
List<Student> queryStudentOrderById();
List<Student> queryStudentOrderByName();
}
StudentDao.xml(对数据库进行操作的sql语句放在这里)
<?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="com.vvu2.dao.StudentDao">
<!--使用insert,update,delete,select标签写sql -->
<!--
parameterType:指定dao接口形参的类型,这个属性的值可以使用 java 类型的全限定名称或者 mybatis 定义的别名
mybatis执行的sql语句: select id,name,email,age from student where id=?
? 是占位符,使用jdbc中的PreparedStatement执行这样的sql语句
PreparedStatement pst = conn.preparedStatement("select id,name,email,age from student where id=?");
给 ? 位置赋值
参数是Integer,执行pst.setInt(1,1005);
参数是String,执行pst.setString(1,"1005");
第一种用法:java类型的全限定类型名称 parameterType="java.lang.Integer"
第二种用法:mybatis定义的java类型的别名 parameterType="int"
parameterType:mybatis通过反射机制可以获取 dao接口方法参数的类型,可以不用写
-->
<select id="selectById" parameterType="int" resultType="student">
select id,name,email,age from student where id=#{studentId}
</select>
<!--
dao接口是一个简单类型的参数
mapper文件,获取这个参数值,使用 #{任意字符}
-->
<select id="selectByEmail" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where email=#{studentEmail}
</select>
<!--
多个简单类型的参数
当使用了@Param命名后,例如@Param("myname")。
在mapper中,使用#{命名的参数},例如 #{myname}
-->
<select id="selectByNameOrAge" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>
<!--
一个java对象作为方法的参数,使用对象的属性作为参数值使用
简单的语法: #{属性名}, mybatis调用此属性的getXXX()方法获取属性值
-->
<select id="selectByObject" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where name=#{email} or age=#{age}
</select>
<select id="selectByQueryParam" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where name=#{p1} or age=#{p2}
</select>
<!--
使用位置获取参数值,dao接口是多个简单类型的参数
语法: #{arg0},#{arg1}...
-->
<select id="selectByPosition" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where name=#{arg0} or age=#{arg1}
</select>
<!--
使用Map来传递参数
在mapper文件中,获取map的值,是通过Key获取的,语法:#{key}
-->
<select id="selectStudentByMap" resultType="com.vvu2.entity.Student">
select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>
<!--更新 -->
<insert id="updateStudent">
update student set name=#{name},email=#{email},age=#{age} where id=#{id}
</insert>
<!--${}-->
<select id="queryStudent" resultType="com.vvu2.entity.Student">
select * from student where name=${studentName}
</select>
<!--id 列排序-->
<select id="queryStudentOrderById" resultType="com.vvu2.entity.Student">
select * from student order by id
</select>
<!--name 排序-->
<select id="queryStudentOrderByName" resultType="com.vvu2.entity.Student">
select * from student order by name
</select>
</mapper>
测试部分
Mytest2.java
package com.vvu;
import com.vvu2.dao.StudentDao;
import com.vvu2.entity.Student;
import com.vvu2.utils.MyBatisUtils;
import com.vvu2.vo.QueryParam;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Mytest2 {
@Test
public void testSelectById() {
//1、获取SqlSession
SqlSession session = MyBatisUtils.getSqlSession();
//2、获取dao的代理
StudentDao dao = session.getMapper(StudentDao.class);
Student student = dao.selectById(1002);
System.out.println("student = " + student);
//4、关闭SqlSession对象
session.close();
}
@Test
public void testOneParameter() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student = dao.selectByEmail("maladdy@qq.com");
System.out.println("email = " + student);
sqlSession.close();
}
@Test
public void testselectByNameOrAge(){
SqlSession session=MyBatisUtils.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
List<Student> students = dao.selectByNameOrAge("李四", 24);
students.forEach(stu-> System.out.println("stu = " + stu));
session.close();
}
@Test
public void testselectByObject(){
SqlSession session=MyBatisUtils.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student student=new Student();
student.setName("里大大");
student.setAge(35);
student.setEmail("花花");
List<Student> students= dao.selectByObject(student);
students.forEach(stu-> System.out.println("stu = " + stu));
session.close();
}
@Test
public void testselectByObject2(){
SqlSession session=MyBatisUtils.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
QueryParam param=new QueryParam();
param.setP1("maladdy");
param.setP2(22);
List<Student> students=dao.selectByQueryParam(param);
students.forEach(stu -> System.out.println("stu = " + stu));
session.close();
}
@Test
public void testselectByPosition(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectByPosition("李四", 24);
students.forEach(stu-> System.out.println("stu = " + stu));
sqlSession.close();
}
@Test
public void testselectStudentByMap(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
// 使用Map传递参数
Map<String,Object> data=new HashMap<>();
data.put("myname","花花");
data.put("myage",27);
List<Student> students = dao.selectStudentByMap(data);
students.forEach(stu-> System.out.println("stu = " + stu));
sqlSession.close();
}
@Test
public void testupdateStudent(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student=new Student();
student.setId(1001);
student.setName("法外狂徒");
student.setEmail("Kuang@qq.com");
student.setAge(40);
int rows = dao.updateStudent(student);
sqlSession.commit();
System.out.println("更新学生的rows= " + rows);
sqlSession.close();
}
}
数据库 (mysql 8.0)

本文档提供了一个完整的MyBatis配置及简单使用的示例,包括核心工具类MyBatisUtils的创建,主配置文件mybatis.xml的内容,以及实体类、接口和mapper文件的定义。示例展示了如何通过MyBatis进行SQL操作,如根据ID、邮箱选择学生,以及使用多种参数形式进行查询。此外,还包括测试类Mytest2,用于验证接口的正确性。
1907

被折叠的 条评论
为什么被折叠?



