MyBatis学习01
一、mybatis配置文件
1、核心配置文件:sqlMapConfig.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>
<!-- 可以在控制台输出日志信息:sql语句和参数 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 配置别名-->
<typeAliases>
<!-- 配置每种类型的别名,type属性表示别名对应的类型地址,alias表示起的别名-->
<typeAlias type="java.util.List" alias="list"/>
<!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 -->
<package name="com.java.model"/>
</typeAliases>
<!-- 环境配置:作为连接数据库的环境(可配置不同的数据库) -->
<environments default="mysql">
<environment id="mysql">
<!--事务管理-->
<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>
<!-- 加载映射文件,mappers表示代理模式扫描 ,目的主要是在当前配置文件中扫描到sql映射文件-->
<mappers>
<mapper resource="mapper/EmpMapper.xml"/>
</mappers>
</configuration>
2、Mapper接口映射配置文件:xxxMapper.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接口地址,相当于mapper接口实现类 -->
<mapper namespace="com.java.mapper.EmpMapper">
<!--要查询的sql字段-->
<sql id="empSQL">
number,name,job,mgr,hiredate,sal,comm,deptno
</sql>
<!--查询所有记录-->
<select id="selectAllEmp" resultType="EmpEntity">
SELECT <include refid="empSQL"/> FROM emp
</select>
<!--新增一条员工记录-->
<!--#{}中的参数,必须是实体类中的属性名-->
<insert id="insertEmp" parameterType="EmpEntity">
INSERT INTO emp VALUES (null,#{name},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})
</insert>
<!--根据员工编号删除员工记录-->
<delete id="deleteEmpByNumber" parameterType="integer">
DELETE FROM emp WHERE number = #{number}
</delete>
<!--根据员工编号修改员工信息-->
<update id="updateEmpByNumber" parameterType="EmpEntity">
UPDATE emp SET name = #{name}, job = #{job} WHERE number = #{number}
</update>
</mapper>
3、db.properties数据源文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/zhiheng?useSSL=true
username=root
password=Root
二、mybatis进行单表的增删改查
1、pom.xml引入mybatis相关依赖
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
2、mapper接口
package com.java.mapper;
import com.java.model.EmpEntity;
import java.util.List;
public interface EmpMapper {
/**
* 查询所有员工记录
* @return
*/
List<EmpEntity> selectAllEmp();
/**
* 新增一条员工记录
* @param emp
* @return
*/
Integer insertEmp(EmpEntity emp);
/**
* 根据员工编号删除员工记录
* @param number
* @return
*/
Integer deleteEmpByNumber(Integer number);
/**
* 根据员工编号修改员工信息
* @param emp
* @return
*/
Integer updateEmpByNumber(EmpEntity emp);
}
3、测试类(创建sqlSession对象、代理开发、调用接口中的方法)
package com.java;
import com.java.mapper.EmpMapper;
import com.java.model.EmpEntity;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Liushun
* @date Created in 2018/10/4 21:36
* @description mybatis测试类
*/
public class EmpTest {
// SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等
private SqlSession sqlSession = null;
// 开启sqlSession会话
@Before
public void init() throws IOException {
// 1、加载核心配置文件sqlMapConfig.xml
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2、创建sqlSessionFactory会话工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
// 由会话工厂创建sqlSession即会话
sqlSession = factory.openSession();
}
// 新增一条员工记录
@Test
public void addEmp(){
EmpEntity emp = new EmpEntity();
emp.setName("齐天大圣");
emp.setComm(10000D);
sqlSession.getMapper(EmpMapper.class).insertEmp(emp);
}
// 查询所有员工记录
@Test
public void selectAllEmp(){
sqlSession.getMapper(EmpMapper.class).selectAllEmp();
}
// 根据员工编号删除员工记录
@Test
public void deleteEmp(){
sqlSession.getMapper(EmpMapper.class).deleteEmpByNumber(1032);
}
// 根据员工编号修改员工信息
@Test
public void update(){
EmpEntity emp = new EmpEntity();
emp.setNumber(1030);
emp.setName("姜子牙");
emp.setJob("军师");
sqlSession.getMapper(EmpMapper.class).updateEmpByNumber(emp);
}
@After
public void destory(){
if(sqlSession != null){
try{
// 提交事务
sqlSession.commit();
}catch (Exception e){
// 有异常,回滚事务
sqlSession.rollback();
}finally{
// 关闭sqlSession
sqlSession.close();
}
}
}
}
三、mybatis小结
1、mybatis解决jdbc编程的问题
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
-
Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在xxMapper.xml文件中与java代码分离。
-
向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
-
对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
2、Mapper接口开发需要遵循以下规范
-
Mapper.xml文件中的namespace与Mapper接口的路径相同
-
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
-
Mapper 接口方法的输入参数类型和Mapper.xml中定义的每个sql的parameterType的类型相同
-
Mapper接口方法的输出参数类型和Mapper.xml中定义的每个sql的resultType的类型相同
3、typeAliases——类型别名映射关系
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
map | Map |