这一篇mybatis的进阶指南是接着上一篇mybatis的入门指南来的,先新建一个项目mybatis02,包名等都相应的改了,其他跟mybatis的入门指南一样
SqlSession通过的通用方法并强制转换的方式,容易出错,IDE不能不能提示转换类型,存在着转换安全的问题,可以采用接口+xml,和单独的接口两种方式来加以避免。
在com.example.mybatis02.mapping包下新建一个接口文件:
package com.example.mybatis02.mapping;
import java.util.List;
import com.example.mybatis02.domain.User;
public interface UserMapper {
public void insert(User user);
public User selectUser(String userName);
public List selectAll();
}
测试,其他的不用动,我们测试:
package com.example.mybatis02;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession(true);
UserMapper useMapper = session.getMapper(UserMapper.class);
System.out.println(useMapper.selectUser("alex"));
}
}
注意,UserMapper.xml文件的mapper节点的namespace要对于接口文件的包名+类名。
新建一个接口:
package com.example.mybatis02.mapping;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import com.example.mybatis02.domain.User;
public interface UserMapper2 {
@Insert({"insert into users(username,password,enabled) values(#{username}, #{password},#{enabled})"})
public void insert(User user);
@Select({ "SELECT * FROM users WHERE username = #{username}" })
public User selectUser(String userName);
@Select({ "SELECT * FROM users" })
public List selectAll();
}
在方法上面加上select注释,需要在conf.xml加上:
class="com.example.mybatis02.mapping.UserMapper2" />
或者:
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
sessionFactory.getConfiguration().addMapper(UserMapper2.class);
测试:
package com.example.mybatis02;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
sessionFactory.getConfiguration().addMapper(UserMapper2.class);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession(true);
UserMapper2 mapper2 = session.getMapper(UserMapper2.class);
System.out.println(mapper2.selectUser("alex"));
System.out.println(mapper2.selectAll());
}
}
上面两种方法都行,要注意的是,在接口+xml的方法中,如果把接口加入mybatis的配置中,则接口和配置文件必须得在同一个包里,xml的namespace必须对应接口文件的包名+类名,否则报错,如果把xml文件加入mybatis配置中,则接口和配置文件不一定要在同一个包里,但是xml的namespace必须对应接口文件的包名+类名。不能都加,否则也会报错。
<resultMap type="user" id="userList">
<result column="username" property="username" />
<result column="password" property="password" />
<result column="enabled" property="enabled" />
resultMap>
<select id="selectAll" resultMap="userList">
SELECT * FROM users
select>
属性名映射到列名,功能很强大,我们也可以直接:
<select id="selectAll" resultType="user">
SELECT * FROM users
select>
这样要属性名跟列名一样才行。
参数类型parameterType既可以是Java的基本类型,也可以自定义类型,例如:user,
"insert" parameterType="user">
insert into users(username,
password,enabled) values(#{username}, #{password},#{enabled})
<select id="selectUser" parameterType="String" resultType="user">
SELECT * FROM users WHERE username = #{username}
select>
通过
SqlSession session = sqlSessionFactory.openSession(false); // 打开会话,事务开始
获取session或者不传参数,开启了一个事务,之后的insert,update,delete操作都是事务中,最后要通过
session.commit();
来提交事务,否则不起作用。
今后有时间,写一些mybatis整合spring,springboot的博客,记录下自己的所学所思,也给其他的读者一些入门的参考。