建立config.xml 文件,一般与src 下级目录
config.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.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url"
value="jdbc:sqlserver://localhost:1433;databaseName=Users" />
<property name="username" value="sa" />
<property name="password" value="******" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="model/user.xml" /><span style="white-space:pre"> </span><!--注意这里用的是 / 不是 . -->
</mappers>
</configuration>
建立 model 实体类:
User.java:
package model;
public class User {
private int id;
private String name;
private String password;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ "]";
}
public User() {
// TODO Auto-generated constructor stub
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
}
建立实体类的配置文件:
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">
<mapper namespace="model.IUserService">
<!-- selectUserById -->
<select id="selectUserById" parameterType="int" resultType="model.User">
select Id as id,UserName as name,PassWord as password from UserInfo
where id = #{id}
</select>
<!-- 动态查询 -->
<select id="selectUserByCondition" parameterType="model.User" resultType="model.User">
select Id as id,UserName as name,PassWord as password from UserInfo
<where>
<if test="id!=0">
Id=#{id}
</if>
<if test="name!=null">
and Id=#{name}
</if>
<if test="password!=null">
and Id=#{password}
</if>
</where>
</select>
<!--selectAllUsers -->
<select id="selectAllUsers" resultType="model.User">
select Id as id,UserName
as name,PassWord as password from UserInfo
</select>
<!-- selectUserForMap -->
<select id="selectUserForMap" parameterType="int" resultType="hashmap">
select Id as id,UserName as name,PassWord as password from UserInfo
where id = #{id}
</select>
<!-- insertOneUser -->
<insert id="insertOneUser" parameterType="model.User">
insert into UserInfo(Id,UserName,PassWord) values(#{id},#{name},#{password})
</insert>
<!-- insertOneUserForHashMap -->
<insert id="insertOneUserForHashMap" parameterType="hashmap">
insert into UserInfo(Id,UserName,PassWord) values(#{id},#{name},#{password})
</insert>
<!-- deleteById -->
<delete id="deleteById" parameterType="int">
delete from UserInfo where Id=#{id}
</delete>
<!-- updateById -->
<delete id="updateById" parameterType="model.User">
update UserInfo set UserName=#{name},PassWord=#{password} where Id=#{id}
</delete>
</mapper>
注意:#{java实体类中的属性} 如果实体类中属性与数据库中的不一致 比如实体类中name,数据库中UserName ,查询时用别名的方法,select UserName as name from table
也可以在user.xml 中 <mapper> 标签中加配置项,方法如下:
<resultMap type="User" id="userMap">
<id column="id" property="id"/><!-- 数据库中的主键用标签 id ,其余的都用 标签 result , 数据库中的列用 column,java 实体类中的属性 用 property -->
<result column="UserName" property="name"/>
<result column="PassWord" property="password"/>
</resultMap>
配置好了resultMap 标签,在user.xml 中如果用别名的,把 resultType 改为 resultMap="resultMap标签的id",去掉 别名即可,比如对上面的selectUserById 进行修改
<!-- selectUserById -->
<select id="selectUserById" parameterType="int" resultMap="userMap"><!-- 注意把 resultType 改为 resultMap="resultMap标签的id"-->
select Id,UserName,PassWord from UserInfo
where id = #{id}
</select>
id:唯一标示,接口中的类名 parameterType:参数类型(在 java 中的类型 ,但是 String 写成 string(别名) 或者 java.lang.String) resultType:返回结果类型(带完整路径的名,比如:model.Users),也可以在config.xml 中设置别名,设置方法:
在 <configuration> 标签中添加,type 指的是 实际类名,alias 指的是 别名,在 user.xml 中用 model.User 的都可以用 User 代替
<typeAliases>
<typeAlias type="model.User" alias="User"/>
</typeAliases>
建立相应的接口:
IUserService.java:
package model;
import java.util.HashMap;
import java.util.List;
public interface IUserService {
public User selectUserById(int id);
public List<User> selectAllUsers();
public void insertOneUser(User user);
public HashMap selectUserForMap(int id);
public void insertOneUserForHashMap(HashMap map);
public void deleteById(int id);
public void updateById(User user);
public List<User> selectUserByCondition(User user);
}
注意这里的返回类型,参数类型,类名都是和user.xml 中一致的
建立JUit 测试类:(new--->JUnit Test Case---> 起名---->点击 Do you want to add comments?(...here)---->java Build Path ---->libraries----->add library---->JUnit--->Next---->JUnit 4 ---->finish---->OK---->finish)
Test1.java:
package model;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
public class Test1 {
public User user=null;
String resource = "config.xml";
InputStream inputStream = null;
List<User>users;
@Test<span style="white-space:pre"> </span>//注意这里
public void test() {
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SqlSessionFactory sf = new SqlSessionFactoryBuilder()
.build(inputStream);
SqlSession session = sf.openSession();
try {
//selectone("model.user.selectUserById",2);
IUserService iu = session.getMapper(IUserService.class);
user = iu.selectUserById(2);
System.out.println("selectone"+user);
//selectList("model.user.selectAllUsers");
users=iu.selectAllUsers();
for(User u:users){
System.out.println("selectList:"+u);
}
session.insert("model.user.insertOneUser",user);
user=new User(3,"zhangsan","123456");
iu.insertOneUser(user);
session.commit();//注意必须执行事务,否则不会提交到数据库
System.out.println("插入成功");
//查找 包装成 hashmap
HashMap map=iu.selectUserForMap(3);
System.out.println("map"+map);
//插入 参数 为 HashMap
HashMap hashMap=new HashMap();
hashMap.put("id", 4);
hashMap.put("name", "wangwu");//注意这里是与 实体类中的一致,不是与 数据库中的一致
hashMap.put("password", "123456");
iu.insertOneUserForHashMap(hashMap);
session.commit();
System.out.println("插入 成功 hashmap");
//delete
iu.deleteById(3);
session.commit();//注意必须执行事务
System.out.println("删除成功");
//update
user=new User(3,"zhangliu","sdaf");
iu.updateById(user);
session.commit();
System.out.println("更新成功");
//多条件动态查询
user=new User();
users=iu.selectUserByCondition(user);//相当于查询所有
for(User u:users){
System.out.println("动态查询 all:"+u);
}
user.setId(3);
users=iu.selectUserByCondition(user);//查询id 为 3 的
for(User u:users){
System.out.println("动态查询 id:"+u);
}
System.out.println("动态查询结束");
} finally {
session.close();
}
}
}
注意上面这个类中有的是增加删除时冲突的,测试只需测试需要的,注释掉其余的即可