@Beeder
2018-02-23T13:17:38.000000Z
字数 15707
阅读 650
javaWeb Mybatis
asm-3.3.1.jarcglib-2.2.2.jarcommons-logging-1.1.1.jarjavassist-3.17.1-GA.jarlog4j-1.2.17.jarlog4j-api-2.0-rc1.jarlog4j-core-2.0-rc1.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jar
log4j.properties
# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
db.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8jdbc.username=rootjdbc.password=admin
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="db.properties"></properties><environments default="development"><environment id="development"><!-- 使用jdbc事务管理--><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><mappers><mapper resource="User.xml"/></mappers></configuration>
pojo类
package cn.itheima.pojo;public class User {private int id;private String username;// 用户姓名//省略……public int getId() {return id;}public void setId(int id) {this.id = id;}//省略……
User.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace:命名空间,做sql隔离 --><mapper namespace="test"><!--id:sql语句唯一标识parameterType:指定传入参数类型resultType:返回结果集类型#{}占位符:起到占位作用,如果传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称可以随意写.--><select id="findUserById" parameterType="java.lang.Integer" resultType="cn.itheima.pojo.User">select * from user where id=#{id}</select></mapper>
java测试类
public class UserTest {@Testpublic void testFindUserById() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂创建会话SqlSession openSession = factory.openSession();//第一个参数:所调用的sql语句= namespace+.+sql的IDUser user = openSession.selectOne("test.findUserById", 1);System.out.println(user);openSession.close();}}
User.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace:命名空间,做sql隔离 --><mapper namespace="test"><!--返回结果为集合,可以调用selectList方法,这个方法返回的结果就是一个集合,以映射文件中应该配置成集合泛型的类型${}拼接符:字符串原样拼接,如果传入的参数是基本类型(string,long,double,int,boolean,float等),那么${}中的变量名称必须是value注意:拼接符有sql注入的风险,所以慎重使用--><select id="findUserByUserName" parameterType="java.lang.String" resultType="cn.itheima.pojo.User">select * from user where username like '%${value}%'</select></mapper>
java测试类
import cn.itheima.pojo.User;public class UserTest {@Testpublic void testFindUserbyUserName() throws Exception{String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession openSession = factory.openSession();List<User> list = openSession.selectList("test.findUserByUserName", "王");System.out.println(list);}}
User.xml
<!--#{}:如果传入的是pojo类型,那么#{}中的变量名称必须是pojo中对应的属性.属性.属性.....如果要返回数据库自增主键:可以使用select LAST_INSERT_ID()--><insert id="insertUser" parameterType="cn.itheima.pojo.User" ><!-- 执行 select LAST_INSERT_ID()数据库函数,返回自增的主键keyProperty:将返回的主键放入传入参数的Id中保存.order:当前函数相对于insert语句的执行顺序,在insert前执行是before,在insert后执行是AFTERresultType:id的类型,也就是keyproperties中属性的类型--><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select LAST_INSERT_ID()</selectKey>insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})</insert>
java测试类
@Testpublic void testInsertUser() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂创建会话SqlSession openSession = factory.openSession();User user = new User();user.setUsername("赵四");user.setBirthday(new Date());user.setSex("1");user.setAddress("北京昌平");System.out.println("====" + user.getId());openSession.insert("test.insertUser", user);//提交事务(mybatis会自动开启事务,但是它不知道何时提交,所以需要手动提交事务)openSession.commit();System.out.println("====" + user.getId());}
User.xml
<delete id="delUserById" parameterType="int">delete from user where id=#{id}</delete>
java测试类
@Testpublic void testDelUserById()throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂创建会话SqlSession openSession = factory.openSession();openSession.delete("test.delUserById", 29);//提交openSession.commit();}
User.xml
<update id="updateUserById" parameterType="cn.itheima.pojo.User">update user set username=#{username} where id=#{id}</update>
java测试类
@Testpublic void testUpdateUserById() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂创建会话SqlSession openSession = factory.openSession();User user = new User();user.setId(28);user.setUsername("王麻子");openSession.update("test.updateUserById", user);//提交openSession.commit();}
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="db.properties"></properties><!-- 和spring整合后 environments配置将废除--><environments default="development"><environment id="development"><!-- 使用jdbc事务管理--><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><mappers><!--使用class属性引入接口的全路径名称:使用规则:1. 接口的名称和映射文件名称除扩展名外要完全相同2. 接口和映射文件要放在同一个目录下--><mapper class="cn.itheima.mapper.UserMapper"/><!-- 使用包扫描的方式批量引入Mapper接口使用规则:1. 接口的名称和映射文件名称除扩展名外要完全相同2. 接口和映射文件要放在同一个目录下--><!-- <package name="cn.itheima.mapper"/> --></mappers></configuration>
Mapper接口类UserMapper.java
public interface UserMapper {public User findUserById(Integer id);//动态代理形势中,如果返回结果集问List,那么mybatis会在生成实现类的使用会自动调用selectList方法public List<User> findUserByUserName(String userName);public void insertUser(User user);}
Mapper接口映射文件UserMapper.xml
路径:与Mapper接口类同目录
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--mapper接口代理实现编写规则:1. 映射文件中namespace要等于接口的全路径名称2. 映射文件中sql语句id要等于接口的方法名称3. 映射文件中传入参数类型要等于接口方法的传入参数类型4. 映射文件中返回结果集类型要等于接口方法的返回值类型--><mapper namespace="cn.itheima.mapper.UserMapper"><!--id:sql语句唯一标识parameterType:指定传入参数类型resultType:返回结果集类型#{}占位符:起到占位作用,如果传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称可以随意写.--><select id="findUserById" parameterType="int" resultType="cn.itheima.pojo.User">select * from user where id=#{id}</select><!--如果返回结果为集合,可以调用selectList方法,这个方法返回的结果就是一个集合,所以映射文件中应该配置成集合泛型的类型${}拼接符:字符串原样拼接,如果传入的参数是基本类型(string,long,double,int,boolean,float等),那么${}中的变量名称必须是value注意:拼接符有sql注入的风险,所以慎重使用--><select id="findUserByUserName" parameterType="string" resultType="user">select * from user where username like '%${value}%'</select><!--#{}:如果传入的是pojo类型,那么#{}中的变量名称必须是pojo中对应的属性.属性.属性.....如果要返回数据库自增主键:可以使用select LAST_INSERT_ID()--><insert id="insertUser" parameterType="cn.itheima.pojo.User" ><!-- 执行 select LAST_INSERT_ID()数据库函数,返回自增的主键keyProperty:将返回的主键放入传入参数的Id中保存.order:当前函数相对于insert语句的执行顺序,在insert前执行是before,在insert后执行是AFTERresultType:id的类型,也就是keyproperties中属性的类型--><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select LAST_INSERT_ID()</selectKey>insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})</insert></mapper>
java测试类
public class UserMapperTest {private SqlSessionFactory factory;//作用:在测试方法前执行这个方法@Beforepublic void setUp() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂factory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);User user = mapper.findUserById(1);System.out.println(user);}@Testpublic void testFindUserByUserName() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);List<User> list = mapper.findUserByUserName("王");}@Testpublic void testInsertUser() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);User user = new User();user.setUsername("老王");user.setSex("1");user.setBirthday(new Date());user.setAddress("北京昌平");mapper.insertUser(user);openSession.commit();}}
SqlMapConfig.xml
目录:项目\config\
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="db.properties"></properties><typeAliases><!-- 定义单个pojo类别名type:类的全路劲名称alias:别名--><!-- <typeAlias type="cn.itheima.pojo.User" alias="user"/> --><!-- 使用包扫描的方式批量定义别名定以后别名等于类名,不区分大小写,但是建议按照java命名规则来,首字母小写,以后每个单词的首字母大写--><package name="cn.itheima.pojo"/></typeAliases><!-- 和spring整合后 environments配置将废除--><environments default="development"><environment id="development"><!-- 使用jdbc事务管理--><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><mappers><mapper resource="User.xml"/><!--使用class属性引入接口的全路径名称:使用规则:1. 接口的名称和映射文件名称除扩展名外要完全相同2. 接口和映射文件要放在同一个目录下--><!-- <mapper class="cn.itheima.mapper.UserMapper"/> --><!-- 使用包扫描的方式批量引入Mapper接口使用规则:1. 接口的名称和映射文件名称除扩展名外要完全相同2. 接口和映射文件要放在同一个目录下--><package name="cn.itheima.mapper"/></mappers></configuration>
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.itheima.mapper.UserMapper"><!-- 封装sql条件,封装后可以重用.id:是这个sql条件的唯一标识 --><sql id="user_Where"><!-- where标签作用:会自动向sql语句中添加where关键字会去掉第一个条件的and关键字--><where><if test="username != null and username != ''">and username like '%${username}%'</if><if test="sex != null and sex != ''">and sex=#{sex}</if></where></sql><select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">select * from user<!-- 调用sql条件 --><include refid="user_Where"></include></select></mapper>
UserMapper.java
public interface UserMapper {public List<User> findUserByUserNameAndSex(User user);}
java测试类
public class UserMapperTest {private SqlSessionFactory factory;//作用:在测试方法前执行这个方法@Beforepublic void setUp() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂factory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserbyUserNameAndSex() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);User user = new User();user.setUsername("王");user.setSex("1");List<User> list = mapper.findUserByUserNameAndSex(user);System.out.println(list);}}
UserMapper.xml
<select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVo" resultType="cn.itheima.pojo.User"><!--select * from user where id in (1,16,28,22)-->select * from user<where><if test="ids != null"><!--foreach:循环传入的集合参数collection:传入的集合的变量名称item:每次循环将循环出的数据放入这个变量中open:循环开始拼接的字符串close:循环结束拼接的字符串separator:循环中拼接的分隔符--><foreach collection="ids" item="id" open="id in (" close=")" separator=",">#{id}</foreach></if></where></select>
UserMapper.java
public interface UserMapper {public List<User> findUserByIds(QueryVo vo);}
VO(View Object)类
public class QueryVo {private User user;private List<Integer> ids;//省略……public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}
java测试类
public class UserMapperTest {@Testpublic void testFindUserbyIds() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);QueryVo vo = new QueryVo();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(16);ids.add(28);ids.add(22);vo.setIds(ids);List<User> list = mapper.findUserByIds(vo);System.out.println(list);}}
自定义POJO对象类:用于自动映射
//继承Orders类加入User类属性public class CustomOrders extends Orders{private int uid;private String username;// 用户姓名//省略……public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUsername() {return username;}//省略……}
POJO对象类
public class Orders {private Integer id;private Integer userId;//省略……private User user;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}//省略……public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
public class User {private int id;//省略……public int getId() {return id;}public void setId(int id) {this.id = id;}
UserMapper.xml
<!-- 一对一:自动映射 --><select id="findOrdersAndUser1" resultType="cn.itheima.pojo.CustomOrders">select a.*, b.id uid, username, birthday, sex, addressfrom orders a, user bwhere a.user_id = b.id</select><!-- 一对一:手动映射 --><!--id:resultMap的唯一标识type:将查询出的数据放入这个指定的对象中注意:手动映射需要指定数据库中表的字段名与java中pojo类的属性名称的对应关系--><resultMap type="cn.itheima.pojo.Orders" id="orderAndUserResultMap"><!-- id标签指定主键字段对应关系column:列,数据库中的字段名称property:属性,java中pojo中的属性名称--><id column="id" property="id"/><!-- result:标签指定非主键字段的对应关系 --><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/><!-- 这个标签指定单个对象的对应关系property:指定将数据放入Orders中的user属性中javaType:user属性的类型--><association property="user" javaType="cn.itheima.pojo.User"><id column="uid" property="id"/><result column="username" property="username"/><result column="birthday" property="birthday"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap><select id="findOrdersAndUser2" resultMap="orderAndUserResultMap">select a.*, b.id uid, username, birthday, sex, addressfrom orders a, user bwhere a.user_id = b.id</select>
UserMapper.java接口类
public interface UserMapper {public List<CustomOrders> findOrdersAndUser1() ;public List<Orders> findOrdersAndUser2();}
java测试类
public class UserMapperTest {private SqlSessionFactory factory;//作用:在测试方法前执行这个方法@Beforepublic void setUp() throws Exception{String resource = "SqlMapConfig.xml";//通过流将核心配置文件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);//通过核心配置文件输入流来创建会话工厂factory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindOrdersAndUser() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);List<CustomOrders> list = mapper.findOrdersAndUser1();System.out.println(list);}@Testpublic void testFindOrdersAnduUser2() throws Exception{SqlSession openSession = factory.openSession();//通过getMapper方法来实例化接口UserMapper mapper = openSession.getMapper(UserMapper.class);List<Orders> list = mapper.findOrdersAndUser2();System.out.println(list);}}