MyBatis的认识
1.MyBatis 是一个支持普通SQL查询,存储过程( Oracle最后一天)和高级映射的优秀持久层框架。
2.MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索。
3.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)
映射成数据库中的记录。
4.MyBatis不能自动创建表,如果能够自动建表,必须自己先准备好建表的sql语句。
MyBatis的简单查询
1.先创建一个简单的java项目
2.导包
① 先创建一个文件夹lib存放jar包
② 导入需要的jar包
3.因为MyBatis不会自动建表,所以需要现在数据库中创建数据表(employee表为例)
4.配置MyBatis的核心配置文件,文件名随意
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">
<!-- 环境们 (很多环境的意思) default:默认使用哪一个环境(必需对应一个环境的id) -->
<configuration>
<!--- 导入数据库的相关信息 -->
<properties resource="jdbc.properties"/>
<!-- 选择一个环境 -->
<environments default="development">
<!--- 一个环境 id:为这个环境取唯一一个id名称 -->
<environment id="development">
<!-- 事务管理 type:JDBC(支持事务)/MANAGED(什么都不做) -->
<transactionManager type="JDBC"/>
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mapper resource="my/domain/EmployeeMapper.xml"/>
</mappers>
</configuration>
5.配置映射文件,命名格式:XxxxMapper.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">
<!--
这个Mapper的主要功能就是写sql
mapper:根
namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加
namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
-->
<mapper namespace="my.domain.EmployeeMapper">
<!--
select : 这里面写查询语句
id:用来确定这条sql语句的唯一
以后我们确定唯一,也就是找sql语句 : namespace +.+ id
例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
parameterType : 传入的参数类型 long:大Long _long:小long (具体的对应请参见文档)
resultType : 结果类型(第
<select id="findOne" parameterType="long" resultType="my.domain.Employee">
select * from employee where id=#{id}
</select>
<select id="findAll" resultType="my.domain.Employee">
select * from employee
</select>
6.java代码
@Test
public void testName() throws IOException {
//读取MyBatis核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//创建SqlSession对象
SqlSession session = factory.openSession();
//查询单条数据
/* Employee employee = session.selectOne("my.domain.EmployeeMapper.findOne",1l);
System.out.println(employee);*/
//查询多条数据
List<Employee> employees = session.selectList("my.domain.EmployeeMapper.findAll");
for (Employee employee:employees){
System.out.println(employee);
}
//关闭会话
session.close();
}
7.抽取工具类SessionUtils
public class SessionUtils {
private static SqlSessionFactory factory;
static{
try{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(reader);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSession getSession(){
return factory.openSession();
}
}
MyBatis的CRUD
注意:增删改需要提交事务
1.添加数据
①java代码
@Test
public void save(Employee employee){
SqlSession session=null;
try {
session = SessionUtils.getSession();
session.insert("my.domain.EmployeeMapper.save", employee);
Long id = employee.getId();//获取添加后对象在数据库的主键值
session.commit();
}catch (Exception e){
e.printStackTrace();
}finally {
session.close();
}
}
② 配置映射文件
<insert id="save" parameterType="my.domain.Employee"
useGeneratedKeys="true" 是否需要主键
keyProperty="id"> 对象中主键的属性
insert into employee(username,password,email,headImage,age,
department_id) values (#{username},#{password},#{email},#{headImage},#{age}
,#{department_id})
</insert>
2.修改数据
① java代码
@Test
public void update(Employee employee){
SqlSession session=null;
try {
session = SessionUtils.getSession();
session.update("my.domain.EmployeeMapper.update",employee);
session.commit();
}catch (Exception e){
e.printStackTrace();
}finally {
session.close();
}
}
② 配置映射文件
<update id="update" parameterType="my.domain.Employee">
update employee set username=#{username},password=#{password},email=#{email},
headImage=#{headImage},age=#{age},department_id=#{department_id} where id=#{id}
</update>
3.删除数据
① java代码
@Test
public void delete(Long id){
SqlSession session=null;
try {
session = SessionUtils.getSession();
session.delete("my.domain.EmployeeMapper.delete",id);
session.commit();
}catch (Exception e){
e.printStackTrace();
}finally {
session.close();
}
}
② 配置映射文件
<delete id="delete" parameterType="long" >
delete from employee where id=#{id}
</delete>
4.查询数据
① java代码
@Test
public void findAll() throws IOException {
SqlSession session = SessionUtils.getSession();
List<Employee> employees = session.selectList("my.domain.EmployeeMapper.findAll");
for (Employee employee:employees){
System.out.println(employee);
}
session.close();
}
@Test
public void findOne() throws IOException {
SqlSession session = SessionUtils.getSession();
Employee employee = session.selectOne("my.domain.EmployeeMapper.findOne",1);
System.out.println(employee);
session.close();
}
② 配置映射文件
<select id="findOne" parameterType="long" resultType="my.domain.Employee">
select * from employee where id=#{id}
</select>
<select id="findAll" resultType="Employee" >
select * from employee
</select>
MyBatis中为一个类取别名
方式一:内置别名
方式二:自定义别名
在MyBaeis的核心配置文件中配置一下代码,在映射文件中的parameterType ,resultType上可以直接写对象的类名
<typeAliases>
<!--
将一个包下面的所有类都取上别名:<package name="my.domain" />
alias:取的别名
type:这个别名所对应的Java类
:别名使用的时候与大小写无关
-->
<typeAlias alias="employee" type="my.domain.Employee" />
<!-- 做项目的时候使用 -->
<package name="my.domain" />
</typeAliases>
解决类名和属性名不对应问题
1.在映射文件上配置
<!--
返回的数据映射
type:代表是要映射的对象
id:代表唯一(过会我们要拿到它)
-->
<resultMap type="cn.itsource.domain.Product" id="productMap">
<!--
column:对应的列名
property:对应的属性名
-->
<id column="id" property="id" />
<result column="productName" property="name" />
</resultMap>
<select id="queryOne" parameterType="long" resultMap="productMap">
select * from product where id = #{id}
</select>