提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Mybatis的使用
前言
一直想对自己学习框架的过程做一个记录,经过这次记录感觉自己好像又进一步掌握了Mybatis,但是写这篇文章的目的并不单单是着眼于学习Mybatis,而是想着学会思考,假如未来又出现一个框架,我应该从何入手,如何去学习。
一、传统方式
1.准备工作导入jdbc的驱动
String url = "jdbc:mysql://127.0.0.1:3306/mytest?useSSL=false";
String user = "root";
String pass = "root";
Connection connection = null;
try {
//反射获取驱动,将驱动注册到DriverManager里
Class.forName("com.mysql.jdbc.Driver");
//从DriverManager里获取连接
connection = DriverManager.getConnection(url, user, pass);
String sql="select * from student where name=? ";
//进行预编译处理sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1,"小明");
//执行sql并返回结果集
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
//将结果集进行遍历保存处理
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
二、使用Mybatis
1.准备工作配置maven依赖
导入mybatis和mysql的驱动
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
2.对MyBatis进行配置
1.配置mybatis.xml文件和properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1/mytest?useSSL=false
username=root
password=root
<?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="jdbc.properties"/>
<!-- 设置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 设置别名-->
<typeAliases>
<package name="com.xzt.domain"/>
</typeAliases>
<!-- 设置连接数据库的相关配置 environments标签下可以有很多个环境 default表示默认选择的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<!--另一个环境配置 如果切换就直接将default修改为这个环境的id-->
<!-- <environment id="development2">
<transactionManager type="JDBC"/>
<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>
<!--扫描mapper文件-->
<mappers>
<!--写mapper文件的路径-->
<mapper resource="com/xzt/dao/StudentDao.xml"/>
<!-- <package name="com.xzt.dao"/>-->
</mappers>
</configuration>
2.创建实体类
package com.xzt.domain;
public class Student {
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
3.创建数据访问层dao并配置对应的mapper.xml文件
package com.xzt.dao;
import com.xzt.domain.Student;
import org.apache.ibatis.annotations.Param;
import org.omg.CORBA.INTERNAL;
import java.util.List;
public interface StudentDao {
// List<Student> selectAll(List<Long> id);
// List<Map<Object,Object>> selectMapList(@Param("id") Long id, @Param("age") String age);
//一个插入方法对应一个<insert>标签
Integer insertStudent(Student student);
//一个删除方法对应一个<deleted>标签
Integer deleteStudent(Long id);
//一个更新方法对应一个<update>标签
Integer updateStudent(Student student);
/*查询方法对应 <select>标签 当mapper文件中用了if标签,单个参数也要加上@Param注解
* 不然if里的test判断会报错找不到id
*/
List<Student> selectAll(@Param("id") Long id);
/*
* 传多个参数 两种方式
* 1 通过对象的方式,将多个参数封装到对象中 如上述通过Student传id,name,age
* 2 每个参数加@Param注解标签
*
*/
Student selectOne(@Param("id") Integer id, @Param("age") String age);
List<Student> selectAllIn( @Param("id") List<Long> id);
}
<?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.xzt.dao.StudentDao">
<!-- 标签的几个属性
1.resultType
增删改:不能设置resultType 返回的是受影响记录的条数
查:这里需要注意,返回值类型是每一条结果的类型 是list里存的对象而不是返回的List
我们可以思考一下传统的jdbc接收数据,变化的代码只是while循环中new的对象
的对象的变化。
List<Student> =new ArrayList();
while (resultSet.next()) {
Student student = new Student();
student.setAge(resultSet.get)
...
list.add(student);
}
所以我们其实只需要告诉mybatis循环中需要new的数据的类型,
mybatis会帮我们遍历插入到list中,
但如果我们告诉mybatis数据是个List,mybatis无从下手。
2.parameterType
传入参数类型其实可以不写 mybatis会自动获取参数类型-->
<insert id="insertStudent" parameterType="com.xzt.domain.Student">
insert into student(id,name,age) values (#{id},#{name},#{age})
</insert>
<delete id="deleteStudent" parameterType="java.lang.Long">
delete from student where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.xzt.domain.Student">
update student set name = #{name} where id=#{id}
</update>
<select id="selectAll" resultType="com.xzt.domain.Student" parameterType="java.lang.Long">
select * from student where 1=1
if标签作用,当标签里的test内容成立时会拼接到上面的语句中-->
<if test=" id !=null ">
and id=#{id}
</if>
</select>
<select id="selectOne" resultType="com.xzt.domain.Student">
select * from student where id=#{id} and age=#{age}
</select>
<select id="selectAllIn" resultType="com.xzt.domain.Student">
select * from student where 1=1
<if test="id != null and id.size!=0">
and id in
<foreach collection="id" index="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</select>
</mapper>
3.运行测试程序
先理一下前面做了什么
第一步配置了连接的相关属性,其实以后的使用中该主配置文件一般只需
修改资源文件 jdbc.properties文件的位置,文件中的url,username,password
修改需要扫描的Mapper文件的位置
第二步创建mapper文件其实就是对StudentDao接口进行了实现
以后增加例如TeacherDao,只需要增加对应的TeacherDaoMapper类,并将mapper文件再添加至主配置文件中,让其扫描到
创建测试程序
package com.xzt;
import com.xzt.dao.StudentDao;
import com.xzt.domain.Student;
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;
import java.util.Arrays;
import java.util.List;
public class main {
public static void main(String[] args) throws IOException {
//从类路径下加载主配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//创建工厂对象
SqlSessionFactory sqlSessionFactory = builder.build(resourceAsStream);
//获取sqlSession 这里这设置参数为事务自动提交 默认为false 如果为false 最后需要 调用 sqlSession.commit();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
/*以上都是固定代码
*也很好记忆
*创建建造者,建造者打造工厂,工厂创建sql会话对象,最终目的就是拿到 sqlSession */
//sqlSession.getMapper() 根据接口找到对应这个接口的mapper文件,根据mapper文件创建并返回一个StudentDao接口的实现类
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student insertStudent = new Student();
insertStudent.setName("小明");
insertStudent.setAge(10);
studentDao.insertStudent(insertStudent);
studentDao.deleteStudent(1L);
Student updateStudent = new Student();
insertStudent.setName("小明");
insertStudent.setAge(10);
studentDao.updateStudent(updateStudent);
List<Student> students = studentDao.selectAllIn(Arrays.asList(1L, 2L));
List<Student> student2 = studentDao.selectAll( 1L);
Student student = studentDao.selectOne( 1L ,13);
System.out.println(student);
students.forEach(System.out::println);
}
}
最后附上程序结构