1.全局配置文件 sqlMapConfig.xml
<configuration>中
(1)properties 获取属性文件
(2)settings 开启二级缓存,延时加载
(3)typeAliases 为类起别名,或者为包中的所有类起别名
(4)environments 配置环境相关的 数据源、事务管理等
(5)mappers 配置映射文件
//类别名 sqlMapConfig.xml
<properties resource="jdbcConfig.properties"></properties>
<typeAliases>
<!-- 为单个pojo起别名
<typeAlias type="com.edu.pojos.User" alias="userInfo"/>
-->
<package name="com.edu.pojos"/> <!--为包下所有pojo类起别名,别名默认为pojo类首字母小写 -->
</typeAliases>
//映射文件 User.xml
<mapper namespace="tt" >
<select id="getUserById" parameterType="int" resultType="user">
select * from user where uid=#{uid}
</select>
</mapper>
2.映射文件 User.xml
<mapper>中
(1)cache 缓存
(2)select,update,insert ,delete元素
(3)sql片段
3.核心接口和对象
对象:SqlSessionFactoryBuilder 作用:负责构建SqlSessionFactory对象,采用建造者模式
调用build()方法,创建出 SqlSessionFactory对象后,自身失效。
接口:SqlSessionFactory 核心 作用:创建SqlSession对象
调用 openSession()方法,整个应用有效 (运行代码到关闭服务期间)
SqlSession 作用:数据库操作 (线程不安全的),所有使用时不要设置成员属性,建议在方法中使用
生命周期:一次会话(一次数据库交互)
常用方法 selectOne() selectList() selectMap()
insert() update() delete() commit()
close()
//测试
public class TestJunit1 {
private SqlSessionFactory factory;
@Before
public void initFactory() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
factory=new SqlSessionFactoryBuilder().build(in);
}
@Test
public void select() {
SqlSession session=factory.openSession();
User user=session.selectOne("tt.getUserById", 9);
System.out.println(user);
}
}
4.dao层开发
(1)传统的方式
//接口IUserDao
public interface IUserDao {
public User getUserById(int id);
public List<User> getUserByName(String name);
public List<User> getAllUsers();
public int addUser(User user);
public int updateUser(User user);
public int deleteUserById(int id);
}
//实现类
public class UserDaoImpl implements IUserDao{
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory){ //由外部注入
this.factory=factory;
}
//通过id查询用户
public User getUserById(int id) {
SqlSession session=factory.openSession();
User user=session.selectOne("tt.getUserById",id);
session.close();
return user;
}
//根据姓名模糊查询用户
public List<User> getUserByName(String name) {
SqlSession session=factory.openSession();
List<User> list=session.selectList("tt.getUserByName",name);
session.close();
return list;
}
//查询所有用户
public List<User> getAllUsers() {
SqlSession session=factory.openSession();
List<User> list=session.selectList("tt.getUsers");
session.close();
return list;
}
//添加用户
public int addUser(User user) {
SqlSession session=factory.openSession();
int res=session.insert("tt.addUser",user);
session.commit();
session.close();
return res;
}
//修改用户
public int updateUser(User user) {
SqlSession session=factory.openSession();
int res=session.update("tt.udateUser",user);
session.commit();
session.close();
return res;
}
//删除用户
public int deleteUserById(int id) {
SqlSession session=factory.openSession();
int res=session.delete("tt.delUser",id);
session.commit();
session.close();
return res;
}
}
//测试
public class Test {
public static void main(String[] args) throws IOException {
InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
SqlSessionFactory fac=new SqlSessionFactoryBuilder().build(in);
IUserDao dao=new UserDaoImpl(fac);
User user=dao.getUserById(9);
System.out.println(user);
}
}
附:log4j:log for java,用于 日志信息输出,记录
(1)导包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
(2)配置log4j属性文件 log4j.properties
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# 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
(2)dao层mapper代理方式
只需要接口,映射文件
务必遵守以下规则
(1)映射文件命名空间namespace值和接口的包名相同
(2)接口中方法名和映射文件中sql的id名相同
(2)接口中方法的参数类型要和sql中的parameterType相同
返回值类型和sql中的resultType相同
//接口
public interface IUserMapper {
public User getUserById(int id);
public int deleteUserById(int id);
}
//映射文件UserMapper.xml
<mapper namespace="com.edu.mapper.IUserMapper" >
<select id="getUserById" parameterType="int" resultType="user">
select * from user where uid=#{uid}
</select>
<delete id="deleteUserById" parameterType="int" >
delete from user where uid=#{uid}
</delete>
</mapper>
//全局配置文件
<mappers>
<mapper resource="sqlmapper/UserMapper.xml"/>
</mappers>
//测试类
public static void main(String[] args) throws IOException {
InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
SqlSessionFactory fac=new SqlSessionFactoryBuilder().build(in);
SqlSession session=fac.openSession();
//创建mapper对象
IUserMapper dao=session.getMapper(IUserMapper.class);
User user=dao.getUserById(3);
System.out.println(user);
}
5。自增主键
(1)主键是int 自动增长
insert into user(username,password,age) values('qqq','123',17);
select LAST_INSERT_ID()
<insert id="addUser" parameterType="user">
<selectKey order="AFTER" keyColumn="uid" keyProperty="uid" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,password,age) values(#{username},#{password},#{age});
</insert>
//此处order值只能是AFTER ,因为插入后,才能得到自增长值
//测试类
User u=new User();
u.setUsername("利奇马");
u.setPassword("1234");
u.setAge(18);
IUserMapper dao=session.getMapper(IUserMapper.class);
int i=dao.addUser(u);
session.commit();
System.out.println("受影响行数"+i);
System.out.println("自增长主键值"+u.getUid());
session.close();
(2)主键是varchar 36位uuid (32数字加字母 4位-)
select uuid()
<insert id="addUser2" parameterType="user2">
<selectKey order="BEFORE" keyColumn="uid" keyProperty="uid" resultType="string">
select uuid()
</selectKey>
insert into user_copy(uid,username,password,age) values(#{uid},#{username},#{password},#{age});
</insert>
//此处 order="BEFORE" 在插入之前先生成uuid , resultType="string"
// 主键列 必须insert
6.逆向工程
根据数据库中的表,反向生成java中的pojo类,映射文件,映射接口
(1)java工程,导包
mybatis-generator-core-1.3.2.jar
mysql-connector-java-5.1.28-bin.jar
(2)逆向配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
password="root">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@10.10.21.3:1521:orcl"
userId="scott"
password="tiger">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.neuedu.pojo"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.neuedu.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.neuedu.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="T_USER" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false" >
<columnOverride column="id" javaType="Integer" />
</table>
</context>
</generatorConfiguration>
(3)生成类
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.输入输出类型
解决列名和属性名不一致问题(当数据库表中的列名 和实体类的属性对应关系,)
(1)resultMap
<resultMap id="BaseResultMap" type="com.neuedu.pojo.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="birthday" property="birthday" jdbcType="DATE" />
<result column="address" property="address" jdbcType="VARCHAR" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Integer" >
select id, username, birthday, address from t_user where id = #{id,jdbcType=INTEGER}
</select>
(2)查询语句中起列别名
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Integer" >
select id as uid, username as uname, birthday, address from t_user where id = #{uid,jdbcType=INTEGER}
</select>
(1)输入parameterType: 简单类型 ,pojo ,包装pojo ,hashmap
<select id="getUserById_map" parameterType="java.util.HashMap" resultType="user">
select * from user where uid=#{id}
</select>
HashMap map=new HashMap();
map.put("id", 41);
User user=dao.getUserById_map(map);
System.out.println(user);
(2) 输出类型 resultType:简单类型 ,pojo ,包装pojo
resultMap: map
<select id="user_login" parameterType="user" resultMap="aa">
select * from user where username=#{username} and password=#{password}
</select>
<resultMap type="user" id="aa">
<id column="uid" property="uid"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap>
//接口中方法
public User user_login(User user);
//测试
User user=new User();
user.setUsername("中国人");
user.setPassword("qaz");
User res=dao.user_login(user);
System.out.println(res);
<select id="user_login2" parameterType="user" resultMap="bb">
select * from user where username=#{username} and password=#{password}
</select>
<resultMap type="UserResultMapPojo" id="bb">
<id column="uid" property="map.value.uid"/>
<result column="username" property="map.value.username"/>
<result column="password" property="map.value.password"/>
</resultMap>
// 此处的map是包装pojo类的成员可以自定义 ,value取map集合的值固定的
//包装pojo
public class UserResultMapPojo {
private Map<String,User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
}
//接口中方法
public UserResultMapPojo user_login2(User user);
//测试
User user=new User();
user.setUsername("中国人");
user.setPassword("qaz");
UserResultMapPojo res=dao.user_login2(user);
System.out.println(res.getMap());