Mybatis是相似Hibernate的ORM持久层框架java
1 频繁的建立和打开,关闭数据库,太消耗资源mysql
2 sql语句存在硬编码,不利于维护spring
3 sql参数设置硬编码,不利于维护sql
4 结果集获取与遍历复杂,存在硬编码,不利于维护,指望可以查询后返回一个java对象数据库
Mybatis本是Apache的一个开源项目iBatis.是面向sql的持久层框架,对jdbc进行了封装。apache
开发中,能够只专一于sql语句自己的拼装,其余复杂过程交给MyBatis完成缓存
导入依赖jar包session
配置SqlMapConfig.xml映射文件,映射加载:项目名/文件名 , 默认在config文件下,mybatis包下加载mybatis
配置log4j.properties,输出到控制台app
pojo:与Hibernate的domain相同,提供属性的getset方法
配置sql查询映射文件 user.xml , namesapce:命名空间, select id 等 见下图
方式一:手动在sql语句里面设置查询,#{name}
方式二:直接在user.xml中设置,${}是字符串拼接指令,若是入参为普通数据类型,括号内只能写value
一:
映射:
单元测试:
二:${}是字符串拼接指令,若是入参为普通数据类型,括号内只能写value
单元测试:
映射:
单元测试:若是不想手动提交事务,设置openSession(true)
方式一:
方式二:方式1的简写,使用自增,底层调用函数
配置:
测试:
/MyBatis/config/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> <!-- 和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="fungsumyuet" /> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <mapper resource="MyBatis/user.xml" /> </mappers> </configuration>
/MyBatis/config/mybatis/user.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语句,后继有重要做用 #{}:占位符,至关于jdbc的?? --> <mapper namespace="user"> <!-- id:sql id, 语句的惟一标识 parameterType:入参数据类型 resultType:返回结果的数据类型 --> <select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User"> SELECT * FROM `user` WHERE id = #{id2}; </select> <!-- 模糊查询用户,结果为集合,设置resultType为pojo路径便可 --> <select id="getUserByUserName" parameterType="String" resultType="com.mybatis.pojo.User"> SELECT `id`, `username`, `birthday`, `sex`, `address` FROM `user` <!-- WHERE username LIKE #{name}; --> WHERE username LIKE '%${value}%'; </select> <!-- 插入用户,若是用户id为自增,则删去id.入参为user pojo --> <insert id="insertUser" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" > <!-- selectKey:主键返回 keyProperty:user中的主键属性 resultType:主键的数据类型 order:指定selectKey什么时候执行(在插入语句以前仍是以后设置属性) --> <!-- <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID(); </selectKey> --> <!-- 设置uuid --> <selectKey keyProperty="uuid2" order="AFTER"> SELECT UUID(); </selectKey> INSERT INTO `user` ( `username`, `birthday`, `sex`, `address` `uuid2` ) VALUES ( #{username}, #{birthday}, #{sex}, #{address} #{uuid2} ); </insert> <!-- 插入用户,同时配置,后配置的生效,主键为null,返回的是uuid, --> <insert id="insertUserUuid" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" > <!-- selectKey:主键返回 keyProperty:user中的主键属性 resultType:主键的数据类型 order:指定selectKey什么时候执行(在插入语句以前仍是以后设置属性) --> <!-- <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID(); </selectKey> --> <!-- 设置uuid --> <selectKey keyProperty="uuid2" resultType="string" order="AFTER"> SELECT UUID(); </selectKey> INSERT INTO `user` ( `username`, `birthday`, `sex`, `address`, `uuid2`) VALUES (#{username}, #{birthday}, #{sex}, #{address}, #{uuid2}); </insert> <!-- 修改用户 --> <update id="updateUser" parameterType="com.mybatis.pojo.User" > UPDATE `user` SET `username` = #{username} WHERE `id` = #{id}; </update> <!-- 删除用户 --> <delete id="deleteUser" parameterType="int"> delete from `user` where `id` = #{id} </delete> </mapper>
/MyBatis/src/com/mybatis/test/MybatisTest.java
package com.mybatis.test; import java.io.IOException; import java.io.InputStream; import java.util.Date; 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.Test; import com.mybatis.pojo.User; import com.mybatis.utils.SqlSessionFactoryUtils; public class MybatisTest { @Test //根据id查询对象 public void testGetUserById() throws IOException{ //建立SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); //建立核心配置文件输入流,Mybatis自带Resources方法加载配置 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //经过输入流建立sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream); //建立sqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //执行查询,参数1:sql id , 参数2:入参 User user = sqlSession.selectOne("user.getUserById", 1); //打印结果 System.out.println(user); //释放资源 sqlSession.close(); } @Test //根据username查询对象 public void testgetUserByUserName() throws IOException{ //建立SqlSessionFactory对象,加载配置 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); //建立sqlSession对象,打开会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //执行查询,参数1:sql id , 参数2:入参 // List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%"); //方式二 List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%"); //打印结果 for (User user : list) { System.out.println(user); } //释放资源 sqlSession.close(); } @Test //插入测试,返回主键 public void testinsertUser() throws IOException{ //建立sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); //打开会话 SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("插入测试"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("河南郑州"); //执行插入 sqlSession.insert("user.insertUser",user); System.out.println(user); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } @Test //插入测试,返回uuid public void testinsertUserUuid() throws IOException{ //建立sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); //打开会话 SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("插入测试"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("河南郑州"); //执行插入 sqlSession.insert("user.insertUserUuid",user); System.out.println(user); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } @Test //修改用户 public void testupdateUser(){ SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(32); user.setUsername("修改测试"); sqlSession.update("user.updateUser", user); System.out.println(user); sqlSession.commit(); sqlSession.close(); } @Test //删除用户 public void testdeleteUser(){ SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("user.deleteUser", 28); sqlSession.commit(); sqlSession.close(); } }