入门程序:
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>
<!--
sqlMapConfig:配置文件必须满足以下顺序:
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
objectWrapperFactory?,reflectorFactory?,plugins?,environments?,
databaseIdProvider?,mappers?)
-->
<!-- 1,properties:引入外部资源文件 -->
<properties resource="jdbc.properties"></properties>
<!-- settings:配置mybatis缓存,二级缓存,查询缓存(一般不用) -->
<!-- 2,别名的定义: -->
<typeAliases>
<!-- typeAlias:定义单个别名 type:指定需要定义别名类型 alias:别名名称 -->
<!-- <typeAlias type="com.itheima.pojo.User" alias="user"/> -->
<!--
批量定义别名:扫描需要定义别名所在包路径,此包下面所有的类都自动被定义别名
别名名称:别名名称就是类名称,字母大小写都可
-->
<package name="com.demo.pojo"/>
</typeAliases>
<!-- typeHandlers:把数据库类型VARCHAR,LONG等等这些类型自动转换为Java类型 99%不需要写,mybatis都帮我们做了-->
<!-- objectWrapperFactory:对象工厂,创建返回值对象 -->
<!-- plugins:mybatis框架开发可以引入第三方插件:分页插件 -->
<!-- environments:mybatis开发环境(数据库,事物),可以配置多个开发环境 -->
<environments default="development">
<!-- environment:配置单个开发环境 id:开发环境唯一标识 -->
<environment id="development">
<!-- 指定开发环境中使用事物:jdbc事物 -->
<transactionManager type="JDBC" />
<!-- 数据源,连接池 -->
<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>
<!-- 引入映射文件 -->
<mapper resource="sqlMap/UserMapper.xml" />
</mappers>
</configuration>
jdbc.properties(连接池配置)
jdbc.url = jdbc:mysql://localhost:3306/ssm
jdbc.driver = com.mysql.jdbc.Driver
jdbc.username= root
jdbc.password= root
Mapper映射文件(UserMapper.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有特殊含义,不能自定义
如果是接口代理开发,namespace必须是接口全类路径名
-->
<mapper namespace="com.demo.dao.UserDao">
<!-- 查询所有用户数据 -->
<select id="findAll" resultType="user">
select * from user
</select>
<!--
根据id查询用户数据
select:用来封装查询sql语句
parameterType:指定传递参数类型
resultType:指定查询结构映射的返回值类型
#{}:相当于占位符?,#{}获取传递参数值,
如果传递的参数是基本类型,括号里面可以是任意值;
如果传递的pojo参数,括号里面必须ognl表达式
ognl:对象导航语言 语法:属性.属性.属性。。。
-->
<select id="findUserWithId" parameterType="int" resultType="user">
select * from user where id=#{id}
</select>
</mapper>
测试类↓
package com.demo.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.demo.dao.UserDao;
import com.demo.pojo.User;
public class MybatisTest {
SqlSessionFactory sqlSessionFactory = null;
@Before
public void beforeConfig() throws IOException{
//1,加载核心配置文件
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//2,获取sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 需求:使用mybatis接口代理开发模式
* 注意:mybatis使用接口代理开发模式,必须满足以下规范:
* 1,映射文件namespace必须是接口全路径名
* 2,映射文件sql语句id必须和接口中方法名相同
* 3,映射文件返回值类型必须和接口返回值类型一致
* 4,映射文件接收参数类型必须和接口传递参数类型一致
*/
@Test
public void test01() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取dao的接口代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> list = userDao.findAll();
User user = userDao.findUserWithId(32);
System.out.println(user);
System.out.println(list);
}
}
sqlMapConfig.xml中的mappers标签:
mappers:引入映射文件,此标签可以引入多个映射文件
mappers引入映射文件方式有三种,每一种都对应着不同开发模式↓
第一种引入方式:
<mappers>
<!-- 引入映射文件 -->
<mapper resource="sqlMap/UserMapper.xml" />
</mappers>
开发方式:
传统开发模式:DAO、DAO实现类
接口代理开发模式:只有接口即可开发
接口代理开发必须满足规范:
1,映射文件namespace必须是接口全路径名
2,映射文件sql语句id必须和接口中方法名相同
3,映射文件返回值类型必须和接口返回值类型一致
4,映射文件接收参数类型必须和接口传递参数类型一致
第二种引入方式:class(此模式只适用于接口代理开发模式)
<mappers>
<mapper class="com.demo.dao.UserMapper"/> -->
</mappers>
开发规范:
1,映射文件namespace必须是接口全类路径名
2,映射文件sql语句id必须和接口方法名一致
3,映射文件必须和接口在同一个编译目录,且名称相同
4,映射文件返回值类型和接口的返回值类型一致
5,映射文件接收参数类型和接口传递参数类型一致
第三种引入方式:package批量扫描映射文件
<mappers>
<package name="com.demo.dao"/>
</mappers>
开发规范:
1,映射文件namespace必须是接口全类路径名
2,映射文件sql语句id必须和接口方法名一致
3,映射文件必须和接口在同一个编译目录,且名称相同
4,映射文件返回值类型和接口的返回值类型一致
5,映射文件接收参数类型和接口传递参数类型一致
最后,贴一段UserMapper.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有特殊含义,不能自定义
如果是接口代理开发,namespace必须是接口全类路径名
-->
<mapper namespace="com.demo.dao.UserMapper">
<!-- 查询所有用户数据 -->
<select id="findAll" resultType="user">
select * from user
</select>
<!--
根据id查询用户数据
select:用来封装查询sql语句
parameterType:指定传递参数类型
resultType:指定查询结构映射的返回值类型
#{}:相当于占位符?,#{}获取传递参数值,
如果传递的参数是基本类型,括号里面可以是任意值;
如果传递的pojo参数,括号里面必须ognl表达式
ognl:对象导航语言 语法:属性.属性.属性。。。
-->
<select id="findUserWithId" parameterType="int" resultType="user">
select * from user where id=#{id}
</select>
<!--
需求:根据用户名进行模糊查询
#{}占位符获取值:
如果获取的值是字符类型数据,#{}自动加上双引号
特殊用法:为模糊查询特定查询方法
使用方法:"%"#{username}"%"
${}sql语句拼接:把传递参数无论是字符,还是基本类型,${}都是原样拼接,${}有sql注入风险
${}特点:
1,如果传递的值是基本类型,${}括号里面必须是value
2,如果传递参数是pojo类型,${}括号里面必须使用ognl表达式获取参数值
-->
<select id="findUserWithLikeUsername" parameterType="string" resultType="com.demo.pojo.User">
select * from user where username like "%"#{username}"%"
</select>
<!--
需求:保存用户数据
insert:所有的插入sql语句都写在insert标签,也就是说insert标签用来封装保存数据sql语句
id:sql语句唯一标识
parameterType:指定传递阐述类型
#{}:如果传递参数是ognl,获取参数使用ognl表达式
-->
<insert id="saveUser" parameterType="com.demo.pojo.User">
<!--
selectKey:查询用户主键,保存时候查询
keyProperty:查询结果映射的属性名称
order:主键生成策略,主键是在sql语句执行之后生成
resultType:指定返回值类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<!--
需求:删除用户数据
delete:用来封装删除语句的标签
id:sql语句唯一标识
parameterType:指定传递参数类型
-->
<delete id="deleteUserWithId" parameterType="int">
delete from user where id=#{id}
</delete>
<!--
需求:根据id更新用户数据
update:用来封装更新sql语句的标签
id:sql语句唯一标识
parameterType:传递参数类型
-->
<update id="updateUserById" parameterType="com.demo.pojo.User">
update user set
username=#{username},
birthday=#{birthday},
sex=#{sex},
address=#{address}
where id=#{id}
</update>
</mapper>