一. 以接口的方式编程
1. 改写userMapper.xml的内容如下,将namespace改为接口的路径名,其他不变:
<mapper namespace="inter.IUserOperation">
<select id="selectUser" resultType="javastudy.User">
select * from user where id = #{id}
</select>
</mapper>
2. 写个接口,其中的函数是上文中的id,要是有多个要执行的SQL语句,则该接口里也有多个相应的函数
public interface IUserOperation {
public User selectUser(int id);
}
3. 测试类
public class Mytest {
@Test
public void testSelect() throws IOException {
SqlSession session = MyBatisUtils.openSession();
//String statement ="javastudy.UserMapper.selectUser";//userMapper.xml中的namespace.id
//User user =(User)session.selectOne(statement,1);
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUser(1);
System.out.println(user);
session.close();
}
}
二. 实现数据的增删改查
1. 查询resultType表示查询返回的结果类型,是类实例。resultMap 所对应的应该是我们自己配置的
resultType | 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。 |
resultMap | 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。 |
<resultMap type="javastudy.User" id="resultListUser">
<id column="id" property="id"/>
<result column="username" property="userName"/>
<result column="userPwd" property="userPwd"/>
</resultMap>
<select id="selectUsers" resultMap="resultListUser">
select * from user where username like '%'
</select>
属性 | 描述 |
---|---|
property | 映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同 的 JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称 property 的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你 可以这样映射一些东西: “username” ,或者映射到一些复杂的东西: “address.street.number” 。 |
column | 从数据库中得到的列名,或者是列名的重命名标签。这也是通常和会 传递给 resultSet.getString(columnName)方法参数中相同的字符串。 |
property对应的是class中的属性,column对应的是SQL语句执行select之后返回的列名或者是列别名。
修改接口IUserOperation,增加方法:public List<User> selectUsers();
测试代码中,使用新方法即可:
IUserOperation userOperation = session.getMapper(IUserOperation.class);
List<User> users = userOperation.selectUsers();
for(User user: users)
System.out.println(user);
2. 增加数据
修改userMapper.xml:
<insert id="addUser" parameterType="javastudy.User" useGeneratedKeys="true"
keyProperty="id">
insert into user(userName,userPwd) values(#{userName},#{userPwd})
</insert>
注意: 数据库中table在创建的时候,id必须设置为auto_increment,这样增加数据的时候才能成功
属性 | 描述 |
---|---|
id | 命名空间中的唯一标识符,可被用来代表这条语句。 |
parameterType | 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。 |
| |
flushCache | 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。 |
timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 |
statementType | STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 |
useGeneratedKeys | (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 |
keyProperty | (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
keyColumn | (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
databaseId | 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。 |
修改接口IUserOperation,增加方法:public void addUsers(User user);
测试:
public void addUser()throws IOException {
User user = new User();
user.setUserName("test2");
user.setUserPwd("123");
SqlSession session = MyBatisUtils.openSession();
try{
System.out.println(user);
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.addUser(user);
session.commit(); //必须提交事务,否则不会写入到数据库.
System.out.println("当前增加的用户id:"+user.getId());
}finally{
session.close();
}
}
3. 更新数据
修改接口IUserOperation,增加方法:public void updateUsers(User user);
在配置文件中增加SQL语句:
<update id="updateUsers" parameterType="javastudy.User">
update user set userName=#{userName}, userPwd=#{userPwd} where id=#{id}
</update>
测试:
try{
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(6);
user.setUserPwd("456");
userOperation.updateUsers(user);
session.commit(); //注意要commit
4. 删除数据
同理,IUserOperation 增加方法:public void deleteUser(int id);
SQL语句:
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
测试:
public void deleteUser()throws IOException {
SqlSession session = MyBatisUtils.openSession();
try{
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.deleteUser(7);
session.commit();
}finally{
session.close();
}
}
所有增删改查都完成了,注意在增加,更改,删除的时候要调用session.commit()