mybattis的操作
主配置文件mybatis-config,放到rescource
<?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> <!-- 如果使用log4j2.x 必必须设置log4j版本 --> <settings> <setting name="logImpl" value="LOG4J2"/> </settings> <!-- 配置的别名 --> <typeAliases> <typeAlias type="org.fkjava.mybatis.domain.User" alias="User" /> <!-- 通过包扫描设置包下面Domain组件对应的别名:默认就是包下面组件对应的简单类名 Department,Employee,不区分大小写 --> <package name="org.fkjava.mybatis.domain"/> </typeAliases> <!-- 配置MyBatis的环境 :默认是使用的是 default环境 --> <environments default="default"> <!-- id : 当前环境的标识符 --> <environment id="default"> <!-- 配置事物环境默认是: JDBC --> <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="org/fkjava/mybatis/domain/UserMapper.xml" /> <!--引入注解接口配置 --> <mapper class="org.fkjava.mybatis.annomapper.AnnoMapper"/> <!--引入注解接口和配置文件 --> <package name="org.fkjava.mybatis.mapper"/> </mappers></configuration>
在rescources放db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql:///mybatis username=root password=admin
在rescources放log4j.properties
# Global logging configurationlog4j.rootLogger=ERROR, stdout # MyBatis logging configuration... #扫描dao包就可以log4j.logger.org.fkjava.mybatis.mapper=TRACE # Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?><configuration status="ERROR"> <appenders> <!-- 配置一个Console的输出目标,name是用来给ref使用的 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 日志输出的格式 --> <!-- %-5level 表示左对齐的5个字符的日志级别,比如debug、info等 --> <!-- %d{yyyy-MM-dd HH:mm:ss.SSS} 精确到毫秒的日志记录时间 --> <!-- %t 日志输出的线程 --> <!-- %logger{36} 最长36个字符的日志记录器的名称,通常就是类名,如果太长会自动把包名简写 --> <!-- %msg 日志内容的主体 --> <!-- %n 换行 --> <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" /> </Console> </appenders> <loggers> <logger name="org.fkjava" level="debug"></logger> <!-- <logger name="org.mybatis" level="debug"></logger> --> <!-- root日志记录器 --> <root level="error"> <appender-ref ref="Console" /> </root> </loggers></configuration>
通过ibatis操作
XxxMapper.xml没有什么规则,只要那么namespace=XxxMapper.xml放置的路径即可, 这个时候dao的接口不会起作用,可以不写接口 namespace="org.fkjava.domain.XxxMapper"
InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 创建SqlSession对象 SqlSession session = factory.openSession(); //查询一条记录,通过namespace+id查找sql User user = session.selectOne("org.fkjava.mybatis.domain.UserMapper.findById", 2); //查询所有记录 List<User> users = session.selectList("org.fkjava.mybatis.domain.UserMapper.findAll"); //带参数查询 List<User> users = session.selectList("org.fkjava.mybatis.domain.UserMapper.findByLike", "人"); //插入数据 session.insert("org.fkjava.mybatis.domain.UserMapper.insertUserInfo", user); //修改数据 session.update("org.fkjava.mybatis.domain.UserMapper.updateUserInfo", user); //删除数据 session.delete("org.fkjava.mybatis.domain.UserMapper.deleteById", 7); // MyBatis事物默认是手动提交的,需要开发者自己提交事物 session.commit(); session.close();
通过Mapper动态代理
需要提供一个dao接口,接口和XxxMapper.xml有规则:
XXXMapper.xml和dao接口的文件名一样;
XXXMapper.xml的命名空间namespace等于dao接口的全限定名(类路径);
XXXMapper.xml的id等于接口的方法名;
XXXMapper.xml的参数类型等于方法的参数类型;
XxxMapper.xml的返回数据类型等于方法的返回类型。
注解和配置文件的操作是一样的,不同的是一个要XxxMapper.xml,一个用注解代替 ,在主配置文件mybatis-config.xml扫描不一样,注解只扫描接口,配置文件只扫描XxxMapper.xml,包扫描就两个都包含
InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 创建SqlSession对象 SqlSession session = factory.openSession(); // 通过MyBatis动态创建UserMapper接口的代理对象 UserMapper mapper = session.getMapper(UserMapper.class); //调用接口自定义的方法 User user = mapper.findById(1); List<User> users = mapper.findAll(); List<User> users = mapper.findByIds(ids); session.comit(); session.close();
注解的配置
public interface AnnoMapper { @Select("select * from user where id = #{id}") User findById(Integer id); @Select("select * from user") List<User> findAll(); @Delete("delete from user where id = #{id}") void deleteById(Integer id); @Update("update user set name=#{name},age=#{age},password=#{password} where id =#{id}") void updateUser(User user); @Insert("insert into user (name,age,password) values(#{name},#{age},#{password})") void insertUser(User user); }
接口参数传递配置
public interface UserMapper { User findById(Integer id); List<User> findAll(); void updateUserInfo(User user); void insertUserInfo(User user); void deleteById(Integer id); User login(@Param("name")String name,@Param("password")String password); User login1(Map<String, Object> map); List<User> findByCondition(QueryObject qo); List<User> findByIds(@Param("ids")Integer[] ids); }
XxxMapper.xml一般放在dao接口一样位置
<?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"> <!-- namespace: 命名空间,确保当前映射文件的唯一标识 --> <mapper namespace="org.fkjava.mybatis.mapper.UserMapper"> <!-- 单行查询操作 id: 当前数据表操作的唯一标识 parameterType : 需要传入参数的类型 resultType :查询结果返回的数据类型 --> <select id="findById" parameterType="Integer" resultType="User"> select * from user where id = #{id} </select> <!-- 多行查询 注意 :无论是单行查询还是多行查询,resultType返回类型都是 domain对应的类型 数据的返回类型 resultType(自动映射),resultMap(手动映射)这两个属性同时 只能出现一个 --> <select id="findAll" resultMap="user_map"> select id u_id,name u_name,age u_age,password u_password from user </select> <!-- 创建resultMap 进行手动映射列和属性 --> <resultMap type="User" id="user_map"> <!-- 手动映射主键列 property :domain 对应的属性 column :查询结果集对于的列名 javaType :java中对应的数据类型 jdbcType :数据库中数据列对应的类型 --> <id property="id" column="u_id" javaType="Integer" jdbcType="INTEGER" /> <!-- 手动映射非主键列 --> <result property="name" column="u_name"/> <result property="age" column="u_age"/> <result property="password" column="u_password"/> </resultMap> <!-- 模糊查询 #{} 用于预编译SQL语句设置对应的值 select * from user where id = #{id}/? ${} 用于拼接字符串的SQL语句设置对应的值 select * from user where name like '%${value}%' ${}中的名称必须是value :${value} --> <select id="findByLike" parameterType="String" resultType="User"> select * from user where name like '%${value}%' </select> <!-- 修改用户信息:修改操作 --> <update id="updateUserInfo" parameterType="User" > <!--update user set name=#{name},age=#{age},password=#{password} where id=#{id} --> update user <set> <if test="name!=null">name=#{name},</if> <if test="age!=null">age=#{age},</if> <if test="password!=null">password=#{password}</if> </set> where id = #{id} </update> <!-- 删除用户 --> <delete id="deleteById" parameterType="Integer"> delete from user where id = #{id} </delete> <!-- 添加用户 keyProperty: 数据表中对应domain的主键的属性 useGeneratedKeys : 是否能获取生成主键 --> <insert id="insertUserInfo" parameterType="User" keyProperty="id" useGeneratedKeys="true"> insert into user (name,age,password)values(#{name},#{age},#{password}) </insert> <!-- 登录操作 --> <select id="login" parameterType="String" resultType="User"> select * from user where name = #{name} and password = #{password} </select> <!-- 登录操作 --> <select id="login1" parameterType="String" resultType="User"> select * from user where name = #{name} and password = #{password} </select> <!--======================动态SQL,高级查询=====================--> <!-- 条件查询 --> <select id="findByCondition" resultType="User" parameterType="org.fkjava.mybatis.query.QueryObject"> select * from user <where> <if test="name !=null"> name = #{name} </if> <if test="age !=null"> or age = #{age} </if> </where> </select> <!--查询指定id的所有用户信息 --> <select id="findByIds" parameterType="Integer" resultType="User"> <!-- select * from user where id in(1,2,3) --> select * from user where id in <foreach collection="ids" open="(" close=")" item="id" separator=","> #{id} </foreach> </select> <!--关联查询一对多 --> <select id="findByDeptId" parameterType="Integer" resultMap="dept_map"> select * from department where id = #{id} </select> <resultMap type="Department" id="dept_map"> <id property="id" column="id"/> <!--column为参数,select为namespace+id --> <collection property="employees" column="id" select="org.fkjava.mybatis.mapper.EmployeeMapper.findByDeptId"></collection> </resultMap> <select id="findById" parameterType="Integer" resultMap="emp_map"> select * from employee where id = #{id} </select> <!--关联查询一对一 --> <resultMap type="Employee" id="emp_map"> <id property="id" column="id"/> <association property="dept" column="dept_id" select="org.fkjava.mybatis.mapper.DepartmentMapper.findByDept_ID"/> </resultMap> <!-- 公共部分 --> <sql id="query_sql"> <where> <if test="typeCode!=null"> type_code like '${typeCode}%' </if> <if test="keyword!=null"> and title like '%${keyword}%' </if> </where> </sql> <!-- 根据条件查询出对应的商品 --> <select id="findByCondition" parameterType="ArticleQueryObject" resultMap="article_map"> select * from ec_article <!-- 公共部分引用 --> <include refid="query_sql"/> limit #{beginIndex},#{pageSize} </select> </mapper>