简介配置文件mybatis工具类测试
对应的xml文件 万能Mapdb.properties类型别名typeAliasesResultMap 结果集映射日志使用注解开发多对一和一对多
简介 Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
注意这里是configuration和config.dtd,mapper.xml的要修改
mybatis工具类package cn.bloghut.dao.utils;
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 java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory factory;
static {
try {
//使用mybatis第一步
String resource = "mybatis-config";
InputStream in = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession(true); //自动提交事务!
}
}
测试
@Test
public void t1() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
对应的xml文件
insert into users(name,pwd) values(#{name},#{pwd}) update users set name=#{name},pwd=#{pwd} where id = #{id} delete from users where id = #{id}
注意:增删改需要提交事务
万能Map假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
@Test
public void t5() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap<>();
map.put("username", "闲言");
map.put("password", "111");
userMapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
void addUser2(Map map);
insert into users(name,pwd) values(#{username},#{password})
Map 传递参数,直接在sql中取出key 【parameterType=“Map”】对象传递参数,直接在sql中取对象的属性即可 【parameterType=“Object”】只有一个基本类型参数的情况下,可以直接在sql中取到多个参数用Map或注解 db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/memmana?serverTimezone=UTC&characterEncoding=utf-8 jdbc.username=root jdbc.password=root类型别名typeAliases
也可以指定一个包名,Mybatis会在包名下面搜索java Bean ,比如:扫描实体类的包,它的默认别名就是为这个类的类型,首字母小写!
在实体类比较少的时候,使用第一种方式如果实体类十分多,建议使用第二种第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解
@Alias("user")
public class User implements Serializable {}
ResultMap 结果集映射
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上。
日志
代码整体向前缩进: 选中多行代码 - 按下shift + tab键 log4j log4j 1.2.17
log4j.properties
log4j.rootLogger = debug,console ,file
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = logs/log.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
使用Log4j
import org.apache.log4j.Logger;
static Logger logger = Logger.getLogger(UserTest.class);
日志级别
info
debug
error
@Test
public void testLog4j(){
logger.info("info:进入了testLog4j方法");
logger.debug("debug:进入了testLog4j方法");
logger.error("error:进入了testLog4j方法");
}
使用注解开发
@Select("select * from users")
List getUsers();
本质:反射机制实现
底层:动态代理!
public interface UserMapper {
@Select("select * from users")
List getUsers();
@Select("select * from users where id = #{id}")
User getUserById(@Param("id") int id);
@Insert("insert into users(name,pwd) values(#{name},#{password})")
int insert(User user);
@Update("update users set name=#{name},pwd=#{password} where id = #{id}")
int update(User user);
@Delete("delete from users where id = #{id}")
int delete(@Param("id")int id);
}
关于@Param注解
- 基本类型的参数或者String类型,需要加上引用类型不需要加如果只有一个基本类型的话,可以忽略,但是建议都加上我们在SQL中引用的就是我们这里的@Param(“uid”)中设定的属性名
#{} 和 ${} 区别
https://blog.csdn.net/weixin_41231928/article/details/105120292多对一和一对多
多个学生,对应一个老师
对于学生这边而言,关联…多个学生,关联一个老师【多对一】
对于老师而言,集合,一个老师,有很多学生【一对多】
按照结果嵌套查询**(连表查询)**
public class Teacher {
private int id;
private String name;
private List students;
}
public class Student {
private int id;
private String name;
private int tid;
}
小结
关联-association
集合-collection
JavaType & ofType
JavaType 用来指定实体类中的类型的
ofType 用来指定映射到List 集合中的pojo类型 ,泛型中的约束类型



