QueryVo
package cn.itcast.domain; import java.io.Serializable; import java.util.List; public class QueryVo implements Serializable { private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } @Override public String toString() { return "QueryVo{" + "ids=" + ids + '}'; } } |
User.java
package cn.itcast.domain; import java.io.Serializable; import java.util.Date; /** * */ public class User implements Serializable { /* private Integer id; private String username; private String address; private String sex; private Date birthday; public User() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", address='" + address + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + '}'; }*/ //************************************************************************************************************************************************************* private Integer userId; private String userName; private String userAddress; private String userSex; private Date userBirthday; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public Date getUserBirthday() { return userBirthday; } public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userAddress='" + userAddress + '\'' + ", userSex='" + userSex + '\'' + ", userBirthday=" + userBirthday + '}'; } public static void main(String[] args) { System.out.println("000"); } } |
IUserDao.java
package cn.itcast.dao; import cn.itcast.domain.QueryVo; import cn.itcast.domain.User; import java.util.List; /** * 用户接口 */ public interface IUserDao { //根据用户信息,查询用户列表 public List<User> findUser(User user); //传入多个 id 查询用户信息 public List<User> findUsersByIds(List<Integer> list); //传入多个 id 查询用户信息(多个id放入list中,在将list作为Queryvo的属性) public List<User> findUsersByIds1(QueryVo queryVo); //修改用户 public void updateUser(User user); //新增用户 public void addUser(User user); } |
IUserDao.xml
<?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="cn.itcast.dao.IUserDao"> <!--配置user类的属性和user表中的列的对应关系(主要是解决表查询出来的字段名和pojo的属性名不一致) (type="user"是在SqlMapConfig中配置别名了,所以可以直接写user)--> <resultMap id="userMap" type="user"> <!--注意column属性对应的是sql语句查询出来的字段名(或者起的别名),不是表中的字段--> <!-- 主键字段的对应 --> <id property="userId" column="id"></id> <!--非主键字段的对应--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> </resultMap> <!--抽取sql片段--> <sql id="user_sql"> select * from user </sql> <!--根据用户信息,查询用户列表 parameterType:参数类型 resultMap:对应<resultMap>标签的id --> <select id="findUser" parameterType="user" resultMap="userMap"> <!--引用sql片段--> <include refid="user_sql"></include> <where> <if test="userName != null and userName != '' "> username = #{userName} </if> <if test="userSex != null and userSex != '' "> and sex = #{userSex} </if> </where> </select> <!--传入多个 id 查询用户信息(多个id放入list中),如果采用这种做法,参数只能写 “list” 不推荐--> <!--foreach collection:需要遍历的集合 item:每次遍历的对象 open:循环开始输出的内容,只会输出一次 close:循环结束输出的内容,只会输出一次 separator:每次循环后,添加的内容,循环几次添加几次 --> <select id="findUsersByIds" parameterType="java.util.List" resultMap="userMap"> <!--引用sql片段--> <include refid="user_sql"></include> <!--select * from user where id in(42,43,45)--> <where> <if test="list != null and list.size() > 0"> <foreach collection="list" item="id" open="id in (" close=")" separator=","> #{id} </foreach> </if> </where> </select> <!--传入多个 id 查询用户信息(多个id放入list中,在将list作为Queryvo的属性)--> <!--使用这种sql语句进行查询select * from user where id in(42,43,45)--> <!--<select id="findUsersByIds1" parameterType="cn.itcast.domain.QueryVo" resultMap="userMap"> <include refid="user_sql"></include> <where> <if test="ids != null and ids.size()>0"> <foreach collection="ids" item="id" open="id in (" close=")" separator=","> #{id} </foreach> </if> </where> </select>--> <!--传入多个 id 查询用户信息(多个id放入list中,在将list作为Queryvo的属性)--> <!--使用这种sql语句进行查询select * from user where id = 42 or id = 43 or id = 45--> <select id="findUsersByIds1" parameterType="cn.itcast.domain.QueryVo" resultMap="userMap"> <include refid="user_sql"></include> <where> <if test="ids != null and ids.size()>0"> <foreach collection="ids" item="id" separator="or"> id = #{id} </foreach> </if> </where> </select> <!--修改用户 update user set sex = ?,username = ? where id = ?--> <update id="updateUser" parameterType="user"> update user <set> <if test="userSex != null and userSex != '' "> sex = #{userSex}, </if> <if test="userName != null and userName != '' "> username = #{userName} </if> </set> <where> <if test="userId != null and userId != '' "> id = #{userId} </if> </where> </update> <!--新增用户 insert into user (username,birthday,sex,address) VALUES(?,?,?,?)--> <insert id="addUser" parameterType="user"> <!--新增成功之后,返回id--> <!--selectKey作用: 获取新增对象的id order:在新增之后执行用(BEFORE),新增之前用(AFTER) mysql:自增,last_insert_id() AFTER ====>在新增成功之后,返回新增那条的id UUID uuid(); 一般在新增之前进行uuid的插入 resultType:返回主键ID的类型 keyProperty:模型类中主键的属性名 order:新增之前,还是新增之后 --> <selectKey resultType="java.lang.Integer" keyProperty="userId" order="AFTER"> select last_insert_id() <!--select uuid()--> </selectKey> insert into user (<include refid="insert_key"></include>) VALUES(<include refid="insert_value"></include>) </insert> <!-- <trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim> prefix:在trim标签内sql语句加上前缀。 suffix:在trim标签内sql语句加上后缀。 suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。 prefixOverrides:指定去除多余的前缀内容 userName,userBirthday,userAddress为pojo属性名 username,birthday,address,为数据库字段名 --> <sql id="insert_key"> <trim suffixOverrides=","> <if test="userName != null and userName != '' "> username, </if> <if test="userBirthday != null"> birthday, </if> <if test="userSex != null and userSex != '' "> sex, </if> <if test="userAddress != null and userAddress != '' "> address, </if> </trim> </sql> <sql id="insert_value"> <trim suffixOverrides=","> <if test="userName != null and userName != '' "> #{userName}, </if> <if test="userBirthday != null"> #{userBirthday}, </if> <if test="userSex != null and userSex != '' "> #{userSex}, </if> <if test="userAddress != null and userAddress != '' "> #{userAddress}, </if> </trim> </sql> </mapper> |
MybatisTest.java
package test; import cn.itcast.dao.IUserDao; import cn.itcast.domain.QueryVo; import cn.itcast.domain.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MybatisTest { private InputStream in; private IUserDao userDao; private SqlSession sqlSession; //在测试方法之前执行 @Before public void init() { /** * ORM+SqlMapConfig+sqlSession */ //加载配置文件 in = MybatisTest.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"); //创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //创建sqlSession工厂 SqlSessionFactory sqlSessionFactory = builder.build(in); //创建sqlSession sqlSession = sqlSessionFactory.openSession(); //获取代理对象 userDao = sqlSession.getMapper(IUserDao.class); } //测试方法之后执行 @After public void destory() throws IOException { //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); in.close(); } //根据用户信息,查询用户列表 @Test public void testFindUser() { User user = new User(); user.setUserName("李四"); user.setUserSex("女"); List<User> list = userDao.findUser(user); for (User user1 : list) { System.out.println(user1); } } //传入多个 id 查询用户信息(多个id放入list中) @Test public void testFindUsersByIds() { List<Integer> ids = new ArrayList<Integer>(); ids.add(42); ids.add(45); List<User> list1 = userDao.findUsersByIds(ids); for (User user1 : list1) { System.out.println(user1); } } //传入多个 id 查询用户信息(多个id放入list中,在将list作为Queryvo的属性) @Test public void testFindUsersByIds1() { List<Integer> list = new ArrayList<Integer>(); list.add(42); list.add(43); list.add(45); QueryVo queryVo = new QueryVo(); queryVo.setIds(list); List<User> userList = userDao.findUsersByIds1(queryVo); for (User user : userList) { System.out.println(user); } } //修改id为42的用户的性别为男,地址为中国 @Test public void testUpdateUser(){ User user = new User(); user.setUserSex("男"); user.setUserName("韩晓峰"); user.setUserId(43); userDao.updateUser(user); } //新增用户 @Test public void testAddUser() throws ParseException { User user = new User(); user.setUserName("张莹莹"); user.setUserAddress("陕西咸阳"); user.setUserSex("女"); Date date = new Date(); user.setUserBirthday(date); userDao.addUser(user); } } |
db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=123456 |
log4j.properties
此文件可以输出到文件
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal #输出到log文件中(d:\axis.log文件中) #log4j.rootCategory=debug, CONSOLE, LOGFILE #只输出到控制台 log4j.rootCategory=debug, CONSOLE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # 日志输出到控制台 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # 日志输出到指定文件,根路径/ log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=/axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n |
SqlMapConfig.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 1.可以在标签内部配置连接数据库的信息。 2.也可以通过属性引用外部配置文件信息,url属性或者resource属性 resource属性: 常用的 用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下--> <!--<properties url="file:///D:/ideaProject/mybatis02/src/main/resources/db.properties" >--><!--file://这是一种文件协议(windows的)--> <properties resource="db.properties"> <!--标签内部配置数据库连接信息(不推荐)--> <!-- <property name="driver" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property> <property name="username" value="root"></property> <property name="password" value="1234"></property> --> </properties> <!--配置别名--> <!--使用typeAliases配置别名,它只能配置domain中类的别名 --> <typeAliases> <!--1.typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就不再区分大小写--> <!--<typeAlias type="cn.itcast.domain.User" alias="user"></typeAlias>--> <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写 --> <package name="cn.itcast.domain"></package> </typeAliases> <!-- 配置 mybatis 的环境 --> <environments default="mysql"> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"/> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置 --> <mappers> <!--此种方法要求 r mapper 接口名称和 r mapper--> <!--<mapper class="cn.itcast.dao.IUserDao"></mapper>--> <!--<mapper resource="cn/itcast/dao/IUserDao.xml"></mapper>--> <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了,大大减少开发时间 --> <!--此种方法要求marpper接口名称和mapper映射文件名称相同,且放在同一个目录中--> <package name="cn.itcast.dao"></package> </mappers> </configuration> |