1,简单介绍一下mybatis框架,Mybatis是Apache的一个开源项目——iBatis,2010年这个项目迁移到Google Code,并改名为MyBatis.
MyBatis是一个基于java的持久层框架。MyBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO),它消除了几乎所有的JDBC代码和参数的手工设置,以及结果的检索。MyBatis使用简单的XML或注解用于配置和原始的映射,将接口和java的POJOs映射成数据库中的记录。
目前,java的持久层框架产品有许多,常见的有hibernate和mybatis.mybatis是一个半自动映射的框架,因为Mybatis需要手动匹配POJO、SQL和映射关系,而和hibernate是一个全表映射的框架,只需提供pojo和映射关系即可。没有mybatis是一个小巧、方便、高效、简单、直接、半自动化的持久层框架 ,hibernate是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。两个框架各有特点,需要根据情况选择合适的框架。
框架配置:建立一个普通的工程即可,然后建立一个lib文件夹
(1)导包:导入一下的jar包
(2)编写一个普通的POLO类与数据库对应 。
package cn.zhong.mybatis.user;
public class User {
private int id;
private String loginName;
private String loginPwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
@Override
public String toString() {
return "User [id=" + id + ", loginName=" + loginName + ", loginPwd=" + loginPwd + "]";
}
}
(3)使用mybatis 框架,每一个对象都需要一个对应的mapper配置文件与之对应。
<?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的值后面DAO层操作会用到,id的值是要查询的方法
#{} 这个相当于hibernate的?,是占位符,#{loginName}表示读入loginName的值放入。
-->
<mapper namespace="cn.zhong.mybatis.user.UserMapper">
<select id="selectUserById" parameterType="Integer" resultType="cn.zhong.mybatis.user.User">
select * from User where id = #{id}
</select>
<select id="selectAllUser" resultType="cn.zhong.mybatis.user.User">
select * from User
</select>
<insert id="adduser" parameterType="cn.zhong.mybatis.user.User" >
insert into User(loginName,loginPwd) values(#{loginName},#{loginPwd})
</insert>
<update id="updataId" parameterType="cn.zhong.mybatis.user.User">
update User set loginName = #{loginName},loginPwd=#{loginPwd} where id = #{id}
</update>
<delete id="deleteUser" parameterType="cn.zhong.mybatis.user.User">
delete from User where id = #{id}
</delete>
</mapper>
(4)编写一个主配置文件,里面包函数据库连接的信息,和把上面的映射文件放到配置文件中去。
<?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"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="AYZXX"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/zhong/mybatis/user/Mybatis.xml"/>
</mappers>
</configuration>
(5)上面的配置完毕,应该就是测试了,测试的步骤和hibernate差不多,比较简单。
//select * from User 查询表的所有;
@Test
public void fun2() throws IOException{
//加载文件
InputStream config= Resources.getResourceAsStream("sqlMapConfig.xml");
// 用文件构建 SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
//用工厂建立,Session
SqlSession ss = ssf.openSession();
List<User> list = ss.selectList("cn.zhong.mybatis.user.UserMapper.selectAllUser");
System.out.println("********************************");
for (User user : list) {
System.out.println(user);
}
}
//单个查询,和插入一条数据,放在一起了
@Test
public void fun1() throws IOException{
//加载文件
InputStream config= Resources.getResourceAsStream("sqlMapConfig.xml");
// 用文件构建 SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
//用工厂建立,Session
SqlSession ss = ssf.openSession();
User mu = ss.selectOne("cn.zhong.mybatis.user.UserMapper.selectUserById", 1);
System.out.println(mu);
User addmu = new User();
addmu.setLoginName("Jeck");
addmu.setLoginPwd("456");
// 插入一组数据
ss.insert("cn.zhong.mybatis.user.UserMapper.adduser", addmu);
ss.commit();
ss.close();
}
//更新数据
@Test
public void fun3() throws IOException{
//加载文件
InputStream config= Resources.getResourceAsStream("sqlMapConfig.xml");
// 用文件构建 SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
//用工厂建立,Session
SqlSession ss = ssf.openSession();
User updateUser = new User();
updateUser.setId(8);
updateUser.setLoginName("张兰");
updateUser.setLoginPwd("789");
System.out.println(updateUser);
ss.update("cn.zhong.mybatis.user.UserMapper.updataId",updateUser);
System.out.println(updateUser);
ss.commit();
ss.close();
}
//删除数据
@Test
public void fun4() throws IOException{
//加载文件
InputStream config= Resources.getResourceAsStream("sqlMapConfig.xml");
// 用文件构建 SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
//用工厂建立,Session
SqlSession ss = ssf.openSession();
User deleteUser = new User();
deleteUser.setId(8);
ss.delete("cn.zhong.mybatis.user.UserMapper.deleteUser",deleteUser);
ss.commit();
ss.close();
}
总结:测试的时候我没有把所有的增删改查放到一个方法中,所有整体看起来代码比较多,重复的比较多,个人喜欢分类,宁愿复杂一点。这个配置比较简单,没啥说的。