Maven资源导出的配置
!-- build中配置resources,防止资源导出失败-->
< build>
< resources>
< resource>
< directory> src/main/resources</ directory>
< includes>
< include> **/*.properties</ include>
< include> **/*.xml</ include>
</ includes>
< filtering> true</ filtering>
</ resource>
< resource>
< directory> src/main/java</ directory>
< includes>
< include> **/*.properties</ include>
< include> **/*.xml</ include>
</ includes>
< filtering> true</ filtering>
</ resource>
</ resources>
</ build>
< properties>
< project.build.sourceEncoding> UTF-8</ project.build.sourceEncoding>
</ properties>
Mybatis-config.xml的配置
<?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" >
< configuration>
< properties resource = " db.properties" > </ properties>
< typeAliases>
< package name = " com.demo4.pojo" > </ package>
</ typeAliases>
< environments default = " test" >
< environment id = " development" >
< transactionManager type = " JDBC" />
< dataSource type = " POOLED" >
< property name = " driver" value = " ${driver}" />
< property name = " url" value = " ${url}" />
< property name = " username" value = " ${username}" />
< property name = " password" value = " ${password}" />
</ dataSource>
</ environment>
< environment id = " test" >
< transactionManager type = " JDBC" />
< dataSource type = " POOLED" >
< property name = " driver" value = " ${driver}" />
< property name = " url" value = " ${url}" />
< property name = " username" value = " ${username}" />
< property name = " password" value = " ${password}" />
</ dataSource>
</ environment>
</ environments>
< mappers>
< mapper resource = " com/demo4/dao/UserMapper.xml" > </ mapper>
</ mappers>
</ configuration>
MybatisUtils工具类
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml" ;
InputStream inputStream = Resources . getResourceAsStream ( resource) ;
sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
public static SqlSession getSqlSession ( ) {
return sqlSessionFactory. openSession ( ) ;
}
}
映射的配置
<?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.mybatis.dao.UserMapper" >
< select id = " getUserList" resultType = " com.mybatis.pojo.User" >
select * from user
</ select>
< select id = " getUser" parameterType = " int" resultType = " com.mybatis.pojo.User" >
select * from user where id = #{id}
</ select>
< insert id = " insertUser" parameterType = " com.mybatis.pojo.User" >
insert into user(id,name,pwd) values(#{id},#{name},#{pwd})
</ insert>
< update id = " updateUser" parameterType = " com.mybatis.pojo.User" >
update user set name=#{name},pwd=#{pwd} where id = #{id}
</ update>
< delete id = " deleteUserById" parameterType = " int" >
delete from user where id = #{id}
</ delete>
</ mapper>
//注意点 增删改需要提交事务
数据库中的字段与实体类属性不一致的解决办法
1 、在sql语句中对字段与属性不一样的字段起别名
public class User {
private int id;
private String name;
private String password;
}
< select id= "getUser" resultType= "user" parameterType= "_int" >
select id, name, pwd as password from user where id = #{ id}
< / select>
2 、resultMap
< resultMap id= "userMap" type= "user" >
< ! -- column代表数据库中的字段 property代表实体类中的属性-- >
< result column= "id" property= "id" > < / result>
< result column= "name" property= "name" > < / result>
< result column= "pwd" property= "password" > < / result>
< / resultMap>
< select id= "getUser" parameterType= "_int" resultMap= "userMap" >
select * from user where id = #{ id}
< / select>
Log4j的使用
1 、引入依赖
< dependency>
< groupId> log4j< / groupId>
< artifactId> log4j< / artifactId>
< version> 1.2 .17 < / version>
< / dependency>
2 、创建配置文件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 = [ % c] - % m% n
#文件输出的相关设置
log4j. appender. file = org. apache. log4j. RollingFileAppender
log4j. appender. file. File = . /log/ zhang. log
log4j. appender. file. MaxFileSize = 10 mb
log4j. appender. file. Threshold = DEBUG
log4j. appender. file. layout = org. apache. log4j. PatternLayout
log4j. appender. file. layout. ConversionPattern = [ % p] [ % d{ yy- MM- dd} ] { % c} % m% n
#日志输出级别
log4j. logger. org. mybatis = DEBUG
log4j. logger. java. sql = DEBUG
log4j. logger. java. sql. Statement = DEBUG
log4j. logger. java. sql. ResultSet = DEBUG
log4j. logger. java. sql. PreparedStatement = DEBUG
3 、在mybatis- config. xml文件中进行设置
< ! -- 设置-- >
< settings>
< ! -- 配置标准的日志工厂-- >
< ! -- < setting name= "logImpl" value= "STDOUT_LOGGING" > < / setting> -- >
< ! -- 配置log4j日志工厂-- >
< setting name= "logImpl" value= "LOG4J" > < / setting>
< / settings>
4 、在需要使用log4j的类中到包 import org. apache. log4j. Logger ;
参数为 当前类. class
private static Logger logger = Logger . getLogger ( 参数) ;
5 、日志级别
logger. info ( "info: Log4jTest" ) ;
logger. debug ( "info: Log4jTest" ) ;
logger. error ( "info: Log4jTest" ) ;
使用注解(适合简单的sql语句)
1 、
public interface UserMapper {
@Select ( "select * from user" )
List < User > getUserList ( ) ;
@Select ( "select * from user where id = #{id}" )
User getUser ( @Param ( "id" ) int id) ;
@Insert ( "insert into user(id,name,pwd) values(#{id},#{name},#{password})" )
int insertUser ( User user) ;
@Update ( "update user set name=#{name},pwd=#{password} where id = #{id}" )
int updateUser ( User user) ;
@Delete ( "delete from user where id = #{id}" )
int deleteUser ( int id) ;
}
2 、在mybatis- config. xml中绑定接口
< mappers>
< mapper class = "com.demo5.dao.UserMapper" > < / mapper>
< / mappers>
mybatis的执行流程
设置自动提交事务
public static SqlSession getSqlSession ( ) {
return sqlSessionFactory. openSession ( true ) ;
}
多表查询(多对一)
例如
多个学生对应一个老师
public class Student {
private int id;
private String name;
private int tid;
private Teacher teacher;
}
public class Teacher {
private int id;
private Striing name
}
sql语句
< select id= "getStudentList2" resultMap= "StudentTeacher2" >
select s. id sid, s. name sname, t. name tname
from Student s, teacher t
where s. tid = t. id
< / select>
< resultMap id= "StudentTeacher2" type= "Student" >
< result property= "id" column= "sid" > < / result>
< result property= "name" column= "sname" > < / result>
< association property= "teacher" javaType= "Teacher" >
< result property= "name" column= "tname" > < / result>
< / association>
< / resultMap>
或
< select id= "getStudentList" resultMap= "StudentTeacher" >
select * from student
< / select>
< resultMap id= "StudentTeacher" type= "Student" >
< result property= "id" column= "id" > < / result>
< result property= "name" column= "name" > < / result>
< association property= "teacher" column= "tid" javaType= "Teacher" select= "getTeacher" > < / association>
< / resultMap>
< select id= "getTeacher" resultType= "Teacher" >
select * from teacher where id = #{ id}
< / select>
多表查询(一对多)
public class Student {
private int id;
private String name;
private int tid;
}
public class Teacher {
private int id;
private String name;
private List < Student > students;
}
sql查询
< select id= "getTeacher" resultMap= "TeacherStudent" >
select s. id sid, s. name sname, t. id tid, t. name tname
from student s, teacher t
where s. tid = t. id and t. id = #{ id}
< / select>
< resultMap id= "TeacherStudent" type= "Teacher" >
< result property= "id" column= "tid" > < / result>
< result property= "name" column= "tname" > < / result>
< collection property= "list" ofType= "Student" >
< result property= "id" column= "sid" > < / result>
< result property= "name" column= "sname" > < / result>
< result property= "tid" column= "tid" > < / result>
< / collection>
< / resultMap>
或
< select id= "getTeacher" resultMap= "TeacherStudent2" >
select * from teacher where id = #{ id}
< / select>
< resultMap id= "TeacherStudent2" type= "Teacher" >
< collection property= "list" javaType= "ArrayList" ofType= "Student" select= "getStudent" column= "id" > < / collection>
< / resultMap>
< select id= "getStudent" resultType= "Student" >
select * from student where tid = #{ tid}
< / select>
动态Sql(利用相应的标签来拼接不同条件下的sql语句)
public interface BlogMapper {
int insertBlog ( Blog blog) ;
List < Blog > getBlogList ( Map < String , Object > map) ;
int updateBlog ( Map < String , Object > map) ;
List < Blog > getBlogForEach ( Map < String , Object > map) ;
}
< ! DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace= "com.demo8.dao.BlogMapper" >
< insert id= "insertBlog" parameterType= "Blog" >
insert into blog ( id, title, author, create_time, views) values ( #{ id} , #{ title} , #{ author} , #{ createTime} , #{ views} )
< / insert>
< select id= "getBlogList" parameterType= "map" resultType= "Blog" >
select * from blog
< where>
< ! -- < if test= "title != null" > -- >
< ! -- title = #{ title} -- >
< ! -- < / if > -- >
< ! -- < if test= "author != null" > -- >
< ! -- and author = #{ author} -- >
< ! -- < / if > -- >
< choose>
< when test= "title != null" >
title = #{ title}
< / when>
< when test= "author != null" >
and author = #{ author}
< / when>
< otherwise>
and views = #{ views}
< / otherwise>
< / choose>
< / where>
< / select>
< ! -- sql标签抽取公共的sql语句 提高复用性-- >
< sql id= "if-title-author" >
< if test= "title != null" >
title = #{ title} ,
< / if >
< if test= "author != null" >
author = #{ author}
< / if >
< / sql>
< update id= "updateBlog" parameterType= "map" >
update blog
< set>
< ! -- 引用抽取的公共sql语句-- >
< include refid= "if-title-author" > < / include>
< / set>
where id = #{ id}
< / update>
< select id= "getBlogForEach" parameterType= "map" resultType= "Blog" >
select * from blog
where id in
< foreach collection= "ids" item= "id" open = " (" close= ")" separator= "," >
#{ id}
< / foreach>
< / select>
< / mapper>
测试foreach的的代码
@Test
public void test3 ( ) {
SqlSession sqlSession = MybatisUtils . getSqlSession ( ) ;
BlogMapper mapper = sqlSession. getMapper ( BlogMapper . class ) ;
Map < String , Object > map = new HashMap < String , Object > ( ) ;
List < Integer > ids = new ArrayList < Integer > ( ) ;
ids. add ( 1 ) ;
ids. add ( 2 ) ;
ids. add ( 3 ) ;
ids. add ( 4 ) ;
map. put ( "ids" , ids) ;
List < Blog > blogForEach = mapper. getBlogForEach ( map) ;
for ( Blog blog : blogForEach) {
System . out. println ( blog) ;
}
sqlSession. close ( ) ;
}
开启全局缓存
1 、在mybatis- config. xml配置文件中设置开启全局缓存
< settings>
< setting name= "logImpl" value= "LOG4j" > < / setting>
< ! -- 开启驼峰命名自动转换-- >
< setting name= "mapUnderscoreToCamelCase" value= "true" > < / setting>
< ! -- 开启全局缓存-- >
< setting name= "cacheEnabled" value= "true" > < / setting>
< / settings>
2 、
< cache eviction= "FIFO"
flushInterval= "60000"
size= "512"
readOnly= "true" / >
3 、< select useCache= "true" > < / seclect>
注意:
> 只要开启二级缓存,在用一个映射文件下有效
> 所有的数据会先放在一级缓存中
> 只有当会话提交,或关闭时才会提交到耳机缓存中