通過SqlSession的實例可進行MyBatis的增刪改查操作;
以查詢爲例:
Object obj = sqlSession.selectOne("com.chensan.sys.entity.SysUser1.getById",1);
SysUser1 sysUser1 = (SysUser1)obj;
第一個參數爲映射文件命名空間加上相應元素的id值,第二個參數則爲Object類型,在相應SQL操作的元素上要指定參數類型;執行SQL後,獲取的返回值需要將Object轉換成想要的數據類型;這種操作的方式潛在的問題:
1.爲確保命名空間唯一,一般用實體類的全路徑名作爲namespace。如果拼寫錯誤,或者無意中被修改,會導致操作無法完成的問題;
2.操作的參數是Object類型,如果傳入的參數和映射文件的parameterType的數據類型不一致,會出現不可預知的錯誤;
3.返回值使用了泛型,須確保用於接收返回值的變量 類型與映射文件中屬性resultType指定的類型一致;
用戶表sys_user7:
CREATE TABLE `sys_user7` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`salary` decimal(8,2) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;
INSERT INTO `sys_user7` VALUES(1, '陳三', '1992-02-29', 123456.78, '深圳市南山區');
INSERT INTO `sys_user7` VALUES(2, '張三', '1990-03-05', 8500, '深圳市寶安區');
INSERT INTO `sys_user7` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田區');
INSERT INTO `sys_user7` VALUES(4, '趙四', '1988-09-15', 8000, '深圳市龍華新區');
用戶類SysUser7:
public class SysUser7 {
private int id;
private String userName;
private Date birthday;
private Double salary;
private String address;
//...省略setter、getter方法
public String toString(){
return "SysUser7 [id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "]";
}
}
接口SysUser7Dao:
public interface SysUser7Dao {
//新增用戶
public void insertUser(SysUser7 user);
//刪除用戶
public void deleteUser(int id);
//修改用戶
public void updateUser(SysUser7 user);
//查詢單個用戶
public SysUser7 getUserById(int id);
//根據用戶姓名查詢單個用戶
public List<SysUser7> getUserByName(String userName);
//查詢所有用戶
public List<SysUser7> getAllUser();
}
映射文件SysUser7.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="com.chensan.sys.dao.SysUser7Dao">
<resultMap type="com.chensan.sys.entity.SysUser7" id="sysUser7Map">
<result property="userName" column="user_name"/>
</resultMap>
<!-- 新增用戶 -->
<insert id="insertUser" parameterType="com.chensan.sys.entity.SysUser7" useGeneratedKeys="true" keyProperty="id">
insert into `sys_user7`(user_name, birthday, salary, address)
values(#{userName}, #{birthday}, #{salary}, #{address})
</insert>
<!-- 刪除用戶 -->
<delete id="deleteUser" parameterType="int">
delete from `sys_user7` where id=#{id}
</delete>
<!-- 根據id修改用戶信息 -->
<update id="updateUser" parameterType="com.chensan.sys.entity.SysUser7">
update `sys_user7` set user_name=#{userName}, birthday=#{birthday},
salary=#{salary}, address=#{address}
where id=#{id}
</update>
<!-- 根據id查詢單條用戶記錄 -->
<select id="getUserById" parameterType="int" resultMap="sysUser7Map">
select * from `sys_user7` where id=#{id}
</select>
<!-- 根據其它字段查詢用戶列表 -->
<select id="getUserByName" parameterType="java.lang.String" resultMap="sysUser7Map">
select * from `sys_user7` where user_name like '%${value}%'
</select>
<!-- 查詢用戶列表所有用戶 -->
<select id="getAllUser" parameterType="java.lang.String" resultMap="sysUser7Map">
select * from `sys_user7`
</select>
</mapper>
在MyBatis配置文件引入SyUser7的映射文件SysUser7.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>
<!-- 和spring整合後 environments配置將廢除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理 或者JTA事務管理-->
<transactionManager type="JDBC" />
<!-- 數據庫連接池 第三方組件:c3p0-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test1"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加載實體類的映射文件 -->
<mappers>
<mapper resource="com/chensan/sys/mapper/SysUser7.xml"/>
</mappers>
</configuration>
測試類:
public class MyBatisSysUser7InterfaceTest {
private static SqlSessionFactory sqlSessionFactory;
private static Reader resource;
//創建會話工廠
static{
try{
//讀取MyBatis配置文件
resource = Resources.getResourceAsReader("myBatisConfig.xml");
//創建SqlSessionFactory會話工廠
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
//插入一條數據
public void insert(){
SysUser7 user = new SysUser7();
user.setUserName("王二");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
user.setBirthday(df.parse("1988-08-23"));
} catch (ParseException e) {
e.printStackTrace();
}
user.setSalary(7800.00);
user.setAddress("深圳市羅湖區");
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
sysUser7Dao.insertUser(user);
sqlSession.commit();//新增、修改、刪除需要提交
sqlSession.close();
System.out.println(user);
}
//刪除一條記錄
public void delete(){
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
sysUser7Dao.deleteUser(2);
sqlSession.commit();
sqlSession.close();
}
//更新用戶記錄
public void update(){
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
SysUser7 user = new SysUser7();
user.setId(4);
user.setUserName("趙大光");
sysUser7Dao.updateUser(user);
sqlSession.commit();
sqlSession.close();
System.out.println(user);
}
public void getById(){
//開啓會話實例sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
SysUser7 user = sysUser7Dao.getUserById(5);
System.out.println(user);
sqlSession.close();
}
//根據其它字段查詢記錄
public void getByName(){
//開啓會話實例sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
List<SysUser7> users = sysUser7Dao.getUserByName("三");
for(SysUser7 user : users){
System.out.println(user);
}
sqlSession.close();
}
//查詢所有用戶記錄
public void getAll(){
//開啓會話實例sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
List<SysUser7> users = sysUser7Dao.getAllUser();
for(SysUser7 user : users){
System.out.println(user);
}
sqlSession.close();
}
public static void main(String[] args) {
MyBatisSysUser7InterfaceTest myBatisSysUser7InterfaceTest = new MyBatisSysUser7InterfaceTest();
//myBatisSysUser7InterfaceTest.insert();
//myBatisSysUser7InterfaceTest.delete();
//myBatisSysUser7InterfaceTest.update();
//myBatisSysUser7InterfaceTest.getById();
//myBatisSysUser7InterfaceTest.getByName();
myBatisSysUser7InterfaceTest.getAll();
}
}
接口方式編程,那麼映射文件如何知道被哪個接口代理了?
答:使用代理接口的全限定名作爲其命名空間(全限定名即接口所在的包名加上接口名稱)。
sqlSession.getMapper(SysUser7Dao.class);實例化接口,接口調用的方法名與namespace下要操作SQL對應元素的id一致即可完成SQL操作;