- 第二天学习mybatis,发现框架的存在确实是省了我们很多时间,我们完全可以把一些操作简化,或者实现简单的封装提供我们使用。昨天是跟着教程云里雾里的实现了配置,今天再次使用就方便很多。
String resource="conf.xml"; //使用类加载mybatis驱动文件,(他也加载关联的附带文件) InputStream is=Test.class.getClassLoader().getResourceAsStream(resource); //构建sqlsession工厂 SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
- 首先记得昨天创建工厂时候这么亢长的代码吧,我们将他封装起来,让这个封装返回一个SqlSession对象,创建returnsqlsession类
封装部分的代码为:
package com.test.test1; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class returnsqlsession { public static SqlSessionFactory getSqlSessionFactory() { String resource="conf.xml"; InputStream in=returnsqlsession.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in); return factory; } public static SqlSession getSqlSession(){//返回sqlsession return getSqlSessionFactory().openSession(); } /** * 获取SqlSession * @param isAutoCommit * true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务 * false 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务 * @return SqlSession */ public static SqlSession getSqlSession(boolean isAutoCommit) { return getSqlSessionFactory().openSession(isAutoCommit); } }
方法一:xml配置
然后,我们要现在xml中添加数据库的语句userMapper.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"> -<mapper namespace="userMapper"> <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回 User类就是users表所对应的实体类 --> <!-- 根据id查询得到一个user对象 --> <select resultType="com.test.mybits.User" parameterType="Integer" id="getuser">select * from users where id=#{id} </select> <!-- 增删改查 --> <!-- 增 indesert --> <insert parameterType="com.test.mybits.User" id="adduser">insert into users(name,age) values(#{name},#{age}) </insert> <delete parameterType="Integer" id="deleteuser">delete from users where id=#{id} </delete> <update parameterType="com.test.mybits.User" id="updateuser">update users set name=#{name},age=#{age} where id=#{id} </update> <select resultType="com.test.mybits.User" id="datesearch">select * from users </select> </mapper>
建议不要一次全部写完,可以一条一条写,并且也可以知道那对拿错,可以即使修正。
接着,在测试类中进行逐步测试:
package com.test.test1; import java.io.IOException; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.test.mybits.User; public class test2 { public static void testadd() { SqlSession sqlsession=returnsqlsession.getSqlSession(true);//默认自动提交事务 String statement="userMapper.adduser"; User user=new User(); user.setname("abch"); user.setage(25); int result=sqlsession.insert(statement, user); sqlsession.close(); System.out.println(result); } public static void testdelete() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); String statement="userMapper.deleteuser"; int result=sqlsession.delete(statement,3); sqlsession.close(); System.out.println(result); } public static void testupdate() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); String statement="userMapper.updateuser"; User user=new User(); user.setid(1); user.setage(19); user.setname("赛爷哈哈"); int reslut=sqlsession.update(statement, user); sqlsession.close(); System.out.println(reslut); } public static void testsearch() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); String statement="userMapper.datesearch"; List list=sqlsession.selectList(statement); sqlsession.clearCache(); System.out.println(list); } public static void main(String[] args) throws IOException { // testadd(); //testdelete(); //testupdate(); testsearch(); } }
配置的时候注意查询需要的类型,以及返回的类型,有些操做不支持返回类型。
方法二:注解配置
创建com.test.mapper包。创建userMapper2.java接口
内容为:
package com.test.mapper; import java.util.List; 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 com.test.mybits.User; public interface userMapper2 { @Insert("insert into users(name,age) values(#{name},#{age})") public int add(User user); //使用@Delete注解指明deleteById方法要执行的SQL @Delete("delete from users where id=#{id}") public int deleteById(int id); //使用@Update注解指明update方法要执行的SQL @Update("update users set name=#{name},age=#{age} where id=#{id}") public int update(User user); //使用@Select注解指明getById方法要执行的SQL @Select("select * from users where id=#{id}") public User getById(int id); //使用@Select注解指明getAll方法要执行的SQL @Select("select * from users") public List getAll(); }
注解里面放方法,下面再声明一个共有函数。
再测试类中,具体使用如下:
package com.test.test1; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.test.mapper.userMapper2; import com.test.mybits.User; public class test3 { public static void testadd(){ SqlSession sqlsession=returnsqlsession.getSqlSession(true); //得到userMapper2接口的实现类对象,userMapper2接口的实现类对象由sqlsession.getMapper(UserMapper2.class)动态构建出来 userMapper2 mapper = sqlsession.getMapper(userMapper2.class); User user=new User(); user.setname("呜呜呜我真菜"); user.setage(17); int add=mapper.add(user); sqlsession.close(); System.out.println(add); } public static void testupdate() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); userMapper2 mapper=sqlsession.getMapper(userMapper2.class); User user=new User(); user.setage(155); user.setid(4); user.setname("白龙吟"); int update=mapper.update(user); sqlsession.close(); System.out.println(update); } public static void testdelete() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); userMapper2 mapper=sqlsession.getMapper(userMapper2.class); int id=7; int delete=mapper.deleteById(id); sqlsession.close(); System.out.println(delete); } public static void getuser() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); userMapper2 mapper=sqlsession.getMapper(userMapper2.class); int id=6; User user=mapper.getById(id); sqlsession.close(); System.out.println(user); } public static void getalluser() { SqlSession sqlsession=returnsqlsession.getSqlSession(true); userMapper2 mapper=sqlsession.getMapper(userMapper2.class); Listlist=mapper.getAll(); sqlsession.close(); System.out.println(list); } public static void main(String[] args) { //testadd(); //testupdate(); //testdelete(); //getuser(); getalluser(); } }
使用的方法差不了太多,运用了反射的思想。实际的配置名称还是以具体为主,mybatis操作数据比起sql语句真的方便很多。