0Mybatis介绍
Mybatis是一个优秀的持久层框架,对jdbc操作数据库的过程进行封装,开发者只需要关注SQL语句本身,不需要花费精力去处理注册驱动、创建connection、创建Statement、手动设置参数、结果集检索等繁杂的过程代码。
Mybatis通过XML或注解的方式将要执行的statement(statement、preparedstatement、callableStatement)配置起来,通过Java对象和statement中的sql语句映射生成最终要执行的sql语句,最后由Mybatis框架执行sql并将结果映射成java对象返回
Mybatis的2个主要配置文件:SqlMapconfig.xml mapper.xml
SqlMapconfig.xml是mybatis的全局配置文件,配置了mybatis的运行环境等信息
mapper.xml sql映射文件,文件中配置了操作数据库的sql语句,此文件需要在SqlMapconfig.xml文件中加载进来
1 mybatis使用步骤
1.1 导入jar包 mybatis jar mybatis-3.2.7
相关依赖包 asm-3.3.1
cglib-2.2.2
commons-logging-1.1.1
javassist-3.17.1-GA
log4j-1.2.17
slf4j-log4j12-1.7.5
2 配置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="user">
<!-- id是sql语句的id
parameterType sql语句中参数的类型
resultType 查询结果的类型
-->
<select id="getUserById" parameterType="int" resultType="entity.User">
SELECT id,username,sex,birthday,address
FROM
`user`
WHERE id=#{id}
</select>
<!-- 根据姓名模糊查询 -->
<select id="getUserByName" parameterType="string" resultType="entity.User">
SELECT id,username,sex,birthday,address
FROM
`user`
WHERE username LIKE '%${value}%'
</select>
</mapper>
$和#的区别
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型或pojo属性值。如果parameterType传输单个简单类型值,#{}中可以是value或其他类型
${}表示拼接sql串,通过${}可以将parameterType中传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型或pojo属性值。如果parameterType传输单个简单类型值,${}中只能是value
3 一般在数据库表设计时,数据库表的列名和对应类的属性相同,但当不相同时,需要在Mapper映射文件里用<resultMap>标签来建立对应关系
<!--
1. type 对应的返回类型,可以是javabean, 也可以是其它
2. id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id引用
3. extends 继承其他resultMap标签
-->
<resultMap type="" id="" extends="">
<!--
1. id 唯一性,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键)
2. property 属性对应javabean的属性名
3. column 对应数据库表的列名
(这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)
-->
<id property="" column=""/>
<!--
result 与id相比,对应普通属性
-->
<result property="" column=""/>
<!--
constructor 对应javabean中的构造方法
-->
<constructor>
<!-- idArg 对应构造方法中的id参数 -->
<idArg column=""/>
<!-- arg 对应构造方法中的普通参数 -->
<arg column=""/>
</constructor>
<!--
collection 为关联关系,是实现一对多的关键
1. property 为javabean中容器对应字段名
2. ofType 指定集合中元素的对象类型
3. select 使用另一个查询封装的结果
4. column 为数据库中的列名,与select配合使用
-->
<collection property="" column="" ofType="" select="">
<!--
当使用select属性时,无需下面的配置
-->
<id property="" column=""/>
<result property="" column=""/>
</collection>
<!--
association 为关联关系,是实现一对一的关键
1. property 为javabean中容器对应字段名
2. javaType 指定关联的类型,当使用select属性时,无需指定关联的类型
3. select 使用另一个select查询封装的结果
4. column 为数据库中的列名,与select配合使用
-->
<association property="" column="" javaType="" select="">
<!--
使用select属性时,无需下面的配置
-->
<id property="" column=""/>
<result property="" column=""/>
</association>
</resultMap>
3 在congfig中导入SqlMapConfig.xml配置文件,此配置文件有2个作用
a 配置数据库相关设置
b 引入sql语句的映射配置文件
<?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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 加载sql映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
4 写MybatisUtil工具类,来获得SqlSessionFactory
package util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
//创建核心配置文件的输入流
InputStream inputStream;
try {
SqlSessionFactoryBuilder ssbf=new SqlSessionFactoryBuilder();
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory
sqlSessionFactory= ssbf.build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
5 写Test测试文件
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import util.MybatisUtil;
import entity.User;
public class MybatisTest {
//根据id查询
@Test
public void testGetUserById() throws Exception{
SqlSessionFactory factory= MybatisUtil.getSqlSessionFactory();
SqlSession sqlSession=factory.openSession();
//执行查询,第一个参数:映射的sql id,第二个参数:要执行的sql语句里的参数
User user=sqlSession.selectOne("user.getUserById", 1);
System.out.println(user);
sqlSession.close();
}
//根据姓名模糊查询
@Test
public void testGetUserByName() throws Exception{
SqlSessionFactory factory= MybatisUtil.getSqlSessionFactory();
SqlSession sqlSession=factory.openSession();
//执行查询,第一个参数:映射的sql id,第二个参数:要执行的sql语句里的参数
List<User> userList=sqlSession.selectList("user.getUserByName", "aa");
for(User user:userList){
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
}
进行数据的增删改时要记得提交事务,否则数据不会改变