MyBatis初步学习
简介
MyBatis是数据库访问层的框架,执行对数据库的查询、修改、删除。开发人员只需要几种注意在sql语句的书写,不需要关心Connection、Statement、ResultSet的创建、销毁。
准备工作
1、防止MyBatis在insert时的中文乱码
设置mysql的字符集编码格式,以MySQL5.5为例:设置character-set-server=utf8,达到如下效果。
2、配置Maven
略
1)在pom.xml配置依赖
在Maven配置完成之后,配置相关MyBatis和JDBC依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
2)在相同文件夹下创建名称相同的xml文件和java文件
以StudentDao.xml和Student.java文件为例
接口中:
package com.zzc.dao;
import com.zzc.entity.Student;
import java.util.List;
public interface StudentDao {
//查询student表中所有的数据
public List<Student> selectStudents();
}
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 namespace="com.zzc.dao.StudentDao">
<select id="selectStudents" resultType="com.zzc.entity.Student">
select * from t_student order by id
</select>
<select id="selTopStudent" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where name = #{name} and age = #{age}
</select>
</mapper>
标签解释
namespace:
命名空间,唯一值,可以是自定义的字符串,要求使用dao接口的全限定名称。
id:
id后面的值,执行sql语法的唯一标识,可以随便写,但要求写成接口的方法名称
resultType:
的值为返回的resultSet结果集中对象的类型【要写全限定的名称】
返回的类型不一定要是定义好的实体类,也可以是基本类型或者是其他引用类型。
parameterType:
反射可以自动获取,不写也可以
sql语句中传一个参数
<select id="selStudentById" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where id = #{id};
</select>
在mapper文件获取简单类型的一个参数的值,使用#{任意字符},在使用#{}之后,MyBatis之后,MyBatis执行sql是使用的jdbc中的PreparedStatement对象。
sql语句中传入多个参数
<select id="selTopStudent" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where name = #{name} and age = #{age}
</select>
<select id="selStudentByTwoParam" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where id = #{arg0} and age = #{arg1}
</select>
使用@Param("名字")
或者使用#{arg0} #{arg1}
sql传入对象的属性值
<select id="selTopStudent" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where
name = #{name} and age = #{age}
</select>
其中的name和age为传入参数对象的属性值
传入的参数为Map
<select id="SelStudentByMap" resultType="com.zzc.entity.Student">
select id, name, email, age from t_student where id = #{id} and age = #{age}
</select>
其中的id和age为key
3)resource文件夹下创建MyBatis.xml
该文件用于数据库的连接,指定sql映射文件;配置日志打印,相关插件的配置。
使用配置文件管理连接池参数,使用多级目录,【jdbc.xxx】
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdb
jdbc.username=root
jdbc.password=zzc10086
<?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"></properties>
<!--settings:控制mybatis全局行为-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<environments default="mydev">
<environment id="mydev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--
driver, user, username, password 是固定的,不能自定义。
-->
<!--数据库的驱动类名-->
<property name="driver" value="${jdbc.driver}"/>
<!--连接数据库的url字符串-->
<property name="url" value="${jdbc.url}"/>
<!--访问数据库的用户名-->
<property name="username" value="${jdbc.username}"/>
<!--密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!--一个mapper标签指定一个文件的位置。
从类路径开始的路径信息。 target/clasess(类路径)
-->
<!-- <mapper resource="com/zzc/dao/StudentDao.xml"/>-->
<package name="com.zzc.dao"/>
</mappers>
</configuration>
-->
标签解释【要注意文件中标签出现的顺序】
properties:目前只用来导入了连接所需要的属性的配置文件,路径从target/clasess(类路径)开始。
settings:仅设置了出现日志文件
plugins:用来配置插件
default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库
environment:数据库的信息配置,后面的id可以随意起名,但必须唯一
transactionManager:MyBatis提交事务、回滚事务的方式。type若为JDBC:表示MyBatis底层调用的是Connection对象的,commit,rollback;
MANAGER:把MyBatis的事务处理委托给其他的容器,服务器软件或者是框架。
DataSource:用于连接数据库,若使用连接池,在javax.sql.DataSource接口下,有Connection getConnection() throws SQLException;
该接口的实现类能够获得数据库的连接,所以在标签中需要规定, Driver、url、username、password
mapper:指定sql映射文件的位置,从类路径下开始,若需要引用的文件过多,可以使用package。
package:namexml文件所在的报名,这个包名中所有的xml文件一次性加载,【此时需要mapper文件和接口名称相同,且在同一个目录下】
4)封装MyBatisUtil
package com.zzc.util;
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 MyBatisUtil {
private static SqlSessionFactory factory = null;
static {
try {
InputStream in = Resources.getResourceAsStream("MyBatis.xml");
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
if (factory != null) {
sqlSession = factory.openSession();
}
return sqlSession;
}
}
5)使用sqlSession.getMapper()实现动态代理
测试类如下:
@Test
public void testSelectStu() {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> list = studentDao.selStudent();
for(Student s : list) {
System.out.println(s);
}
}