mysql:
//localhost:
3306/mybatis"/>
其中environments是环境,可以包含多个environment,默认使用default属性对应的。
transactionManager是事务管理配置,可以是JDBC或者MANAGED。
JDBC表示事务用jdbc来管理
MANAGED表示事务交给spring等容器管理。
dataSourcetype="POOLED"是使用连接池。
mappers指定映射文件的位置。
3、创建实体类
packagecom.test;
publicclassUser{
privateIntegerid;
privateStringname;
privateIntegerage;
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicIntegergetAge(){
returnage;
}
publicvoidsetAge(Integerage){
this.age=age;
}
}
4、创建映射文件
/MybatisDemo/src/com/test/userMapper.xml
内容:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http:
//mybatis.org/dtd/mybatis-3-mapper.dtd">
select*fromuserswhereid=#{aaa}
其中#{aaa}是占位符,由于只有一个参数,所以名字可以任意取,这里是aaa。
5、客户端调用
packagecom.test;
importjava.io.InputStream;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
publicclassTest{
publicstaticvoidmain(String[]args){
//取得conf.xml总体配置文件的输入流
InputStreamis=Test.class.getClassLoader().getResourceAsStream("conf.xml");
//构建sessionFactory
SqlSessionFactorysessionFactory=newSqlSessionFactoryBuilder().build(is);
//取得session
SqlSessionsqlSession=sessionFactory.openSession();
//statement对应userMapper.xml中的namesapce+标签id
Stringstatement="com.test.userMapper.queryUser";
//查询
Useruser=sqlSession.selectOne(statement,1);
System.out.println(user.getName());//输出Tom
}
}
其中statement也可以是"queryUser"短名称,它会自动去找命名空间,但这样不太好,如果2个命名空间都有id为queryUser的标签,这里就会报错,因此还是建议使用全名。
增删改查操作
userMapper.xml配置:
--新增,parameterType指定传入参数类型-->
insertintousers(name,age)
values(#{name},#{age})
--更新,parameterType指定传入参数类型-->
updateusers
setname=#{name},age=#{age}
whereid=#{id}
--删除,parameterType指定传入参数类型-->
deletefromusers
whereid=#{id}
--查询列表,resultType指定返回列表的元素类型-->
select*fromusers
增删改查的标签对应不同的sql语句,其实标签只是为了可读性,运行的时候只会看里面的语句,不会因为是update标签就一定执行update操作,例如update标签里面可以使insert语句,执行insert操作。
标签起一定的检查作用,例如update标签就必须配置parameterType属性,否则运行报错。
对应测试代码:
@Test
publicvoidtestInsert(){
SqlSessionsqlSession=MybatisUtils.getFactory().openSession();
Stringstatement="com.test.userMapper.addUser";
Useruser=newUser();
user.setName("hello");
user.setAge(99);
sqlSession.insert(statement,user);
sqlSmit();
}
@Test
publicvoidtestUpdate(){
SqlSessionsqlSession=MybatisUtils.getFactory().openSession();
Stringstatement="com.test.userMapper.updateUser";
Useruser=newUser();
user.setName("test2");
user.setAge(105);
user.setId
(2);
sqlSession.update(statement,user);
sqlSmit();
}
@Test
publicvoidtestDelete(){
SqlSessionsqlSession=MybatisUtils.getFactory().openSession();
Stringstatement="com.test.userMapper.deleteUser";
sqlSession.delete(statement,4);
sqlSmit();
}
@Test
publicvoidtestQueryAllUsers(){
SqlSessionsqlSession=MybatisUtils.getFactory().openSession();
Stringstatement="com.test.userMapper.queryAllUsers";
Listusers=sqlSession.selectList(statement);
System.out.println(users);
}
其中sqlSmit();是提交事务,openSession()取得的session默认不自动提交事务,如果是openSession(true)会自动提交
使用注解方式(很少用,只用于简单查询的情况)
1、创建接口
packagecom.test;
importjava.util.List;
importorg.apache.ibatis.annotations.Delete;
importorg.apache.ibatis.annotations.Insert;
importorg.apache.ibatis.annotations.Select;
importorg.apache.ibatis.annotations.Update;
publicinterfaceUserMapper{
@Insert("insertintousers(name,age)values(#{name},#{age})")
publicintinsertUser(Useruser);
@Update("updateuserssetname=#{name},age=#{age}whereid=#{id}")
publicintupdateUser(Useruser);
@Delete("deletefromuserswhereid=#{id}")
publicintdeleteUser(intid);
@Select("select*fromusers")
publicListqueryAllUsers();
@Select("select*fromuserswhereid=#{aaa}")
publicUserqueryById(intid);
}
2、conf.xml引入
3、测试代码
@Test
publicvoidtestAnnotation(){
SqlSessionsqlSession=MybatisUtils.getFactory().openSession();
UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.queryAllUsers());
}
其实就是用UserMapper接口代替了xml文件。
用log4j打印Sql语句等日志
1、引入log4j-1.2.16.jar
2、src下新建log4j.xml(也可以是log4j.properties),内容:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPElog4j:
configurationSYSTEM"log4j.dtd">
configurationxmlns:
log4j="http:
//jakarta.apache.org/log4j/">
value="%-5p%d{MM-ddHH:
mm:
ss,SSS}%m(%F:
%L)\n"/>
configuration>
此时即可打印出sql语句:
用resultMap映射实体类属性与表字段名
如果数据库表字段名与实体类属性名不一致,则需要建立映射,一种方法是select语句中为字段起别名,如:
selectuser_idasidfromusers
另一种是使用mybatis的resultMap映射,如:
--查询列表,resultType指定返回列表的元素类型-->
select*fromusers
--映射实体类属性名与表字段名-->
其中resultMap="UserResultMap"与resultMap标签的id对应。
resultMap标签内部的id标签和result标签可以互换,用id或者result只是为了方便阅读,一般id就是主键。
用association标签处理一对一、多对一封装(封装对象属性)
association在resultMap标签内,用于封装实体类属性的映射,当实体对象间有引用关系时,可以用association处理,如:
实体类
publicclassTeacher{
privateintid;
privateStringname;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
publicclassClasses{
privateintid;
privateStringname;
privateTeacherteacher;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicTeachergetTeacher(){
returnteacher;
}
publicvoidsetTeacher(Teacherteacher){
this.teacher=teacher;
}
}
这里Classes类有Teacher属性。
关联表查询方式(也叫嵌套结果)
通过关联表查询,一条sql查询出结果,如:
映射文件配置:
select*fromclassa,teacherb
wherea.teacher_id=b.t_id
--映射实体类属性名与表字段名-->
其中association用于封装对象属性,property是属性名称,javaType是封装后的类型,需要跟property属性的类型一致。
association内部的id和result就是Teacher的属性,association就相当于Classes中Teacher属性的映射。
多次查询方式(也叫嵌套查询)
先查询出Classes信息,然后再查Classes对应的Teacher信息,如:
select*fromteacherwheret_id=#{id}
select*fromclass
--映射实体类属性名与表字段名-->
这里的select="queryTeacher"会去找queryTeacher标签查询Teacher,传入column="teacher_id"列对应的值(column指定的相当于外键字段)
用collection标签处理一对多封装(封装List、Set等属性)
实体类
publicclassClasses{
privateintid;
privateStringname;
privateListstudents;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicListgetStudents(){
returnstudents;
}
publicvoidsetStudents(List