【框架】Mybatis 02 架构详解
第一步:mybatis的配置文件
1、sqlMapConfig.xml 是mybatis的全局配置文件
配置数据源、事务等
<?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事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由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>
</configuration>
sqlMapConfig.xml的头信息是config.dtd。
2、配置映射文件(配置sql语句) mapper.xml
映射文件的命名:
User.xml ;如果是mapper代理开发,映射文件的名称则叫xxxmapper.xml,比如: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">
<!-- namespace命名空间 ,作用是对sql进行分类管理,理解sql隔离
注意:如果使用mapper代理卡法方式,namespace有特殊重要的作用
-->
<mapper namespace="test">
<!-- 在配置文件中配置很多sql语句-->
<!-- 通过select执行数据库的查询 。
id:标识映射文件中的sql,称为statement的id,
将来sql语句会封装到mapperdStatement当中。
#{}表示一个占位符。
parameterType:指定输入参数的类型,这里指定的int型。
#{id}其中的id表示接受输入的参数,如果输入的是简单类型,#{}中的参数名可以任意,可以value或其他名称
resultType:指定sql输出的结果所映射的java对象的类型,selec指定resultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
SELECT * FROM USER WHERE id=#{id}
</select>
</mapper>
mapper.xml文件中配置的主要内容:
1、namespace作用是对sql进行分类管理,
2、<select>标签执行数据库的数据 id标识映射文件中的sql,称为statement的id
3、parameterType指定输入参数的类型。比如这里是通过id查找用户,id是int类型,所以填的是int
4、sql语句中#{}表示一个占位符,类似于jdbc的?。#{id}其中的id表示接受输入的参数
5、resultType指定sql输出的结果映射的java对象的类型
为什么要设定resultType呢?
因为需要输出结果的对象(POJO)接收查询结果,所以接下来创建一个POJO类接收查询结果。
3、创建POJO类
4、在SqlMapConfig.xml中加载映射文件
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>
5、程序代码
mybatis必须的配置完成之后,接下来使用mybatis完成增删改查的小案例
@Test
public void findUserById() throws IOException{
//通过工厂得到sqlSesssion
SqlSession sqlSession = null;
try {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaatis的配置文件信息
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = factory.openSession();
//通过SqlSession操作数据库
//第一个参数:映射文件中statement的id,等于=namespace+“.”+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型参数
//sqlSession.selectOne的结果是映射文件中所匹配的resultType类型的对象
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
sqlSession.close();
}
}
从以上程序可以看出,
1、先创建会话工厂SqlSessionFactory,并将配置文件信息传入会话工厂
2、通过会话工厂创建sqlSession
3、使用sqlSession操作数据库
User user = sqlSession.selectOne("test.findUserById", 1);
第一个参数:映射文件中statement的id,第一个参数的值等于=namespace+“.”+statement的id
第二个参数:指定和映射文件中所匹配的parameterType类型参数
sqlSession.selectOne的结果是映射文件中所匹配的resultType类型的对象
4、释放资源
sqlSession.close();
selectOne 和 selectList的区别
selectOne 表示查询出一条记录进行映射。如果使用的是selectOne可以实现,那么使用selectList也可以实现
selectList表示查询出一个列表多条记录进行映射。如果使用selectList查询多条记录,不能使用selectOne
#{} 和${}区别
#{}表示一个占位符,#{}接收输入参数,类型可以是简单类型,pojo,hashmap
如果接收的是简单类型,#{}中可以写成value或其他
#{}接收的pojo类型,使用的是OGNL读取对象中的属性值
${}表示一个拼接符号,会引发sql注入,不建议使用
${}接收的是输入参数,类型也可以是简单类型,pojo,hashmap
如果接收的是简单类型,${}中只能写value
${}接收的pojo类型,使用的是OGNL读取对象中的属性值
5.1、模糊查询
<select id="findUserByName" parameterType="java.lang.String" resultType="com.mybatis.pojo.User">
SELECT * FROM USER WHERE username like '%${value}%'
</select>
5.2、添加数据
<insert id="insertUser" parameterType="com.mybatis.pojo.User">
insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})
</insert>
5.2.1、自增主键的返回
mysql自增主键,执行insert之前自动生成一个自增主键
通过mysql函数获取到刚插入记录的自增主键:
LAST_INSERT_ID
是insert之后调用此函数
使用自增主键这种方式是先执行insert语句 , 执行过语句主后键已经生成,使用LAST_INSERT_ID查询出主键,并返回到user对象,所以order设置为AFTER。
5.2.2、非自增主键返回
<!-- 使用mysql的uuid生成主键
执行过程:
1、首先通过uuid生成主键,然后设置到user对象的id属性中。
2、其次在执行insert语句时,从user对象中取出id属性值。
-->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT UUID()
</selectKey>
使用uuid这种方式是 先生成主键,再执行insert语句,再将uuid设置到user对象的id属性中,所以order设置成"BEFORE" 。
在执行insert语句时,从user对象中取出id属性值。
通过oracle的序列生成主键:
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
select 序列名.nextval()
</selectKey>
6、删除数据
<delete id="deleteUserById" parameterType="java.lang.String">
delete from user where id=#{id}
</delete>
7、更新数据
<update id="upadteUserById" parameterType="com.mybatis.pojo.User" >
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
根据id更新用户 需要传入id,传入用户更新信息
parameterType指定User对象,包括id和更新信息,注意:id必须存在
#{id}从输入的user对象中获取id的属性值进行数据更新