mybatis是一个orm框架,其特点是需要使用原生sql语句,这一点跟hibernate有所不同,hibernate在数据持久化的时候基本上可以不用原生的sql语句(当然也可以使用)。
好吧,这里还是具体来写写怎么使用mybatis吧。
首先,导包问题,mybatis使用需要的jar包还是比较简单的,只需要一个mybatis-版本号.jar包以及对应数据库驱动的jar包,对应jar包查看附件。
其次,主配置文件:
这个配置文件名称可以随意名称的xml文件,当然只需要在获取sqlsessionfactory时对应这个文件名称即可,具体实例如下:
String resource = "conf.xml"; InputStream is = DBFactory.class.getClassLoader().getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(is);
这里我的配置文件的名称就为conf.xml。在这里再补充一点吧,mybatis可以不用通过配置文件来获取sqlsessionfactory对象,可以直接使用java代码获取,这个官方文档上的说明是可以,但是不推荐使用,所以这里暂且先不记录了。
接下来还是来看看conf.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> <environments default="development"> <environment id="development"> <!-- 配置事物 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/school" /> <property name="username" value="root" /> <property name="password" value="a123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/bdx/mapper/userMapper.xml" /> <mapper resource="cn/bdx/mapper/teacherMapper.xml" /> </mappers> </configuration>
这里只是使用了environments与mappers这两个比较简单基本的标签,
environments表示的是链接的数据库,这里如果需要链接多个数据库,可以写多个environments,
每个SqlSessionFactory 实例只能选择一个运行环境。
mappers表示的匹配对应的pojo,这里使用的xml文件方式,所以写法如上,如果是注解方式,其写法如下:
<mappers> <mapper class="cn.bdx.dao.intf.UserDao"/> </mappers>
configuration下还有很多其他的子元素,这里就不详细描述了。
接下来基于配置文件方式的使用吧,主配置文件conf.xml文件如上
POJO类:
package cn.bdx.model; public class User { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
对应mapper的配置文件(名称为userMappper.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"> <mapper namespace="cn.bdx.mapper.userMapper"> <select id="getUser" parameterType="int" resultType="cn.bdx.model.User"> select * from user_test where id=#{id} </select> </mapper>
具体使用:
@Test public void testSelectUser() { int id = 1; SqlSession session = DBFactory.getSession(); User user = (User)session.selectOne("cn.bdx.mapper.userMapper.getUser", id); System.out.println(user); }
说一说这个方法中 session.selectOne("cn.bdx.mapper.userMapper.getUser", id)第一个参数是userMapper.xml文件中<mapper>标签中的namaspace的值与<select>标签中id的值的组合。到这里一个基本使用查询的mybatis的实例就结束了,个人感觉还是比较简单的。
接下来说说注解方式的使用吧。注解方式在前面说过在主配置文件(conf.xml)中需要将<mapper>标签更改一下,更改之后就没有了userMapper.xml文件了,所以到这里应该考虑的是userMapper.xml文件所做的事情我们在哪里完成呢?答案当然是使用注解,但是注解在哪里写呢,需要写一些什么样的注解呢?
好吧,来看看整个基于注解方式的代码是怎么写的吧:
conf.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> <environments default="development"> <environment id="development"> <!-- 配置事物 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/hibernate" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper class="cn.bdx.dao.intf.UserDao"/> </mappers> </configuration>
User类:
package cn.bdx.model; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
UserDao类:
package cn.bdx.dao.intf; import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import cn.bdx.model.User; public interface UserDao { @Insert("insert into t_user (name,age) values(#{name},#{age})") public int addUser(User user); @Select("select * from t_user") public List<User> queryUser(); }
这个类就比较明显了,看到这里其实就说出了userMapper.xml所做的事情其实在这里只需要使用@Insert、@Select等等注解就可以了,然后写上相应的sql语句即可。
接下来是使用的方式:
package cn.bdx.testall; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import cn.bdx.dao.intf.UserDao; import cn.bdx.model.User; import cn.bdx.utils.DBFactory; public class Main { @Test public void testAddUser() { User user = new User(); user.setAge(11); user.setName("旺旺"); SqlSession session = DBFactory.getSession(); UserDao userDao = session.getMapper(UserDao.class); int count = userDao.addUser(user); if(count > 0) { System.out.println("添加成功"); }else { System.out.println("添加失败"); } } public static void main(String[] args) { User user = new User(); user.setAge(11); user.setName("旺旺"); SqlSession session = DBFactory.getSession(); UserDao userDao = session.getMapper(UserDao.class); int count = userDao.addUser(user); if(count > 0) { System.out.println("添加成功"); }else { System.out.println("添加失败"); } } @Test public void testQueryAddUser() { SqlSession sqlSession = DBFactory.getSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> users = userDao.queryUser(); System.out.println(users); } }
----------------------------------------------------------------------------------------------------------------------------------
接下来看看mybatis多表操作吧。
多对一关系:一个teacher有多个student,具体代码如下:
conf.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> <environments default="development"> <environment id="development"> <!-- 配置事物 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/school" /> <property name="username" value="root" /> <property name="password" value="a123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/bdx/mapper/teacherMapper.xml" /> </mappers> </configuration>
Teacher类:管理teacher与student之间的关系,在teacher类中有student的集合的属性
package cn.bdx.model; import java.util.List; public class Teacher { private int tid; private String tname; private String tsex; private List<Student> studentList; public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public String getTsex() { return tsex; } public void setTsex(String tsex) { this.tsex = tsex; } @Override public String toString() { return "Teacher [tid=" + tid + ", tname=" + tname + ", tsex=" + tsex + ", studentList=" + studentList + "]"; } }
Student类:
package cn.bdx.model; public class Student { private int sid; private String sname; private int sage; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + "]"; } }
teacherMapper.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"> <mapper namespace="cn.bdx.mapper.teacherMapper"> <select id="queryTeacher" parameterType="int" resultMap="queryTeacherResults"> select * from teacher_test t,student_test s where t.t_id=s.tid and t.t_id=#{tid} </select> <resultMap type="cn.bdx.model.Teacher" id="queryTeacherResults"> <id property="tid" column="t_id"/> <result property="tname" column="t_name"/> <result property="tsex" column="t_sex"/> <collection property="studentList" ofType="cn.bdx.model.Student"> <id property="sid" column="s_id"/> <result property="sname" column="s_name"/> <result property="sage" column="s_age"/> </collection> </resultMap> </mapper>
测试:
package cn.bdx.testall; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import cn.bdx.model.Teacher; import cn.bdx.utils.DBFactory; public class Main { @Test public void testQueryTeacher() { SqlSession session = DBFactory.getSession(); List<Object> list = session.selectList("cn.bdx.mapper.teacherMapper.queryTeacher", 1); for (Object object : list) { Teacher teacher = (Teacher) object; System.out.println(teacher); } } }
完毕,这是一个多对一关系的xml方式的写法,注意这里没有studentMapper.xml文件。
一对多关系:还是teacher与student。
conf.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> <typeAliases> <typeAlias type="cn.bdx.model.Student" alias="Student"/> <typeAlias type="cn.bdx.model.Teacher" alias="Teacher"/> </typeAliases> <environments default="development"> <environment id="development"> <!-- 配置事物 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/school" /> <property name="username" value="root" /> <property name="password" value="a123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/bdx/mapper/studentMapper.xml" /> </mappers> </configuration>
Teahcer类:
package cn.bdx.model; public class Teacher { private int tid; private String tname; private String tsex; public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public String getTsex() { return tsex; } public void setTsex(String tsex) { this.tsex = tsex; } @Override public String toString() { return "Teacher [tid=" + tid + ", tname=" + tname + ", tsex=" + tsex + "]"; } }
Student类:
package cn.bdx.model; public class Student { private int sid; private String sname; private int sage; private Teacher teacher; public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + ", teacher=" + teacher + "]"; } }
这里使用Student类来管理teacher与student之间的关系,student类中有一个Teacher属性,对应的studentMapper.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"> <mapper namespace="cn.bdx.mapper.studentMapper"> <select id="queryStudent" parameterType="int" resultMap="queryStudentResults"> select * from teacher_test t,student_test s where t.t_id=s.tid </select> <resultMap type="Student" id="queryStudentResults"> <id property="sid" column="s_id"/> <result property="sname" column="s_name"/> <result property="sage" column="s_age"/> <association property="teacher" column="tid" javaType="Teacher"> <id property="tid" column="t_id"/> <result property="tname" column="t_name"/> <result property="tsex" column="t_sex"/> </association> </resultMap> </mapper>
测试:
package cn.bdx.testall; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import cn.bdx.model.Student; import cn.bdx.utils.DBFactory; public class Main { @Test public void testQueryStudent() { SqlSession session = DBFactory.getInstance().getSession(); List<Object> list = session.selectList("cn.bdx.mapper.studentMapper.queryStudent", 1); for (Object object : list) { Student teacher = (Student) object; System.out.println(teacher); } } public static void main(String[] args) { SqlSession session = DBFactory.getInstance().getSession(); List<Object> list = session.selectList("cn.bdx.mapper.studentMapper.queryStudent", 1); for (Object object : list) { Student teacher = (Student) object; System.out.println(teacher); } } }
对于多对多或者一对一关系的操作基本上可以使用上面的方式进行变种既可以写出来,这里就不再详细记录了。
最后,贴上DBFactory类的代码吧:
package cn.bdx.utils; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class DBFactory { private final String CONFIG_FILE_PATH = "conf.xml"; private SqlSessionFactory factory = null; private SqlSession session = null; private static DBFactory instance = null; /** * 获取SqlSessionFactory以及SqlSession对象 */ private DBFactory() { Reader reader = null; try { reader = Resources.getResourceAsReader(CONFIG_FILE_PATH); factory = new SqlSessionFactoryBuilder().build(reader); session = factory.openSession(); } catch (IOException e) { e.printStackTrace(); } finally { if(reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 获取DBFactory的实例 * @return DBFactory的实例 */ public static synchronized DBFactory getInstance() { if(instance == null) { synchronized (DBFactory.class) { instance = new DBFactory(); } } return instance; } /** * 获取SqlSession对象 * @return SqlSession对象 */ public SqlSession getSession() { if(session == null) { throw new RuntimeException("Create SqlSession failed."); } return session; } }
关于注解方式以后在来记录吧。
注:以上测试代码可以在我的csdn下面找得到,访问地址分别是:
单表xml:http://download.csdn.net/detail/mjcreator/9528305
单表注解:http://download.csdn.net/detail/mjcreator/9528322