Mybatis基础与查找
目录
SqlMapConfig.xml
在environments中配置与数据库连接的相关信息。
在mappers中映射去实现dao。
<?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">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="..."/>
<property name="username" value="..."/>
<property name="password" value="..."/>
</dataSource>
</environment>
</environments>
<!--指定 映射配置文件(每个dao独立的配置文件) 的位置-->
<mappers>
<!-- xml实现 -->
<mapper resource="com/by/dao/IDocDao.xml"/>
<!-- 注解实现 -->
<mapper class="com.by.dao.IUserDao"/>
</mappers>
</configuration>
log4j.properties
不知道,抄的
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=//logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=//logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
IDocDao(xml)
dao是一个接口。
public interface IDocDao {
List<Doc> findAll();
}
注意Doc类需要序列化。
public class Doc implements Serializable {
//属性:与数据库中表的列名同类同名
//方法:属性的getter、setter
}
需要四个信息:dao的全限定类名,方法名,返回类型,sql语句。
<?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.by.dao.IDocDao">
<!--配置findAll方法-->
<select id="findAll" resultType="com.by.domain.Doc">
select * from Doc;
</select>
</mapper>
IUserDao(注解)
相比于xml实现的dao类,只多了一个注解,和里面的sql语句。
public interface IUserDao {
@Select("select * from user;")
List<User> findAll();
}
public class User implements Serializable {
//属性:与数据库中表的列名同类同名
//方法:属性的getter、setter
}
查找
public class MybatisTest {
private InputStream is;
private SqlSession sqlSession;
private IDocDao docDao;
private IUserDao userDao;
@Before()
public void init() throws IOException {
//读取配置文件
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSession静态工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//使用工厂生成SqlSession
sqlSession = factory.openSession();
//使用SqlSession生成代理对象
docDao = sqlSession.getMapper(IDocDao.class);
userDao = sqlSession.getMapper(IUserDao.class);
}
@After()
public void destroy() throws IOException{
is.close();
sqlSession.close();
}
@Test
public void findALLDocTest(){
//使用dao
List<Doc> docs = docDao.findAll();
for(Doc doc:docs){
System.out.println(doc);
}
}
@Test
public void findALLUserTest(){
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
}
参数深入:传递pojo包装对象
假设我们有这么一个需求:用户信息的综合查询,需要传入的查询条件很复杂(可能包括用户信息,其他的信息,比如商品,订单),就需要一个对象来包装这些信息:用户商品订单,然后传参的时候传入这个包装对象,调用里面的所有信息。
返回值深入:别名与resultMap
当返回类的属性名与数据库的列名不一致,解决办法:
增删改:
在sql语句中,例:update doc set name = #{docName};
即数据库列名的地方写数据库的,引用pojo时写pojo的。
查:
1、使用sql语法‘别名’,select name as docName from doc;
即找数据库的name列,返回时是生成的userName列。
2、在xml中,写<resultMap>
元素并调用
<mapper namespace = 'com.by.dao.IDocDao'>
<resultMap id = 'docMap' type = 'com.by.domain.Doc'>
<!-- 配置主键 -->
<id property = 'docId' column = 'ID'>
<!-- 配置其他 -->
<result property = 'docName' column = 'name'>
<result property = 'docDescription' column = 'description'>
</resultMap>
<select id = 'findAll' resultMap = 'docMap'>
select * from doc;
</select>
<select id = 'findDocByName' resultMap = 'docMap' parameterType = 'String'>
select * from doc where name like #{value};
</select>
</mapper>
标签
1、属性(properties)
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="..."/>
<property name="password" value="..."/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
2、类型别名(typeAliases)
类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。即要写domain.blog.Author的地方只写Author就完事了。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
同时,<package>
也可用在<mappers>
中,然后再默认dao.xml在对应的位置存放,就不用一个个在<mappers>
配置<mapper>
了。
<mappers>
<package resource='com.by.dao'>
</mappers>
--------标签内容部分摘自http://www.mybatis.org/mybatis-3/zh/configuration.html
多表查询
自行百度
延迟加载
自行百度
缓存
SqlSession自带一级缓存,但当调用其的增删改、commit()、close()时,会清空一级缓存