一、Mybatis(ibatis)是什么
MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层(dao)框架。MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和Java 的POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
半orm(对象关系映射)框架:
把实体类和数据库的记录做映射
比如:数据库
Id name age
1 zhangsan 18
映射为对象:Student s = new Student(1,”zhangsan”,18);
或者把对象映射为数据库的一条记录。
二、环境搭建
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>
<environments default="development">
<environment id="development">
<!-- 使用jdbc方式控制事务 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供的连接池链接数据
未来:mybatis+spring+sprignmvc 这一步交给spring
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mydb?unicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="111111"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射文件 -->
<mappers>
<mapper resource="com/tf/domain/UsersMapper.xml"></mapper>
</mappers>
</configuration>
编写映射文件 resultType:指定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="com.tf.domain.Users">
<!-- 根据selectById名查询用户 -->
<select id="selectById" parameterType="int" resultType="com.tf.domain.Users">
select * from users where id=#{id}
</select>
<!-- 全查 resultType:指定sql语句的结果集 (每一行对应的结果) -->
<select id="findAll" resultType="com.tf.domain.Users">
select * from users
</select>
<insert id="saveUsers" parameterType="com.tf.domain.Users">
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.tf.domain.Users">
update users set name=#{name},password=#{password},status=#{status},createDate=#{createDate}
where id=#{id}
</update>
</mapper>
实体类与数据库的字段一致:
测试类:
public class Test {
public static void main(String[] args) {
//指定配置文件
String config="mybatisConfig.xml";
//2、读取mybatis的映射文件
try {
Reader reader = Resources.getResourceAsReader(config);
//3、构建sqlSessionFacotry对象
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
//通过sqlSessionFactory 获取sqlSession
SqlSession sqlSession= sqlSessionFactory.openSession();
//5、通过sqlSession调用映射文件中的sql语句
//根据映射文件的id,查找
Users u = sqlSession.selectOne("selectById",1);
System.out.println(u);
System.out.println("-----------------------");
List<Users> list = sqlSession.selectList("findAll");
for (Users users : list) {
System.out.println(users);
}
System.out.println("-----------------------");
Users u1 = new Users();
u1.setName("美丽");
u1.setPassword("admin");
u1.setStatus(1);
u1.setCreateDate(Date.valueOf("2012-2-1"));
System.out.println( sqlSession.insert("saveUsers",u1)>0?"新增成功":"新增失败");
System.out.println( sqlSession.delete("deleteUser",1)>0?"删除成功":"删除失败");
System.out.println("-----------------------");
u1.setId(2);
System.out.println( sqlSession.update("updateUser",u1)>0?"修改成功":"修改失败");
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、新增时返回主键
方法一: 使用selectKey节点配置
配置返回自增主键 把主键封装到参数的id字段
keyProperty:实体类中主键的属性名
keyColumn:数据库中主键的列名
order:执行该语句的时机
resultType:该sql语句的返回值类型
<!-- 新增+返回自增主键 -->
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
测试:
System.out.println("新增前id "+u1.getId());
sqlSession.insert("saveUsersAndRuturnId" ,u1);
System.out.println("新增后id "+u1.getId());
方法二:useGeneratedKeys="true"
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
四、主键返回值UUID
当主键id为String时,可以使用UUID,来生成唯一的id
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users1">
<selectKey keyColumn="id" keyProperty="id" resultType="String" order="BEFORE">
select UUID()
</selectKey>
insert into users1(id,name,password,status,createDate)
values(#{id},#{name},#{password},#{status},#{createDate})
</insert>