mybatis CURD
1、XML的方式
过程与上一篇mybatis入门示例一致,将users表的SQL映射配置文件(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"> <!--CURD 映射配置--> <mapper namespace="userMapper"> <insert id="insertUser" parameterType="com.mybatis.hello.User"> insert into users(name, age) values(#{name}, #{age}); </insert> <delete id="deleteUser" parameterType="int"> delete from users where id=#{id} </delete> <update id="updateUser" parameterType="com.mybatis.hello.User"> update users set name=#{name},age=#{age} where id=#{id} </update> <select id="selectUser" parameterType="int" resultType="com.mybatis.hello.User"> select * from users where id=#{id} </select> <select id="selectAllUsers" resultType="com.mybatis.hello.User"> select * from users </select> </mapper>
同时可修改注释部分,自由测试
package com.mybatis.hello; 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 java.io.IOException; import java.io.Reader; import java.util.List; /** * Created by yanghui10 on 2016/8/3. */ public class MybatisTest { public static void main(String[] args) throws IOException { String resource = "conf.xml"; //加载mybatis 的配置文件(它也加载关联的映射文件) // InputStream is=MybatisTest.class.getClassLoader().getResourceAsStream(resource); Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession 的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //创建能执行映射文件中sql 的sqlSession SqlSession session = sessionFactory.openSession(); //映射sql 的标识字符串 // String statement = "userMapper"+".selectUser"; String statement = "userMapper"+".selectAllUsers"; //执行查询返回一个唯一user 对象的sql // User user = session.selectOne(statement, 1); // int a=session.insert(statement,new User("sad",19)); // session.insert(statement,new User("asd",15)); // session.insert(statement,new User("d",19)); // session.insert(statement,new User("fffd",14)); // session.commit(); List<User> users=session.selectList(statement); // User user = session.selectOne(statement, 1); System.out.println(users); } }
注意:看到session.commit()没?
涉及insert、update、delete的DML,要手动的commit呢,注意close(这里没写session.close())方法是不会监测有木有commit,
幻想close方法去commit会让你死的很惨滴。
2、接口注解的方式
相对应的,将XML方式的users表的SQL映射配置文件(userMapper.xml)去掉,创建如下sql映射的接口
package com.mybatis.hello; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; /** * Created by yanghui10 on 2016/8/3. */ public interface UserMapper { @Insert("insert into users(name, age) values(#{name}, #{age})") public int insertUser(User user); @Delete("delete from users where id=#{id}") public int deleteUserById(int id); @Update("update users set name=#{name},age=#{age} where id=#{id}") public int updateUser(User user); @Select("select * from users where id=#{id}") public User getUserById(int id); @Select("select * from users") public List<User> getAllUser(); }
同样的,在conf.xml中改为注册接口:
<mappers> <!--接口的方式 注册接口--> <mapper class="com.mybatis.hello.UserMapper"/> <!--XML的方式 注册映射配置文件--> <!--<mapper resource="userMapper"/>--> </mappers>
测试代码中调用部分改为如下
// String statement = "userMapper"+".selectAllUsers"; // List<User> users=session.selectList(statement); UserMapper userMapper=session.getMapper(UserMapper.class); List<User> users=userMapper.getAllUser(); System.out.println(users);
优化:可以定义一个工具类,只在加载时创建一次SqlSessionFactory对象(或者其它单例模式),因为此对象只需要一次
如下,直接由静态方法返回新的sqlSession即可
package com.mybatis.common; import com.mybatis.hello.MybatisTest; 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 java.io.InputStream; import java.io.Reader; /** * * 用mybatis实现的dao层,具体核对对象是SqlSession。 *由于dao层依赖于SqlSession。而SqlSession的创建过程需要SqlSessionFactory对象, *此对象对于多次的CRUD操作只需要一个对象,所以这里引用另一个自定义的MyBatisUtils工具类。 * * Created by yanghui10 on 2016/8/3. */ public class MybatisUtil { private static SqlSessionFactory sqlSessionFactory; static { String resource = "conf.xml"; //加载mybatis 的配置文件(它也加载关联的映射文件) InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream(resource); //构建sqlSession 的工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } /** * 返回一个SqlSession对象(每次返回一个新的SqlSession对象) * 若涉及多个表的操作,涉及事务的,要做到操作失败时回滚,那么建议自定义一个TransactionUtils的工具类 * 用ThreadLocal类来保存SqlSession类,这样跨多个dao操作时,确保获取的都是同一SqlSession对象。 * 然后在service层中捕获异常,再catch上用session的回滚。 */ public static SqlSession openSesison(){ return sqlSessionFactory.openSession();//使用参数 true 则为自动提交 } }
mybatis的使用确实非常简单方便,MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和Java 的POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
不过要形成Spring+SpringMVC+Mybatis+Velocity以及各种服务框架和MQ等的大型架构,以及项目中每一层(dao、domain、service等)的准确划分,任然是需要探索的难点。